什么是Core Dump?
Core Dump是当进程异常终止时(比如内存访问出错)操作系统生成的一个文件(通常叫"core"),记录了该进程终止时的内存映像及此时CPU的状态(处理器寄存器等)。之所以叫core是因为计算机历史上在DRAM技术出现之前最流行的内存技术就叫core(由王安发明)。它的主要作用是调试程序。根据 core dump记录的信息,我们可以快速定位是程序的哪个地方出了错误,然后仔细分析代码以排除错误。
怎样产生Core Dump?
在Linux系统下,用ulimit命令可以查看和设置是否产生core文件。"ulimit -c"的输出若是0,则不产生core文件。"ulimit -c filesize"设置产生core文件的大小(单位 kB),或"ulimit -c unlimited"产生core文件,大小无限制。若设置core文件的大小,产生的core文件有可能被截断。用"ulimit -c 0"可以禁止产生core文件。
core文件默认保存在进程的当前目录中,文件名默认为core
。不过这些都可以设置,具体查看core(5)。例如,为了防止core文件被后来的core文件覆盖,
给core文件加上 PID。 echo 1 > /proc/sys/kernel/core-uses-pid
怎样使用Core Dump调试?
- 假设源文件名为test.c。编译该文件,注意加入调试信息(gcc -g选项)。
$ gcc -g test.c
- 运行该程序,产生Core Dump(假设core文件名为
core
)。
$ ./a.out Segmentation fault (core dumped)
- 用gdb查看core文件以定位错误。
$ gdb ./a.out core
由于编译时加入了调试信息,此时应该可以看到是哪条语句导致了错误,用where命令可以查看调用栈以确定错误的根源。
参考文献
- Core Dump, Wikipedia.
- core(5)
- gdb(1)