作用
arm-linux-androideabi-addr2line看工具名稱就知道是將內存地址轉換成行號,具體點就是根據(jù)so庫拋出的Error日志的中內存地址,找到具體是在那個文件的哪一行出現(xiàn)的該錯誤。
環(huán)境
Windows7-x64 + Android Studio2.2+
環(huán)境變量配置
配置arm-linux-androideabi-addr2line環(huán)境變量,工具所在目錄:ndk目錄下的toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin,版本可能不一樣(此步驟可以省略,當然不配置的話,每次命令行工具都得切換到該工具目錄下才可運行)
實例
某次開發(fā)ndk發(fā)生如下錯誤,我想知道具體是在哪個源文件的哪一行發(fā)生的:
這里寫圖片描述
這個時候就可以使用arm-linux-androideabi-addr2line工具進行定位
命令格式:
arm-linux-androideabi-addr2line -e 需要調試的so庫路徑 內存地址
比如定位上圖發(fā)生的這個錯誤:
內存地址為: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:本示例這里發(fā)生這個錯誤是由于JNI中使用多線程沒有把需要跨線程訪問的類對象定義成全局引用而造成的。
需要注意的地方
本示例是在Windows7下Android Studio中使用cmake編譯打包的so庫,默認輸出so庫的位置位于項目下
xxx\app\build\intermediates\cmake\debug\obj\armeabi目錄,如果實在Linux中使用該命令需要把\轉換成/
在Windows中經(jīng)過實驗轉不轉換都可以。