core dump调试

         学习地址:http://blog.csdn.net/stpeace/article/category/3135071

        本文由上面博客地址各栏目总结而得,在这里感谢一下博主。

         core dump: 对应程序由于各种异常或者bug导致在运行过程中,并且在满足一定条件下产生一个叫做core的文件。通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。许多程序出错的时候会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息。

         说明:本文中,linux是安装在自己的虚拟机上,为了方便,直接使用的root权限,仅为示意。

         在这里先介绍一个linux命令ulimit,就是user limit,意思是与用户相关的一些限制参数。ulimit -a显示各种限制参数

         

         ulimit -c unlimited   用来设置生成core文件

         

         调试程序代码:     

 

#include<stdio.h>

int main()
{
       int *p=NULL;
       *p=0;

       printf("bad\n");
       return 0;
}

 

上述代码一看就有错误,但是在大型项目中,用肉眼就很难看了。下面说明一下linux下调试core dump方法。

先介绍2个linux命令。dmesg,一种程序,用于检测和控制内核缓冲。程序用来帮助用户了解系统的启动信息,可以获得出错堆栈地址。

addr2line,是一个可以将指令的地址和可执行映像转换成文件名,函数名或源代码的工具。这种功能将跟踪地址转换成更有意义的内容来说很有用。在调用addr2line工具时,要使用 -e选项来指定可执行映像,使用-f选项可以告诉工具输出函数名。

 

dmesg+addr2line调试:

dmesg用来找出错堆栈地址,addr2line将地址解析为代码行。上面显示代码出错行为第6行。

 

gdb调试:

gdb调试过程中,输入r,bt。r是运行a.out文件,bt查看堆栈情况。其实这里有一个小的不足,就是执行r后相当于重新运行了a.out文件。然而在实际开发中,有很多问题都是概率发生的,所以此方法不太实用。那gdb就不行了吗?答案时候NO,接着看。

上面的实验过程中,ulimit -c unlimied 在转换权限的时候忘用了,所以没有生成core.xxx文件,在用了之后会生成。

看,生成了core.xxxx文件。现在我们用gdb直接调试core.xxx文件,这样就无需重新run了,直接查看bt.。

输入:gdb a.out core.3945

 

strace+addr2line调试:

strace:用来跟踪进程执行时的系统调用和所接收的信号。实际上strace是一个集诊断,调试,统计与一体的工具。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

strace -i可以定位core地址。

执行:strace -i a.out

然后接着执行addr2line命令,找出出错行。

 

总结:本人总结了3种core调试方法和一些linux下的调试命令。

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
调试coredump时,可以使用gdb来帮助我们定位问题。首先,确保已经安装了gdb工具。接下来,使用gdb打开coredump文件,命令格式为"gdb <可执行文件路径> <coredump文件路径>"。这样就会进入gdb的调试环境。在gdb中,我们可以使用一些命令来获取关于coredump的信息和调试程序。 1. 使用命令"bt"或"backtrace"来查看函数调用栈,这可以告诉我们程序运行到crash的位置之前经过了哪些函数调用。 2. 使用命令"info registers"来查看寄存器的值,这可以帮助我们理解程序在崩溃时的状态。 3. 使用命令"print <变量名>"来查看变量的值,这可以帮助我们了解程序在崩溃时的数据状态。 4. 使用命令"list"来查看源代码,这可以帮助我们找到问题所在的具体代码位置。 5. 使用命令"run"重新运行程序,这可以帮助我们重现coredump并进行调试。 需要注意的是,在调试coredump时,有时候只能从core文件中找出崩溃的直观原因,而更深层次的原因可能需要结合代码和运行上下文来分析。因此,除了使用gdb命令来查看coredump的信息外,还需要对程序的代码进行分析,以便找到问题所在。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [gdb调试coredump(使用篇)](https://blog.csdn.net/jackhh1/article/details/124434307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

盼盼编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值