1. Core Dump 文件的概念
Core Dump文件(核心转储文件),就是当一个进程异常终止时,可以选择将进程的用户空间内存数据全部保存在磁盘上,文件名通常为core。进程异常终止是因为程序有bug,比如非法访问内存,事后可以用gdb调试检查core文件以查清错误原因,这叫做Post-moriem-Debug(事后调试),一个进程允许产生多大的core文件取决于Resource Limit(这个信息保存在PCB中)。默认情况下是不允许产生core文件的,因为core文件可能包含用户密码等数据安全。
2. Core Dump文件简单介绍
一般程序崩溃时的程序信息会保存在Core文件中,可以通过sysctl/proc来设置Core文件的文件名及文件路径。一般的core dump文件为ELF格式,其内容包括程序运行时内存,堆栈指针,寄存器状态,内存管理信息等。core dump文件可以用于许多场合,比如使用Linux跑一些压力测试时系统负载会加大,系统就hang住了或者system panic。这时唯一能帮助你分析问题的就是Core Dump文件。
3. Core文件相关命令
(1) 修改/proc/sys/kernel/core_pattern文件,此文件用于控制Core文件产生的文件名,默认情况下,此文件内容只有一行内容:“core”,此文件支持定制,一般使用%配合不同的字符
%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t 出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名
(2)使用 Ulimit 命令
Ulimit –C命令,此命令可以显示当前OS对于Core文件大小的限制,如果为0,则表示不允许产生Core文件。如果想进行修改,可以使用:
Ulimit –c n
其中n为数字,表示允许Core文件体积的最大值,单位为Kb,如果想设为无限大,可以执行:
Ulimit -c unlimited
4. Core Dump文件类型
使用readelf -h 查看
可以看到,core 文件为ELF型,可以利用gdb 调试。
6. 产生Core Dump文件的原因
内存访问越界
(1) 由于使用错误的下标,导致数组访问越界
(2) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
(3) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
多线程程序使用了线程不安全的函数。
线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump.
非法指针
(1)使用空指针
(2)随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.
堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
操作系统操作的特殊性
(1)字节对齐方式引起的程序核心转储。
(2)与程序编译时的链接参数不正确而导致程序运行在反复操作大内存时出现核心转储。