通常情况下core dump包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。
core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中。
如何使用core文件?
gdb -c core文件路径 [应用程序的路径]
进去后输入where回车,就可以显示程序在哪一行当掉的,在哪个函数中。
coredump可以用在很多场合,使用Linux,或者solaris的人可能都有过这种经历,系统在跑一些压力测试或者系统负载一大的话,系统就hang住了或者干脆system panic。这时唯一能帮助你分析和解决问题的就是coredump了。
为什么没有core文件生成呢?
有时候程序down了,但是core文件却没有生成。core文件的生成跟你当前系统的环境设置有关系,可以用下面的语句设置一下,然后再运行程序便成生成core文件。
ulimit -c unlimited
core文件生成的位置一般于运行程序的路径相同,文件名一般为"core.进程号"。
造成程序coredump的原因
很多,这里根据以往的经验总结一下:
1. 内存访问越界
a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
2. 多线程程序使用了线程不安全的函数。
应该使用下面这些可重入的函数,尤其注意红色标示出来的函数,它们很容易被用错:
asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)
3. 多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump。
4. 非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。
5. 堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
原文地址:http://www.kklinux.com/html/linuxwangluojishu/linuxxitongguanliyuan/200907/11-5860.html
分享到:
相关推荐
标题《Coredump简介及使用》和描述《Android Coredump简介及使用_v1.0_***.pdf》揭示了文档主要介绍Coredump的基本概念、产生的原因、控制产生Coredump的方法以及如何使用Coredump文件。Coredump机制广泛存在于多个...
#### 一、Core Dump简介 在Linux环境下,当一个程序因为某种原因(如段错误)而崩溃时,系统可以自动为该程序创建一个名为“core dump”的文件。这个文件包含了程序崩溃时内存的快照,可用于后续分析问题的原因。在...
【核心 dump 文件(Core Dump File)详解】 在 IT 领域,当一个程序异常终止时,操作系统可能会生成一种特殊类型的文件,称为“核心 dump”或“core dump”文件。这个文件记录了程序崩溃时内存中的状态,包括进程的...
Core Dump 的简介和原因 Core Dump 是一个包含了程序运行时的内存、寄存器状态、堆栈指针、内存管理信息等的文件。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个 Core ...
- 在gdb中加载core dump文件的命令格式为:`gdb [可执行文件路径] [core dump文件路径]` 2. **内存泄漏检测**: - 结合nbase工具,可以深入分析内存分配情况,识别潜在的内存泄漏问题。 #### 四、nbase内存打印...
1. **设置core dump大小**:默认情况下,Linux系统可能禁止生成core文件,或者限制其大小为0。可以通过编辑`/etc/security/limits.conf`文件或使用`ulimit -c unlimited`命令来允许生成无限制大小的core文件。 2. **...
Linux上CoreDump文件的形成和分析 Core Dump是在Linux系统中当程序崩溃时生成的一个内存快照文件,用于诊断导致程序崩溃的原因。本文介绍了Core Dump的基本概念及其在Linux中的控制方式: - **控制方式**: - 修改...
为了解决这类问题,开发者通常需要借助一种名为“核心转储”(Core Dump)的技术,它能够记录程序运行时的内存状态,包括变量值、堆栈信息等,从而帮助分析问题的原因。本文将详细介绍一款名为"Core Dumper Ver1.2...
通过查看Core Dump信息,开发者可以了解到程序崩溃时的内存状态、寄存器值等重要信息,从而更快地定位问题所在。 综上所述,BVRDE不仅为Windows平台上的开发者提供了强大的远程调试功能,还通过其直观易用的图形...
- 使用`gdb <executable> core`来调试core dump。 14. **远程调试**: - GDB支持远程调试,通过网络连接到目标系统进行调试。 15. **多线程调试**: - 管理和切换线程,查看每个线程的状态,使用`thread`命令。...
- 当遇到难以复现的错误时,可以通过保存core dump(使用`ulimit -c unlimited`设置),再用GDB加载core dump进行后分析。 - 掌握GDB的宏命令和脚本功能,可以自动化一些重复性高的调试任务,提高工作效率。 GDB...
这些选项可以通过组合使用,例如,设置值为`0x203`意味着生成一条日志消息、创建一个core dump文件以及使服务器崩溃。 #### 3. 证据收集—AF Files AF文件不仅记录了系统错误的基本信息,还包括了大量的调试数据和...
- **简介**:`/var/adm/crash/coredump` 文件夹包含系统崩溃时生成的核心转储文件。这些文件可以帮助系统管理员诊断导致系统崩溃的根本原因。 - **用途**: - 诊断系统崩溃原因。 - 分析内存故障。 - 预防未来的...
【.NET Core 简介】 .NET Core 是一个开源、跨平台的开发框架,用于构建桌面、Web、云和移动应用。它支持Windows、macOS以及Linux操作系统,且能够利用.NET Core SDK进行开发。.NET Core 包含了运行时、框架和库,...
通过 `gdb <your_program> <core_dump_file>` 打开core dump,然后使用 `bt` 查看堆栈,可以有效地分析错误原因。 8. **学习资源** 对于GDB的深入学习,可以通过官方文档、在线教程、论坛和书籍获取更多知识,例如...
- `core_dump_dest = C:\oracle\product\10.1.0\admin\+ASM\cdump`:指定core dump文件的存储位置。 - `user_dump_dest = C:\oracle\product\10.1.0\admin\+ASM\udump`:指定用户产生的dump文件的存储位置。 3. **...
- **Coredump分析**:分析Coredump文件以定位导致程序崩溃的原因。 ##### 14.2 Messages - **日志分析**:查看系统日志文件(messages)来追踪问题发生的上下文。 ##### 14.3 GDB - **GDB调试**:使用GDB调试...