linux codedump调试

codedump介绍

在linux下开发时,如果程序突然崩溃了,也没有任何日志。这时可以查看core文件。从core文件中分析原因,通过gdb看出程序挂在哪里,分析前后的变量,找出问题的原因。

Core Dump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

相关设置
如果没有进行core dump 的相关设置,默认是不开启的。可以通过ulimit -c查看是否开启。如果输出为0,则没有开启,需要执行ulimit -c unlimited开启core dump功能。

core生成路径

core文件的名称和生成路径:
没有进行设置的话,默认生成的core文件不带其它任何扩展名称,全部命名为core。新的core文件生成将覆盖原来的core文件 。 可对core文件的名称和生成路径进行相关配置,如下:

/proc/sys /kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的 core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。

proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。

调试core文件

按照上面的步骤设置好了之后,当我们的程序发生coredump崩溃时,就会在我们上面设置的路径下按照设置的文件命名格式生成core文件,使用gdb调试core文件,先进到刚才设置的core文件路径下,使用命令开始调试

gdb [exec file] [core file]          // [exec file]为你需要调试的程序的路径,[core file]为coredump问件名

进入gdb中后可以使用命令 bt 查看堆栈信息,gdb可以直接指出是在代码的哪一行发生了崩溃
在这里插入图片描述
如果你的程序引用了一些第三方的库,程序是崩溃在第三方库中,也可以用gdb查看是库中哪里发生了崩溃。使用命令 info sharedlibrary 查看gdb加载了哪些库,使用命令 set solib-search-path + 库文件的路径 加载你使用的第三方库
在这里插入图片描述
加载完第三方库之后,再使用 bt 命令就可以查看到第三方库中崩溃在哪一个文件的哪一行。

使用命令 info threads 可以查看所有线程正在运行的指令信息
使用命令 thread apply all bt 打开所有线程的堆栈信息。

查看指定线程堆栈信息:threadapply threadID bt ,如:thread apply 5 bt 查看线程ID为5的线程信息。

GDB 常用操作

上边的程序比较简单,不需要另外的操作就能直接找到问题所在。现实却不是这样的,常常需要进行单步跟踪,设置断点之类的操作才能顺利定位问题。下边列出了GDB一些常用的操作。

启动程序:run
设置断点:b 行号|函数名
删除断点:delete 断点编号
禁用断点:disable 断点编号
启用断点:enable 断点编号
单步跟踪:next 也可以简写 n
单步跟踪:step 也可以简写 s
打印变量:print 变量名字
设置变量:set var=value
查看变量类型:ptype var
顺序执行到结束:cont
顺序执行到某一行: util lineno
打印堆栈信息:bt

solib-absolute-prefix、solib-search-path

solib-absolute-prefix设置的是被搜索文件路径的前缀,solib-search-path设置的是被搜索文件的路径。
solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。
solib-absolute-prefix 和solib-search-path是 gdb比较常用的选项,用来设置符号文件的位置。
那么,它们有什么区别呢?
solib-absolute-prefix设置的是被搜索文件路径的前缀,solib-search-path设置的是被搜索文件的路径。
solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值