Linux下core dump调试--gdb

在Linux下,程序崩溃时会产生core文件,记录错误信息--------即core dump

一、core文件产生

默认情况下,core dump是关闭的。输入ulimit -c,查看存储core文件的大小,显示0,即不会产生core文件。

设置core文件大小为某一不为零的值,即可自动产生core文件:

指令:ulimit -c unlimited 

(对于core文件,有时候崩溃,产生的文件大小会比较大,不好为其制定一个具体的数值,因此直接设置大小为无线大。若要指定大小值,将unlimited换为部位0的值即可,如:ulimit -c 1024,此处的1024应该是1024字节)

到此,当程序挂掉的时候,便会在程序同级目录下,产生一个core文件。想要每次产生的文件名不同或者存储位置修改到别的地方,需要在做一些设置,详情就百度吧

这种方式,好像只能是从终端中启动程序。IDE启动程序,是否会产生core文件,待试。


二、gdb调试

进入 程序和core所在的目录,

gdb ./app core (也可以不进来,或者两个不再统一目录也可以,软件和core文件给出相对或者绝对的路径,保证能找到即可)

此时,便会出现错误的原因,打印的东西太多,这里之贴出最后的错误部分,如下:

Core was generated by `./tonav --image /wide_stereo/left/image_rect --camerainfo /wide_stereo/left/cam'.
Program terminated with signal SIGABRT, Aborted.
#0  0x00007fd05dc8fc37 in __GI_raise (sig=sig@entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56	../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

接下来,可以对该错误进行跟总调试:

(gdb) bt   

进入跟踪调试模式,显示结果:

#0  0x00007fd05dc8fc37 in __GI_raise (sig=sig@entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007fd05dc93028 in __GI_abort () at abort.c:89
#2  0x00007fd05e59a535 in __gnu_cxx::__verbose_terminate_handler() ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007fd05e5986d6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007fd05e598703 in std::terminate() ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007fd05e598922 in __cxa_throw ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x0000000000505a6c in Calibration::fromPath(boost::filesystem::path) ()
#7  0x0000000000550b32 in TonavRos::run(int, char**) ()
#8  0x000000000050183e in main ()
列出来的就是引发该错误的地方从最底层到最上层文件的顺序。

(gdb) up 6       

进入丢6个文件中的错误地方。

然后,通过指令 l 可以看到源代码。前提是程序是以debug模式运行的。





你可能感兴趣的:(Linux)