Osheep

时光不回头,当下最重要。

NDK调试arm-linux-androideabi-addr2line工具的使用

作用

arm-linux-androideabi-addr2line看工具名称就知道是将内存地址转换成行号,具体点就是根据so库抛出的Error日志的中内存地址,找到具体是在那个文件的哪一行出现的该错误。

环境

Windows7-x64 + Android Studio2.2+

环境变量配置

配置arm-linux-androideabi-addr2line环境变量,工具所在目录:ndk目录下的toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin,版本可能不一样(此步骤可以省略,当然不配置的话,每次命令行工具都得切换到该工具目录下才可运行)

实例

某次开发ndk发生如下错误,我想知道具体是在哪个源文件的哪一行发生的:
《NDK调试arm-linux-androideabi-addr2line工具的使用》

这里写图片描述
这个时候就可以使用arm-linux-androideabi-addr2line工具进行定位
命令格式:
arm-linux-androideabi-addr2line -e 需要调试的so库路径 内存地址
比如定位上图发生的这个错误:
    内存地址为:00002c6f

所以在命令行工具运行:

arm-linux-androideabi-addr2line -e
F:\workspace\FFmpegDemo\app\build\intermediates\cmake\debug\obj\armeabi\libffmpeg-lib.so 00002c6f

控制台输出:
F:\workspace\FFmpegDemo\app\src\main\cpp/ffmpeg-media.c:223

【有图有真相】

《NDK调试arm-linux-androideabi-addr2line工具的使用》

这里写图片描述

我们可以看到错误的位置位于ffmpeg-media.c源文件的223行。
tips:本示例这里发生这个错误是由于JNI中使用多线程没有把需要跨线程访问的类对象定义成全局引用而造成的。

需要注意的地方

本示例是在Windows7下Android Studio中使用cmake编译打包的so库,默认输出so库的位置位于项目下
xxx\app\build\intermediates\cmake\debug\obj\armeabi目录,如果实在Linux中使用该命令需要把\转换成/ 
在Windows中经过实验转不转换都可以。
点赞