標籤:svn bsp ati back 多個 完全 break 相同 ack
使用android的breakpad工具
使用這個工具需要下載Breakpad的源碼,然後進行編譯,編譯之後會產生兩個工具
二、產生轉換工具
1、下載BreakPad原始碼
命令列輸入:svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only
2、編譯工具
①進入代碼路徑
cd google-breakpad-read-only/
②配置環境
./configure
③編譯工具
make
3、看看以下工具是否存在:
google-breakpad-read-only/src/tools/linux/dump_syms/dump_syms
google-breakpad-read-only/src/processor/minidump_stackwalk
這兩個工具可以直接到csdn中去下載編譯成功的
這個過程你需要編譯出幾個工具:minidump_stackwalk
dump_syms
等等
就是上面這兩個工具
但是這裡要注意不同的版本不一樣,這裡可以直接到csdn上去下載
整合到App中
這個過程你需要用ndk-build編譯出.so
檔案,放到你的App工程中的libs目錄下,並在Java層初始化Breakpad,如以下三步:
- 編譯Android各個平台的.so檔案
- 編寫JNI層mapping檔案
- 將.so檔案和JNI mapping檔案copy到項目中
當然,你也可以用開源的:https://github.com/yinyinnie/breakpad-for-android
1. 找到日誌中的關鍵函數指標
https://www.cnblogs.com/willhua/p/6718379.html
其實很簡單,就是找到backtrace資訊中,屬於我們自己的so檔案報錯的行。
首先要找到backtrace資訊,有的手機會明確列印一行backtrace(比如我們這次使用的手機),那麼這一行下面的一系列以“#兩位元字 pc”開頭的行就是backtrace資訊了。有時可能有的手機並不會列印一行backtrace,那麼只要找到一段以“#兩位元字 pc ”開頭的行,就可以了。
其次要找到屬於自己的so檔案報錯的行,這就比較簡單了。找到這些行之後,記下這些行中的函數地址
2. 使用addr2line尋找代碼位置
執行如下的命令,多個指標地址可以在一個命令中帶入,以空格隔開即可
[plain] view plain copy
- arm-linux-androideabi-addr2line –e obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58
結果如下[plain] view plain copy
- /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229
- /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639
- /WordSpaces/hello-jni/jni/hello-jni.cpp:69
- /WordSpaces hello-jni/jni/hello-jni.cpp:6
從addr2line的結果就能看到,我們拿到了我們自己的錯誤碼的調用關係和行數,在hello-jni.cpp的69行和61行(另外兩行因為使用的是標準函數,可以忽略掉),結果和ndk-stack是一致的,說明ndk-stack也是通過addr2line來擷取代碼位置的。
3. 使用objdump擷取函數資訊
通過addr2line命令,其實我們已經找到了我們代碼中出錯的位置,已經可以協助程式員定位問題所在了。但是,這個方法只能擷取程式碼數,並沒有顯示函數資訊,顯得不那麼“完美”,對於追求極致的程式員來說,這當然是不夠的。下面我們就示範怎麼來定位函數資訊。
使用如下命令匯出函數表:
[plain] view plain copy
- arm-linux-androideabi-objdump –S obj/local/armeabi/libhello-jni.so > hello.asm
在產生的asm檔案中尋找剛剛我們定位的兩個關鍵指標00004fb4和00004f58
從這兩張圖可以清楚的看到(要注意的是,在不同的NDK版本和不同的作業系統中,asm檔案的格式不是完全相同,但都大同小異,請大家仔細比對),這兩個指標分別屬於willCrash()和JNI_OnLoad()函數,再結合剛才addr2line的結果,那麼這兩個地址分別對應的資訊就是:
[plain] view plain copy
- 00004fb4: willCrash() /WordSpaces/hello-jni/jni/hello-jni.cpp:69
- 00004f58: JNI_OnLoad()/WordSpaces/hello-jni/jni/hello-jni.cpp:61
相當完美,和ndk-stack得到的資訊完全一致!
addr2line和堆棧中的相對位址就可以得到檔案名稱和行號。當然前提是你要有一個debug版本、帶有符號表的二進位檔案。
android 抓取native層奔潰