工具-addr2line的使用

1,755 阅读2分钟

遇到NE问题的时候,经常不知道错误在哪个具体模块项,即使知道错误在哪里,也不知道具体代码在哪。这里就介绍怎么去查看崩溃的so代码行

1、先介绍工具

addr2line这个工具,linux上是直接可以使用的(mac上没验证,不确定)。这里介绍下在windows上怎么使用这个工具。 前提依然是基于Android Studio,在IDE中安装好NDK的环境后,可以在这个目录下找到addr2line工具文件,注意是这个路径aarch64-linux-android-4.9:

5557c4ba-cf80-4350-821d-d9dd60d1f710.bmp

而不是这个arm-linux-androideabi-4.9 82a715b9-726a-4db5-8cf5-98e92a9150fd.bmp

否则会在后面的执行过程中报错。

2、定位可调试的so库

2.1 本地写个so可以崩溃的工程

C++代码如下,可以提前看到,这个代码会崩在12行

46e669fd-3865-4015-92f5-391c3adfa8ca.bmp

崩溃信息如下:

9ffb63d2-95bc-4579-832f-31a6ae16c9aa.bmp

2.2 查看so库崩溃的行号

aarch64-linux-android-addr2line.exe -f -C -e F:\1\libexception.so 000000000001db4c

这里的so是上面工程中生成的so,位置在这里,这个so是可调试的:

140990d6-ad88-4da5-aba8-ab96834046dc.bmp

运行结果如下:

bbf21e4f-4e9e-4ed9-8823-594161c2d9a7.bmp

此时可以明确的知道,代码崩在native_lib.cpp的第12行。其实这个结果在上面的崩溃堆栈里面基本上已经可以定位到是在这个方法Java_com_ne_exception_MainActivity_stringFromJNI里面了

3、无法调试的so库

我们有时候会遇到这样的一个崩溃信息,webview相关,并且属于NE的(当然,把上面例子的apk作为release输出时,那个so也是无法调试的,跟下面的问题一样)

2379e5cf-d372-4cde-b02b-54d3a577abf5.bmp

使用上面的命令查看崩溃代码行号,结果如下:

9521bca2-3277-46f6-b416-17350e95f180.bmp

这个其实是无法查看具体行号的,依然需要找到真正的可调试so文件,才能定位到信息。

这时候只能拿到可以调试的so文件去查看代码行号才可以

遇到其他SDK里面的so怎么办呢?

这时候需要借助IDA Pro这些工具去反汇编so文件,然后再去进行调试,这里太复杂,目前功力不够,就不过多介绍了。