addr2line定位程序崩溃位置_铽可喏_新浪博客

本文介绍了一种使用dmesg和addr2line等工具定位程序崩溃原因的方法。通过具体实例演示了如何从崩溃提示中获取IP地址,再利用readelf确认该IP属于程序范围,并最终定位到崩溃的具体代码行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例子默认调试用的可执行程序为hello

源码 hello.cpp 如下:

1 int main()

2 {

3    int b = 0;

4    int g_a = 10/b;

5    printf("end test \n");

6    return 1;

7 }

编译程序:g++ -g -O0 hello.cpp -o hello,得到可执行程序hello,执行hello后,程序崩溃。提示如下:

Floating point exception (core dumped)

 

定位崩溃位置方法如下:

1.执行命令“dmesg | tail”,找到程序崩溃的IP。可找到如下输出信息: [

37241.152574] traps: hello[25803] trap divide error ip:40053b sp:7ffc03816e50 error:0 in hello[400000+1000] 

以上信息可看出,hello崩溃的位置的IP为40053b

 

2.执行命令 “readelf -l ./hello”,找到第一个LOAD信息,可看到属性为RE,VirAddr为起始地址0x40 0000,大小为MemSiz 0x071c。  说明程序的范围是在0x40 0000 和0x40 071c之间,第1步找到的ip 0x40053b位于这个范围内,说明是可执行程序本身崩溃的。

Type           Offset             VirtAddr           PhysAddr                 FileSiz            MemSiz              Flags  Align 

LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000                 0x000000000000071c 0x000000000000071c  R E    200000 

LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10                 0x0000000000000228 0x0000000000000230  RW     200000


3.执行命令“addr2line -e  ./hello 0x40053b”,0x40053b为第1步定位到的ip值。可定位到程序崩溃位置如下:

/home/linting/Projects/tmp/hello.cpp:4


另外:如果用gdb调试,info registers可看到esp寄存器中存着的上一级调用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值