当程序出现段错误时,系统会生成core文件,调试core文件可以帮助快速找到错误代码。
话不多说,直接上截图。
对于一段会产生段错误的代码:
#include <stdio.h>
void aa(int x)
{
int *p;
*p = x; // 操作一个野指针,访问非法内存 -> 段错误
}
int main()
{
aa(13);
return 0;
}
1.生成gdb文件
gcc编译时需要添加-g参数,以生成可供gdb调试的可执行文件
2.生成core文件
通过运行ulimit -a,可查看core文件限制为0(不允许生成)
此时 ,我们需运行ulimit -c unlimited或者ulimit -c 字节数来修改生成core文件的限制。
仍然不够,我们还需要修改core文件的路径:
sudo sysctl kernel.core_pattern=PATH-%p-%t
(最后加上的参数表示文件名包括进程号和时间)
现在,我们就可以在当前目录下生成core文件了,执行可执行文件并查看目录:
3. gdb调试core文件
执行gdb 可执行文件名 core文件名命令
出现:
可以看到,gdb显示了段错误发生的地方,即源文件core_dump.c文件的第6行。
还可以通过bt命令查看函数调用栈:
可以看到栈顶是aa()函数,栈底是main()函数,一览无余。