本文将介绍coredump文件的生成及使用coredump文件定位错误的方法。
1 Coredump
Coredump是什么?
Coredump,即"核心转储",是当程序运行过程中发生异常时,操作系统将程序的内存、寄存器等关键信息保存下来的一种文件。
通过分析这个文件,我们可以了解到程序在崩溃时的详细状态,从而找到问题的根源。
Coredump名称的由来
Coredump这个名称源自早期制造内存的材料,叫做Core。
当程序在运行过程中发生错误并异常退出时,操作系统会将当前进程的内存快照以及一些关键的程序运行状态dump到一个文件中。因此,这个文件被称为Coredump。
产生Coredump的情况
在Linux系统中,信号和coredump有密切的关系。当一个进程发生错误或异常,例如内存越界访问等行为时,系统会产生一个信号(singal),并将这个信号发送给对应的进程。
对每种信号,都有默认的异常处理操作,包括忽略信号(Ign)、暂停进程(Stop)、终止进程(Term)、终止并产生Coredump(Core)。
其中,一些特定的信号,如SIGSEGV**(段错误)、SIGABRT**(通常是无法恢复的严重错误)****等,默认的异常处理操作是Core,即将程序的内存状态转储到Coredump文件中。
总的来说,信号是对进程运行异常情况的通知,而Coredump则是进程在收到特定信号后,由操作系统保存的一种详细的错误状态记录。
2 Coredump使用示例
- 首先,创建一个名为corerdump_example.c的C程序,其中包含明显的段错误,内容如下:
$ vim coredump_example.c
#include "stdio.h"
int main(int argc, char** arv) {
int *p = NULL;
*p = 1;
return 0;
}
- 使用gcc编译
$ gcc -g coredump_example.c -o coredump_example
注意这里使用-g选项表示生成调试信息。这样在程序出现错误时,可以使用gdb等调试工具进行源代码级别的调试。
- 启用Corerdump
系统默认不开启Corerdump。使用ulimit -c命令可以查看当前Corerdump是否生效。
$ ulimit -c
0
结果为0,表示当前未开启Corerdump。可以使用如下命令设置不限制的core文件大小,开启Corerdump。
$ ulimit -c ulimited
$ ulimit -c
ulimited
- 运行程序示例
$ ./coredump_example
Segmentation fault (core dumped)
可以看到发生Segmentation fault,即段错误。core dumped表示已输出core文件。
- 使用gdb进行调试
$ gdb coredump_example core
可以看到程序在第5行发生错误。关于gdb调试的资料可以参考《C/C++代码调试的艺术》。