文章目錄
· 一、遇到問題
· 二、Native日志分析
· 三、信号量(signal) 和 錯誤碼(code)分析
· 四、PC指針addr2line定位
· 4.1 addr2line路徑
· 4.2 so路徑
· 4.3 addr2line查詢
· 五、修改代碼
· 六、後續~
一、遇到問題
客戶小姐姐回報一個Crash問題,但是機率很小,開發和測試都沒遇到過。
總不能讓小姐姐幫忙抓取logcat日志。
逼不得已,用上了殺手锏
友盟+U-APM神器,重新給小姐姐更新了一版APK。
然後,開瓶82年的冰闊落,坐等日志上來。
二、Native日志分析
來了來了,日志它來了。
乍看,有點慌。
這是大名鼎鼎的Native Crash啊。
這是隔壁C++組的鍋啊,我就說像我這麼資深的程式員,怎麼可能寫出這bug呢~
三、信号量(signal) 和 錯誤碼(code)分析
不過,來都來了,看都看了,且再認真看看具體是哪裡有bug~
點選全屏檢視,一堆十六進制,咋看有點慌。
不過老司機帶路,莫慌,翻開
友盟的文檔中心的Native崩潰說明· SIGSEGV,一個程序執行了一個無效的記憶體引用,或發生段錯誤。
· SEGV_MAPERR,位址不在 /proc/self/map 映射中
看到這裡,有點頭緒咯,空指針、段錯誤?
跟着老司機,接着往下走,go~
四、PC指針addr2line定位
4.1 addr2line路徑
· 先找到ndk的路徑,在local.properties
· 再找到addr2line
· 其中aarch64-linux-android-4.9和arm-linux-androideabi-4.9都是可以的
4.2 so路徑
4.3 addr2line查詢
· 按照log的列印順序,我們從下往上看,先執行cxa_demangle.cpp:309
· 但是,cxa_demangle是個啥東西呢
· 新的ABI委托執行C++運作庫的入口
· 就是這個入口走錯了?走到了空指針?
· 這時候重新在 背景定睛一看,Java_com_umeng_crashdemo_MainActivity_stringFromJNI
· 那就先查它
五、修改代碼
代碼定位到這裡來,一看代碼,很簡單啊
改改改!!!
六、後續~
重新打包個APK,發給客戶小姐姐。
翹着二郎腿,再開一瓶冰闊落~
果不其然~
客戶小姐姐很開心,說我真棒,要把她閨蜜介紹給我。
咦,我的春天來了~
我的嘴角不自覺揚起45°的微笑。
哎,醒醒,醒醒,要debug了~~~
作者:康玮劍