通过这个命令,可以将函数地址解析为函数名,并确定地址的行数。
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