如何使用addr2line命令定位程序出错代码所在行号

linux中或者android端使用addr2line命令定位代码出错的代码所在行,但有时候addr2line定位输出为??:?。并不能分析出哪行代码出了问题,例如,addr2line -e a.out 0x4005BDC命令。也可以使用valgrind工具运行此a.out可执行文件时获取此地址以查找内存泄漏。

addr2line - 将地址转换为文件名和行号。

addr2line常常会遇到下面的情况:

$ addr2line -e a.out 0x400442 #offset in the `__start` function
??:?
$ addr2line -e a.out 0x400536 #offset in the `main` function
hello.c:21
$ addr2line -e a.out 0x40054b -f #The last instruction of the `main` function
main
??:?

导致上面的情况主要是:

  1. 只有使用-g标志生成的代码段(这意味着该段具有调试信息)才能成功生成文件名和亚麻码信息。
  2. 并非所有使用-g标志编译的函数体的偏移量都将成功输出文件名和亚麻布。偏移量是函数指令之后的最后一条指令,但我们无法获取信息。
  3. 编译时不用使用-s标志,这个标志会去掉debug信息

因此,如果使用addr2line定位出so库出错的行不会输出??:?,需要在编译的时候加上-g选项 

 上面是报错的信息,下面通过NDK的addr2line工具定位代码出错所在行

结果发现是ocrnative.cpp的第115行出错导致的。 

 

参考:https://www.thinbug.com/q/7648642

           https://www.thinbug.com/q/5314036

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值