android 抓取native層奔潰

來源:互聯網
上載者:User

標籤: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,如以下三步:

  1. 編譯Android各個平台的.so檔案
  2. 編寫JNI層mapping檔案
  3. 將.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 
  1. arm-linux-androideabi-addr2line –e obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58  

結果如下[plain]  view plain copy 
  1. /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229  
  2. /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639  
  3. /WordSpaces/hello-jni/jni/hello-jni.cpp:69  
  4. /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 
  1. 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 
  1. 00004fb4: willCrash() /WordSpaces/hello-jni/jni/hello-jni.cpp:69  
  2. 00004f58: JNI_OnLoad()/WordSpaces/hello-jni/jni/hello-jni.cpp:61  

 

相當完美,和ndk-stack得到的資訊完全一致!

addr2line和堆棧中的相對位址就可以得到檔案名稱和行號。當然前提是你要有一個debug版本、帶有符號表的二進位檔案。

 

android 抓取native層奔潰

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.