NDK调试arm-linux-androideabi-addr2line工具的使用
2017-08-18 15:38
1761 查看
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发生如下错误,我想知道具体是在哪个源文件的哪一行发生的:
这个时候就可以使用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
【有图有真相】
我们可以看到错误的位置位于ffmpeg-media.c源文件的223行。
tips:本示例这里发生这个错误是由于JNI中使用多线程没有把需要跨线程访问的类对象定义成全局引用而造成的。
需要注意的地方
本示例是在Windows7下Android Studio中使用cmake编译打包的so库,默认输出so库的位置位于项目下 xxx\app\build\intermediates\cmake\debug\obj\armeabi目录,如果实在Linux中使用该命令需要把\转换成/ 在Windows中经过实验转不转换都可以。
相关文章推荐
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 【摘录】使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- android或linux调试addr2line工具锁定命令的使用
- 如何使用arm-linux-androideabi-addr2line
- ndk工具使用之arm-eabi-addr2line 【转http://www.2cto.com/kf/201207/140136.html】
- Android或Linux调试addr2line工具锁定命令的使用
- Android或Linux调试addr2line工具锁定命令的使用
- Android或Linux调试addr2line工具锁定命令的使用
- android或linux调试addr2line工具锁定命令的使用
- 如何使用arm-linux-androideabi-addr2line 【转http://blog.csdn.net/hun_sunny/article/details/8350151】
- arm-eabi-addr2line android应用崩溃的调试方法
- arm-linux-androideabi-addr2line android 崩
- Android NDK so crash,定位目标代码使用 arm-linux-androideabi-addr2line
- arm-eabi-addr2line android应用崩溃的调试方法
- ndk工具使用之arm-eabi-addr2line
- arm-eabi-addr2line工具跟踪Android调用堆栈
- arm-linux-androideabi-addr2line android定位CRASH问题利器
- Android 调试中 addr2line 工具的使用