標籤:
如何定位Android NDK開發中遇到的錯誤
NDK編譯產生的.so檔案作為程式的一部分,在運行發生異常時同樣會造成程式崩潰。不同於Java代碼異常造成的程式崩潰,在NDK的異常發生時,程式在Android裝置上都會立即退出,即通常所說的閃退,而不會彈出“程式xxx無響應,是否立即關閉”之類的提示框。
NDK是使用C/C++來進行開發的,熟悉C/C++的程式員都知道,指標和記憶體管理是最重要也是最容易出問題的地方,稍有不慎就會遇到諸如記憶體無效訪 問、無效對象、記憶體泄露、堆疊溢位等常見的問題,最後都是同一個結果:程式崩潰。例如我們常說的null 指標錯誤,就是當一個記憶體指標被置為空白(NULL)之後 再次對其進行訪問;另外一個經常出現的錯誤是,在程式的某個位置釋放了某個記憶體空間,而後在程式的其他位置試圖訪問該記憶體位址,這就會產生無效地址錯誤。 常見的錯誤類型如下:
初始化錯誤;
訪問錯誤;
記憶體泄露;
參數錯誤;
堆疊溢位;
類型轉換錯誤;
數字除0錯誤。
1、第一種方法:ndk-stack
adb shell logcat|ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
或者先擷取日誌再分析
adb shell logcat > log.txt
ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -udmp log.txt
2、第二種方法:使用addr2line和objdump命令
這兩個方法可以揭示ndk-stack命令的工作原理是什麼
arm-linux-adnroideabi-addr2line -e obj/local/armeabi/*.so地址 :定位行數
arm-linux-adnroideabi-addr2line -f -e obj/local/armeabi/*.so地址 :定位函數資訊
3、第三方SDK
TestFlight——完美的iOSapp測試方案:http://onevcat.com/2012/01/testflight/
國外的crittercism
國內的TestinTestin:收費
TestFlight——完美的iOS app測試方案
崩潰報告類:
Crittercism 個人用了一段時間,表現很穩定,但是版本更新時設定比較麻煩
Crashlytics 相當優雅方便,最近被Twitter收購。十分推薦
使用者行為統計類:
Flurry 這個太有名了,不多說了
Countly 好處是輕量開源,資料可以自己掌控
Bugsense
但是在“發布前”測試分發這個環節上,基本還沒有出現能與TestFlight相匹敵的服務出現,因此如果有這方面的測試需求的話,TF依然是開發人員的首選。
Android jni Crash堆棧資訊分析