概述
在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下core dump调试--gdb的全部内容,希望文章能够帮你解决Linux下core dump调试--gdb所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复