BreakPad模擬Android native崩潰

1.BreakPad簡介

Google breakpad是一個跨平臺的崩潰轉儲和分析框架和工具集合。
Breakpad由三個主要組件:

  • client,以library的形式內置在你的應用中,當崩潰發(fā)生時寫 minidump文件
  • symbol dumper, 讀取由編譯器生成的調試信息(debugging information),并生成 symbol file
  • processor, 讀取 minidump文件 和 symbol file,生成可讀的c/c++ Stack trace.

簡單來說就是一個生成 minidump,一個生成symbol file,然后將其合并處理成可讀的Stack trace。

2.模擬崩潰

2.1 獲取breakpad代碼

點擊https://chromium.googlesource.com/breakpad/breakpad這個鏈接,選擇左側的master,下載tgz文件
有些文章說會缺少 linux_syscall_support.h 文件,但是本人實踐下來并沒有缺少,可能版本更新加進去了,如果沒有,可自行查找并添加

2.2 編譯

進入源代碼根目錄,執(zhí)行以下命令

./configure && make

編譯完以后會在生成兩個可執(zhí)行文件,分別是src/processor/minidump_stackwalk和src/tools/linux/dump_syms/dump_syms

2.3 添加環(huán)境變量(MAC)
vim ~/.zshrc
### 在.zshrc文件的末尾添加剛剛生成的文件的路徑
export BREAKPAD_HOME=/Users/XXX/Documents/breakpad-refs_heads_master # 這里需要替換自己的breakpad路徑
export PATH=$PATH:${BREAKPAD_HOME}/src/processor:${BREAKPAD_HOME}/src/tools/linux/dump_syms # 此處需要注意的是,路徑中不要指定具體執(zhí)行文件名,否則會報找不到相關命令,例如${BREAKPAD_HOME}/src/tools/linux/dump_syms/dump_syms,這樣執(zhí)行dump_syms命令會找不到
### 更新環(huán)境變量
source ~/.zshrc
2.4 下載官方Demo并生成so文件和dmp文件

官方Demo的地址在https://github.com/AndroidAdvanceWithGeektime/Chapter01.
一開始本人在編譯的時候用的是ndk20的,發(fā)現提示C和C++編譯器沒有設置.經過好幾次反復才發(fā)現原來是ndk版本太高,導致了用的是clang去編譯的,然后就一直抱那個錯.后來降低成ndk16就通過了.
還有要注意,用ndk20編譯以后,會在libbreakpad模塊里面生成externalNativeBuild目錄,里面的內容在更換ndk的時候是不會自動更新的,所以需要手動刪除,這個問題我也是找了很久.一開始還以為是代碼缺了什么配置

2.5 分析dmp文件并生成log日志
minidump_stackwalk /Users/xxx/Desktop/3c22839a-812d-4901-983278b1-de602110.dmp > /Users/xxx/Desktop/1.txt

接下來查看1.txt.得出日志結果過長,大體如下:

Operating system: Android
                  0.0.0 Linux 3.10.90-g01f8576 #1 SMP PREEMPT Tue Oct 25 05:18:00 CST 2016 aarch64
CPU: arm64
     8 CPUs

GPU: UNKNOWN

Crash reason:  SIGSEGV /SEGV_MAPERR
Crash address: 0x0
Process uptime: not available

Thread 0 (crashed)
 0  libbreakpad-native.so + 0x325f4
     x0 = 0x0000000000000000    x1 = 0x0000000000000001
     x2 = 0x0000007f74e64240    x3 = 0x0000000000570000

根據文章Android 平臺 Native 代碼的崩潰捕獲機制及實現 的介紹,我們可知“Crash reason: SIGSEGV /SEGV_MAPERR”代表哪種類型的錯誤:

SIGSEGV 是當一個進程執(zhí)行了一個無效的內存引用,或發(fā)生段錯誤時發(fā)送給它的信號。
Thread 0 (crashed) //crash 發(fā)生時候的線程
0  libnative-lib.so + 0x325f4 //發(fā)生 crash 的位置和寄存器信息

有了具體的寄存器信息,我們進行符號解析(注意CPU是arm64)可以使用 ndk 中提供的addr2line來根據地址進行一個符號反解的過程,該工具在

$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line

進入addr2line所在目錄輸入(注意地址arm64用aarch64下的工具鏈解析arm64-v8a下的so文件)

aarch64-linux-android-addr2line -f -C -e /Users/xxx/Documents/AdvanAndroid/BreakpadDemo/app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/arm64-v8a/libbreakpad-native.so 0x325f4

我自己在輸入的時候會提示arm-linux-androideabi-addr2line找不到,是因為沒有在PATH里面配置,所以我就輸入的整個的地址.輸出如下

Java_com_example_libbreakpad_BreakPadManager_testBreak
/Users/liuxiaojie/Documents/AdvanAndroid/BreakpadDemo/libbreakpad/.externalNativeBuild/cmake/debug/arm64-v8a/../../../../src/main/cpp/native-lib.cpp:34

之前在ndk切換那里換了個工程,具體地址https://github.com/sunnybird/AdvanAndroid
至此,解析出了native崩潰的原因

參考文獻

http://www.lxweimin.com/p/295ebf42b05b
https://blog.csdn.net/fengyulinde/article/details/81707346
http://www.lxweimin.com/p/1687c92efb89

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容