NDK調試arm-linux-androideabi-addr2line工具的使用

作用

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)過實驗轉不轉換都可以。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容