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
??:?
导致上面的情况主要是:
- 只有使用
-g
标志生成的代码段(这意味着该段具有调试信息)才能成功生成文件名和亚麻码信息。 - 并非所有使用
-g
标志编译的函数体的偏移量都将成功输出文件名和亚麻布。偏移量是函数指令之后的最后一条指令,但我们无法获取信息。 - 编译时不用使用-s标志,这个标志会去掉debug信息
因此,如果使用addr2line定位出so库出错的行不会输出??:?,需要在编译的时候加上-g选项
上面是报错的信息,下面通过NDK的addr2line工具定位代码出错所在行
结果发现是ocrnative.cpp的第115行出错导致的。