程序core

core

什么是 core

core dump memory dump system dump 包含了程序在特定时候的内存状态,通常是程序 crash 或者因为其他愿意意外终止。实际上,程序状态的其他信息通常也同时被记录了下来,包括处理器寄存器(PC 和堆栈信息) ,
内存管理信息,其他处理器信息以及系统flag。 core dump 通常被用来帮组诊断和调试程序错误

core 文件所在位置

/proc/sys/kernel/core_pattern 指定了程序发生core时保存的coredump 文件路径以及命名方式
/proc/sys/kernel/core_use_pid 控制文件名末尾是否加上pid作为扩展

产生 core 文件的时候,需要设置系统的core文件大小, ulimit -c unlimited 不限制core文件大小,ulimit -c 0 可以阻止系统生成core文件

core 文件调试

gdb + 程序名 + corefile

可以看见程序在哪一个函数挂掉

如果在编译的时候加上 -g 参数, 可以看见程序在哪一行挂掉

注意事项: core 文件必需是对应的可执行文件产生的,否则符号表会对应不上

core 调试实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void do_it();
int main(){
do_it();
return 0;
}
void do_it(){
char *p = 1;
*p = 'a';
}
gcc -g test.c
./a.out 可见生成 core.{pid} 文件
然后 gdb a.out core.{pid}
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00000000004005a5 in do_it () at test.c:9
9 *p = 'a';
(gdb) bt
#0 0x00000000004005a5 in do_it () at test.c:9
#1 0x000000000040058e in main () at test.c:4

上述是网上很多人都在使用的例子,但是也给我们展示了几本的用用法,core dump 因为保存了整个内存的快照,所以其实我们能够获取到更多的信息,但是在此处就先不展开,用 gdb 应该能更方便的获取到跟多的信息

如果你觉得本文对你有帮助,欢迎打赏!