找到NativeCrash的關鍵堆棧信息
需要注意兩個關鍵信息:
- 發生crash的so文件名
- 發生crash的內存地址
以下爲截取的NativeCrash的關鍵日誌信息示例:
native: #00 pc 002da1d3 /system/lib/libart.so
native: #01 pc 0036f6ab /system/lib/libart.so
native: #02 pc 0036be4d /system/lib/libart.so
native: #03 pc 00029034 /data/app/xxx==/lib/arm/[你的so文件名].so
找到 addr2line 的位置
[你的NDK的絕對路徑]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/
目錄下,爲方便使用可配置環境變量。
我這邊是直接在zsh裏配置的別名:
- vi ~/.zshrc
- 結尾添加別名配置:
alias addr2line="[NDK的絕對路徑]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line"
- source ~/.zshrc 使配置生效
找到 crash-so 的位置
根據堆棧信息確定crash發生在哪個so文件中,並於
[你的工程目錄的絕對路徑]/[你的module名稱]/build/intermediates/cmake/debug/obj/armeabi-v7a/
目錄中找到該so文件。
執行 addr2line 指令
// 已配置別名(0x1d7ff0用你的crash-address代替)
addr2line -f -e [你的工程目錄的絕對路徑]/[你的module名稱]/build/intermediates/cmake/debug/obj/armeabi-v7a/libffmpeg-invoker.so 0x1d7ff0
// 未配置別名
[NDK的絕對路徑]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line -f -e [你的工程目錄的絕對路徑]/[你的module名稱]/build/intermediates/cmake/debug/obj/armeabi-v7a/libffmpeg-invoker.so 0x1d7ff0
介紹上面使用 addr2line 時兩個被使用的 option
- -f --functions Show function names,顯示當前行所在的函數名稱
- -e --exe= Set the input file name (default is a.out),該option後面需要跟隨分析的so文件全路徑
- 其他option可運行 addr2line --help 自行查看