ndk開發中so導致的應用crash很隱祕,在logcat中不明顯,所以令開發者手足無措,這裏介紹ndk自帶的ndk-stack,它可以dump對應的crash信息
首先你要長期使用這個工具的話我建議直接先把…\ndk-bundle添加到環境變量。
接下來我們來模擬一個c++空指針
當我們在app中調用這個方法的時候,由於env指針爲 NULL 程序會掛掉,但是查看logcat會有以下信息
從上圖可以看出是x86下的libnative-lib.so報的錯,所以我們打開終端,如下
adb logcat | ndk-stack -sym app/build/intermediates/cmake/debug/obj/x86
- adb logcat是查看log的操作
- | ndk-stack -sym;“|” 不能少,-sym是固定參數
- app/build/intermediates/cmake/debug/obj/x86 這裏必須是編譯時的build的目錄,並且是含有obj目錄的那個,pc模擬器基本都是x86的abi,真機的話就是arm的比較多,還有我這用的cmake編譯的so,所以會有一個cmake目錄層級;低版本(2.2)中這個文件一般有個ndk目錄,如app/build/intermediates/ndk/debug/obj/x86 4. 執行這行命令後就可以找到對應的報錯位置
另外還可以通過-dump參數將存在文件中的log進行處理
adb logcat > crash_log.txt | ndk-stack -sym app/build/intermediates/cmake/debug/obj/x86 -dump crash_log.txt
- adb logcat > crash_log.txt 輸出log到文件
- -dump crash_log.txt分析log文件,找到問題所在
具體的操作可以參考官方文檔,…\ndk-bundle\doc目錄下有對應文檔,可以用火狐瀏覽器在脫機模式下打開查看
拓展。。。c調用java的時候,java方法報錯,程序不會立刻崩潰,這時候需要在c層對異常捕獲
總結
掌握了使用這個工具以後,不管ndk開發中遇到什麼問題,都可以快速定位問題所在,管他空指針還是數組越界。