参考:https://blog.csdn.net/jiange_zh/article/details/51009984?spm=1001.2014.3001.5506
1. gdb core dump的作用
这要分三个方面来理解。gdb是指一个调试器,通常在linux下调试程序。core是指一个文件,该文件是程序运行发生内存段错误时产生的一个文件,保留了内存调用的一些信息。dump是gdb下的一个调试内存调用的命令。
所以这三个单词结合起来的意思就是gdb调试内存错误(个人理解)
2. 使用步骤简介
2.1 打开Linux下生成core文件的功能
ulimit -c unlimited
这个命令只对当前窗口有效,重启后就失效。
生成的日志文件默认叫core,保存在程序运行窗口。
要想重启后也生效,如下设置:
vim /etc/security/limits.conf
# 去掉 soft core 0 一行前面的注释 并将0改为 unlimited;或者指定大小,单位kb,如1024kb
2.2 编写一个测试代码
/**
* @file test_core_dump.cpp
*/
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int *p=0;
*p = 0x1234;
cout<<"*p="<<*p;
return 0;
}
简单编译,运行
g++ test_core_dump.cpp -o test_core_dump
./test_core_dump
运行后输出如下错误
Segmentation fault (core dumped)
可以看到倒数第2行(gdb)上面已经显示了错误在main()函数里面,但是没有行号和文件名。
因为编译的时候少了一个参数-g。重新编译后,再用gdb调试结果如下。
2.3 将生成的core文件指定在某一个目录
在/etc/sysctl.conf文件末尾添加下面一行:
kernel.core_pattern=/tmp/core-%e
这样生成的core文件就在/tmp目录,文件名包含是进程名。
然后运行如下命令:
sysctl -p /etc/sysctl.conf