Linux应用程序发生Segmentation fault段错误时,如何利用core dump文件定位错误呢?
在 Linux 系统中,常将“主内存”称为核心(core
),而核心映像(core image
) 就是 “进程”(process)执行当时的内存内容。当进程发生错误或收到“信号”(signal) 而终止执行时,系统会将核心映像写入一个文件,以作为调试之用,这就是所谓的核心转储(core dump
)。
每当一个进程崩溃时,会在指定路径下生成core文件,我们可以访问core文件来对程序的崩溃进行定位和调试。
core问价默认是没有打开的,可以使用一下命令打开core问价的生成:
ulimit -c unlimited
以上是不限制core文件大小的命令,只要有足够的磁盘空间,就会转存程序的全部内存。如果需要限制系统产生core的大小,可以使用以下命令:
ulimit -c 1000
以上设置为core文件最大1000个字节。
要把core dump功能关闭,可以把core文件设置成0
ulimit -c 0
以上这种ulimit -c unlimited只限定在当前终端,退出终端后失效,所以需要写入配置文件/etc/profile中
# 编辑 profile 文件
vi /etc/profile# 将下行加到入profile 文件中
ulimit -c unlimited
写一个导致段错误的案例代码
#include <stdio.h>
#include <stdlib.h>int main(int argc, char **argv)
{int *p = NULL;// 给一个NULL指令赋值,会产生 Segmentation fault 错误*p = 100;return 0;
}
定义了一个空指针,再给空指针赋值,会报错。
在当前文件夹下会出现一个core文件。下面就可以通过core来进行调试,使用GDB调式core的命令格式如下:
gdb <程序> <core文件>#例如
gdb hello core
可以看到程序的第9行出错。第9行变量p是一个空指针,所以产生了错误。
有的时候为什么即使报出了Segmentation fault(core dumped),但是当前路径下没有core文件呢?这是因为core文件默认生成路径不对,可以通过以下命令来查看core文件路径
cat /proc/sys/kernel/core_pattern
可以修改core文件路径,使用以下命令(需要再root权限下):
echo core > /proc/sys/kernel/core_pattern
修改后就可以生成了。