core文件生成与查看

在Unix/Linux下,当程序异常退出时,一般会生成core文件记录错误相关信息,便于事后分析。

core文件路径与名称

如果只想临时生效,用echo命令改写文件内容即可,例如:

echo "1" >/proc/sys/kernel/core_uses_pid
echo "/tmp/core/core.%p" >/proc/sys/kernel/core_pattern

若要永久保存,可用sysctl命令,格式为:sysctl -w name=value,例如:

sysctl -w kernel.core=/tmp/%e.core.%p

下面是个会产生段错误的示例代码:

#include <string.h>
void foo5(char *p) {memset(p, 0, 123);}
void foo4(char *p) {foo5(p);}
void foo3(char *p) {foo4(p);}
void foo2(char *p) {foo3(p);}
void foo1(char *p) {foo2(p);}
int main() {
    foo1(NULL);
    return 0;
}

带-g参数编译运行后会产生core文件,可用gdb工具查看错误信息,由于内容较多,这里只列出关键部分。

$ gdb x core.17496 
...
Core was generated by `./x'.
Program terminated with signal SIGSEGV, Segmentation fault.
...
(gdb) bt
#0  __memset_sse2 () at ../sysdeps/x86_64/multiarch/../memset.S:78
#1  0x0000000000400548 in foo5 (p=0x0) at a.c:2
#2  0x0000000000400563 in foo4 (p=0x0) at a.c:3
#3  0x000000000040057e in foo3 (p=0x0) at a.c:4
#4  0x0000000000400599 in foo2 (p=0x0) at a.c:5
#5  0x00000000004005b4 in foo1 (p=0x0) at a.c:6
#6  0x00000000004005c5 in main () at a.c:8
Table of Contents