在没有get到本文介绍的技能之前的时候,以前遇到程序发生了 Segmentation fault 时,也是一筹莫展,看到伴随程序崩溃而生成的 core.xxxx 文件时(有时会生成,有时不会生成,留着下面介绍),也觉得该文件毫无用处,主要是太菜了不知道该怎么使用这样的文件。
先写一段明眼人都能看出来的含有大bug的一段代码:
#include <iostream>
int func(int *ptr)
{
int ret = *ptr;
return ret;
}
int main(int argc, char** argv)
{
int *p = nullptr;
return func(p);
}
使用下面命令,编译程序并没有报错,为了调试程序时,需要加 -g 参数;
g++ -Wall -std=c++11 -g -o test test.cpp
执行 test 可执行程序,发生 Segmentation fault,但是并没有生产 core.xxxx 这样的文件
这是因为:大多数操作系统默认情况下是不允许产生 core.xxxx 这样的文件的,因为这样的文件通常都是比较大的,怕占用了太多的磁盘空间;若是一个比较大的可执行程序,在加上多线程或多进程并行执行,如果程序崩溃,产生的 core.xxxx 文件肯定不止一个,而且单个 core.xxxx 文件也会非常大,这样会占用太多的空间,所以默认情况下是不允许产生的。
执行 ulimit -c 命令,会输出 0,表示不允许产生 core.xxxx 文件
为了调试程序的话,可以允许它暂时生成,执行 ulimit -c unlimited 设置为不受限制,再次执行 ulimit -c 则会输出 unlimited
现在执行可执行程序 test,则会输出 core.xxxx文件
现在就可以利用这个 core.xxxx 文件来帮助我们调试程序,快速定位问题了;
使用 gdb 时,需要紧跟 两个参数,一个可执行程序,一个为 core.xxxx 文件
这样就可以快速帮我们定位到程序崩溃的代码行了,正是由于对空指针解引用访问了内核地址空间,所以程序必然会崩溃。
以上只是一个简单示例代码,在实际工作中遇到类似的问题也可以借助于core.xxxx文件来快速定位问题。