再记录一个Linux查找段错误的利器——addr2line命令

30 篇文章 3 订阅
11 篇文章 0 订阅

通过这个命令,可以将函数地址解析为函数名,并确定地址的行数。

Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。

 

所以当有段错误的时候, 通过地址偏移量或者地址直接定位错误所在位置。使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。

1.如果是只有可执行文件,出现段错误,例如程序test的段错误的堆栈信息如下:

backtrace:
    #00  pc 0000cb70  /system/lib/libutils.so (android::RefBase::incStrong(void const*) const+1)
    #01  pc 00026cb3  /system/bin/newcdr

可以用下面这个命令:

addr2line -C -f -e  newcdr 00026cb3  命令查看出错位置。

$ addr2line -C -f -e  test 00026cb3
EventManager::init(bool)
/home/liubin/allwinner/a20_liubin/a20_cdr_stable/camdroid/device/softwinner/pluto-tf118kd-t1b/newcdr/src/event/EventManager.cpp:338

 

2.如果段错误发生在动态库中,那么因为加载动态库的地址不一定是一样的,这时用到地址偏移量。例如:

backtrace:
/home/xsok5/bin/libTH32.so(pdc_write+0x4a)[0x7f04035cd3aa]
/home/xsok5/bin/libTH32.so(pdf__save+0x37)[0x7f0403585347]
/home/xsok5/bin/libTH32.so(pdf_place_xobject+0xd8)[0x7f040358aa88]

这是截取的一部分堆栈地址信息:

Memory map:
7f040346c000-7f04037d5000 r-xp 00000000 08:05 131652 /home/xsok5/bin/libTH32.so

 利用上述两段信息,可以看出来,本次加载中libTH32.so的起始地址是0x7f040346c000,最终段错误发生的位置是0x7f04035cd3aa,相减得到偏移量:0x1613AA。那么可以用下面的命令获取函数名和具体文件中的行数。

addr2line 1613AA -s -C -f -e libTH_OCR32.so

$ addr2line 1613AA -s -C -f -e libTH_OCR32.so 
pdc_write
pc_output.c:524

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值