NDK編譯生成的.so文件作為程序的一部分,在運行發生異常時同樣會造成程序崩潰。不同於Java代碼異常造成的程序崩潰,在NDK的異常發生時,程序在Android設備上都會立即退出,即通常所說的閃退,而不會彈出“程序xxx無響應,是否立即關閉”之類的提示框。
NDK是使用C/C++來進行開發的,熟悉C/C++的程序員都知道,指針和內存管理是最重要也是最容易出問題的地方,稍有不慎就會遇到諸如內存無效訪 問、無效對象、內存泄露、堆棧溢出等常見的問題,最后都是同一個結果:程序崩潰。例如我們常說的空指針錯誤,就是當一個內存指針被置為空(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——完美的iOS app測試方案:http://onevcat.com/2012/01/testflight/
國外的crittercism
國內的TestinTestin:收費
TestFlight——完美的iOS app測試方案
崩潰報告類:
Crittercism 個人用了一段時間,表現很穩定,但是版本更新時設置比較麻煩
Crashlytics 相當優雅方便,最近被Twitter收購。十分推薦
用戶行為統計類:
Flurry 這個太有名了,不多說了
Countly 好處是輕量開源,數據可以自己掌控
Bugsense
但是在“發布前”測試分發這個環節上,基本還沒有出現能與TestFlight相匹敵的服務出現,因此如果有這方面的測試需求的話,TF依然是開發人員的首選。