当前位置:C++技术网 > 精选软件 > Linux使用coredump文件调试系列:2 编译可产生coredump文件的程序并测试

Linux使用coredump文件调试系列:2 编译可产生coredump文件的程序并测试

更新时间:2018-12-05 17:19:08浏览次数:1+次

    我们在《Linux使用coredump文件调试系列1-设置生成coredump文件》中已经讲解了如何去设置生成coredump文件。设置好了之后,我们现在来编写一个测试程序,让这个程序可以产生coredump文件。
    要产生coredump文件,需要具备几个条件:
1.开启了coredump支持,系统才会去生成这个文件
    这是系列1文章里讲解的内容。如果没有设置好,是没有办法生成的。
2.需要编译的程序带有-g标志去主动告诉系统要产生
    如果正常编译如:

gcc test.c -o test
    这样是不会产生coredump文件的。尽管系统允许产生,你不产生,那也是不会产生的。这是你情我愿的事情,需要双方都来电。要产生coredump文件,我们只要加入-g标志就行了,如下:
gcc -g test.c -o test
3.程序需要遇到会崩溃的代码才会产生
    一个正常运行的程序,没有遇到任何错误,当然也不会产生的。所以如果要产生coredump文件,我们就需要主动写一个这样的代码。那么有哪些代码会产生崩溃呢?一般也就是内存非法访问、内存越界、其他错误等等。

    好了,三个条件都具备,就可以产生coredump文件了。
    下面给大家一段测试代码:

#include <stdio.h>
void b()
{
int a;
scanf("%d",a);
}
void go()
{
b();
}
int main()
{
go();
return 0;
}

    这段代码中,scanf接收的a缺少&,会导致一个崩溃。你也可以使用内存越界,空指针读写等。加这么多层函数,就是要看看最后coredump调试出来能不能看到多级堆栈信息。然后我们用-g选项来编译代码,生成可执行文件test。我们再交互中输入一个数字,就会产生崩溃。崩溃之后,我们去目录/data/corefile/下看是否有文件产生。我这里测试是产生了coredump文件了。

    那么到此为止,如果你完全按照步骤一个个做好,是可以产生coredump文件的。那么以后你线上运行的程序,如果要让它产生这个文件,需要重新加-g标志编译哦。有了这个文件,我们后续出问题就可以快速找到问题所在。如何快速调试coredump文件,请阅读《Linux使用coredump文件调试系列3-使用GDB调试coredump》。