Android jni Crash堆棧信息分析


如何定位Android NDK開發中遇到的錯誤

    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依然是開發人員的首選。

如果您覺得文章不錯,不妨給個 打賞,寫作不易,感謝各位的支持。您的支持是我最大的動力,謝謝!!! 

 

  


很重要--轉載聲明

  1. 本站文章無特別說明,皆為原創,版權所有,轉載時請用鏈接的方式,給出原文出處。同時寫上原作者:朝十晚八 or Twowords
  2. 如要轉載,請原文轉載,如在轉載時修改本文,請事先告知,謝絕在轉載時通過修改本文達到有利於轉載者的目的。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM