APP崩潰之BreakPad捕獲異常

一录淡、簡介

在開發(fā)APP時一定會遇到程序異常退出的情況捌木,有時相對于解決問題,發(fā)現(xiàn)定位問題更加的困難和重要嫉戚。這里就需要一個功能強大的異常捕獲框架——BreakPad

Android的崩潰大體可分為以下三種:

  • java層異常
  • Native層異常
  • ANR程序無響應(yīng):I/O刨裆、CPU或者大量GC導(dǎo)致的

對于以上三種情況澈圈,Native的異常捕獲定位比較困難。需要對操作系統(tǒng)等底層有很深入的了解帆啃,以及一些極端情況的考慮(如日志生成失敗導(dǎo)致的破壞了原來的崩潰現(xiàn)場)瞬女。才能制定一個優(yōu)秀的異常捕獲框架,但這也讓BreakPad的代碼量增加了努潘。

二诽偷、window下使用BreakPad

1)、下載BreakPad源碼

1疯坤、利用git等方式下載BreakPad源碼报慕,需要使用該編譯源碼生成工具,以及用到以上的JNI文件压怠。
2卖子、下載的頭文件中會缺少一個文件夾,會導(dǎo)致配置編譯的時候出現(xiàn)錯誤刑峡,這個需要手動的下載。這個可以在GitHub中下載
缺少的文件

2)玄柠、配置編譯源碼

1突梦、環(huán)境準備

需要準備Linux系統(tǒng)和Make,我這里用的是ubantu-16-04-3版本羽利、Make-4.1宫患、XShell、共享工具

2这弧、編譯
  • 1娃闲、將下載的文件放置到Linux共享文件中(或用git下載到一個目錄中)


    image.png
  • 2、配置編譯
    利用XShell配置breakpad文件夾下面中的configure文件匾浪,并make編譯皇帮。命令:./configure && make


    minidump_stackwalk

    完成后在processor目錄下會有個minidump_stackwalk文件,之后會使用蛋辈。

3)属拾、使用Breakpad

下載的BreakPad源碼會有JNI文件,利用該文件單獨放置一個模塊中冷溶,官方的例子中使用的是makefile,這里改用的是make編譯渐白。可以直接將GitHub中的breakpad下載使用逞频。

public class BreakpadInit {
    static {
        System.loadLibrary("breakpad-core");
    }

    public static void initBreakpad(String path){
        initBreakpadNative(path);
    }

    private static native void initBreakpadNative(String path);
}

接下來使用breakpad就很簡單了纯衍,直接在初始化BreakPad庫的時候配置一個文件夾,該文件夾是存放之后生成的日志文件苗胀。

三襟诸、定位問題

  • 1瓦堵、官方給出的Native奔潰例子如下:
#include <stdio.h>
#include <jni.h>


/**
 * 引起 crash
 */
void Crash() {
    volatile int *a = (int *) (NULL);
    *a = 1;
}

extern "C"
JNIEXPORT void JNICALL
Java_com_dodola_breakpad_MainActivity_crash(JNIEnv *env, jobject obj) {
    Crash();
}

奔潰后,取出生成的奔潰日志励堡。我這里的日志名改成了t.dmp

  • 2谷丸、使用minidump_stackwalk
    在processor目錄下,執(zhí)行./minidump_stackwalk t.dmp > crash.txt
    之后會生成一個crash.txt的日志文件应结。
Operating system: Android
                  0.0.0 Linux 4.4.21-perf-g6679372 #1 SMP PREEMPT Tue Jan 23 00:40:47 CST 2018 aarch64
CPU: arm64
     8 CPUs

GPU: UNKNOWN

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

Thread 0 (crashed)
 0  libcrash-lib.so + 0x5e0
     x0 = 0x0000007f7463e180    x1 = 0x0000007ffe09eb34
     x2 = 0x0000000000000000    x3 = 0x0000007f74696a00
     x4 = 0x0000007ffe09efa8    x5 = 0x0000007f58bbf506
     x6 = 0x00000000001b9ded    x7 = 0x0000000012c7cce8
     x8 = 0x0000000000000001    x9 = 0x0000000000000000
    x10 = 0x375abb98f10f9542   x11 = 0x0000000000000000
    x12 = 0x0000000000000000   x13 = 0x0000000000430000
    x14 = 0x0000000000000000   x15 = 0x0000007f745fc7d0
    x16 = 0x0000007f73024fe8   x17 = 0x0000007f730145cc
    x18 = 0x00000000000000af   x19 = 0x0000007f74696a00
    x20 = 0x0000007f7404d350   x21 = 0x0000007f74696a00
    x22 = 0x0000007ffe09eddc   x23 = 0x0000007f58bbf506
    x24 = 0x0000000000000004   x25 = 0x375abb98f10f9542
    x26 = 0x0000007f74696a98   x27 = 0x0000007f74690600
    x28 = 0x375abb98f10f9542    fp = 0x0000007ffe09eb10
     lr = 0x0000007f73014604    sp = 0x0000007ffe09eaf0
     pc = 0x0000007f730145e0
    Found by: given as instruction pointer in context
 1  libcrash-lib.so + 0x600
     fp = 0x0000007ffe09ebf8    lr = 0x0000007f58cfda94
     sp = 0x0000007ffe09eb20    pc = 0x0000007f73014604
    Found by: previous frame's frame pointer
 2  base.odex + 0x2f9a90
     fp = 0x0000007ffe09ecf0    lr = 0x0000007f7405af54
     sp = 0x0000007ffe09ec08    pc = 0x0000007f58cfda94
    Found by: previous frame's frame pointer

這里面有奔潰的位置:libcrash-lib.so + 0x5e0
使用的CPU架構(gòu):arm64

對于Crash Reason可以參考如下對應(yīng)表:
Crash code對應(yīng)表

對應(yīng)上面的Native崩潰刨疼,可以看出崩潰的原因是“地址無效”導(dǎo)致的。

  • 3鹅龄、使用addr2line
    在SDK中toolchain交叉編譯工具鏈中揩慕,有個 aarch64-linux-android-addr2line.exe可執(zhí)行文件進行符號解析,這樣就可以將之前生成的crash.txt文件定位到哪一行的問題扮休。

這里執(zhí)行的命令:

aarch64-linux-android-addr2line.exe -f -C -e 
D:\F\project\self\github\AndroidAdvanceWithGeektime\Chapter01\sample\build\intermediates\transforms\mergeJniLibs\debug\0\lib\arm64-v8a\libcrash-lib.so 0x5e0

這里需要錯誤的so文件和crash.txt中報錯對的偏移地址 0x5e0和addr2line.exe


addr2line

這里就可以定位到是這個so庫中的Crash方法迎卤、第十行出現(xiàn)的問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玷坠,一起剝皮案震驚了整個濱河市蜗搔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌八堡,老刑警劉巖樟凄,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兄渺,居然都是意外死亡攒盈,警方通過查閱死者的電腦和手機悯蝉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驼侠,你說我怎么就攤上這事输吏“母梗” “怎么了椭蹄?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妄田。 經(jīng)常有香客問我饭望,道長,這世上最難降的妖魔是什么形庭? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任铅辞,我火速辦了婚禮,結(jié)果婚禮上萨醒,老公的妹妹穿的比我還像新娘斟珊。我一直安慰自己,他們只是感情好富纸,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布囤踩。 她就那樣靜靜地躺著旨椒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堵漱。 梳的紋絲不亂的頭發(fā)上综慎,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音勤庐,去河邊找鬼示惊。 笑死,一個胖子當著我的面吹牛愉镰,可吹牛的內(nèi)容都是我干的米罚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼丈探,長吁一口氣:“原來是場噩夢啊……” “哼录择!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碗降,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隘竭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讼渊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體货裹,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年精偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赋兵。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡笔咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霹期,到底是詐尸還是另有隱情叶组,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布历造,位于F島的核電站甩十,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吭产。R本人自食惡果不足惜侣监,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臣淤。 院中可真熱鬧橄霉,春花似錦、人聲如沸邑蒋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钱慢,卻和暖如春逮京,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背束莫。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工懒棉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麦箍。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓漓藕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挟裂。 傳聞我的和親對象是個殘疾皇子享钞,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355