红联Linux门户
Linux帮助

Linux下core dump调试--gdb

发布时间:2016-09-09 10:05:54来源:linux网站作者:w1019220367
在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模式运行的。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24008.html