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

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

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
发布了87 篇原创文章 · 获赞 213 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/buknow/article/details/104536277
今日推荐