一、JavaCrash的監(jiān)控
????1.JavaCrash的異常大致流程







? ? 代碼演示使用

? ??????原理文字描述:JVM會(huì)調(diào)用Thread的dispatchUncaughtException的方法,把異常事件分發(fā)出去,線程里面有兩個(gè)獲取線程異常的方法:setUncaughtExceptionHandler(只處理當(dāng)前線程的異常)和 setDefaultUncaughtExceptionHandler(處理所有線程的異常)兩個(gè)方法,之所以線程崩潰是因?yàn)樵赥hread.UncaughtExceptionHandler重寫它的uncaughtException的方法,調(diào)用了Process.killProcess方法和System.exit方法
二、C++ crash上報(bào)機(jī)制
1、demo目錄預(yù)覽

2、c++ crash的exception type異常類型的信息:
EXC_BAD_ACCESS:
????????此類型是最常見的crash, 通常用于訪問了不該訪問的內(nèi)存導(dǎo)致的,一般EXC_BAD_ACCESS后面的()還會(huì)帶有補(bǔ)充信息,野指針錯(cuò)誤形式在Xcode中通常表現(xiàn)為:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)錯(cuò)誤。因?yàn)槟阍L問了一塊已經(jīng)不屬于你的內(nèi)存。
SIGSEGV:??通常由于重復(fù)釋放對(duì)象導(dǎo)致, 一般在ARC以后很少見到
SIGABRT:??收到Abort信號(hào)退出, 通常Foundtion庫中的容器為了保護(hù)狀態(tài)正常會(huì)做一些檢測(cè), 例如插入nil到數(shù)據(jù)中等會(huì)遇到此類錯(cuò)誤.
SEGV(Segmentation Violation):代表無效內(nèi)存地址, 比如空指針, 未初始化指針, 棧溢出等.
SIGBUS:?總棧錯(cuò)誤, 與SIGSEGV不同的是, SIGSEGV訪問的是無效的地址, 而SIGBUS訪問的是有效的地址, 但是總棧訪問異常(如地址對(duì)齊問題)
SIGILL:?嘗試執(zhí)行非法的指令, 可能不被識(shí)別或者沒有權(quán)限
SIGFPE:??數(shù)學(xué)計(jì)算相關(guān)問題, 比如除零操作
SIGIPIPE:?管道另一端沒有進(jìn)程接手?jǐn)?shù)據(jù)
EXC_BAD_INSTRUCTION:此類異常通常由于線程執(zhí)行非法指令導(dǎo)致
EXC_ARITHMETIC:?除零錯(cuò)誤會(huì)拋出此類異常
3、signal報(bào)錯(cuò)查詢表
signal 11 : 空指針異常
signal 6 : 資源初始化異常(配置文件、對(duì)象)

4、c++與java通道建立

5、C++ crash 初始化捕獲信號(hào)類型

6、C++ crash核心調(diào)用位置

7、整體流程概述
開子線程去收集crash的堆棧,通過設(shè)置不同的監(jiān)聽信號(hào)類型,開辟存儲(chǔ)crash的堆棧信息,通過監(jiān)聽crash.action事件,將錯(cuò)誤信息放在crash_stack里面。
8、為什么上報(bào)信息堆棧后面可以會(huì)有準(zhǔn)確代碼的位置?
自行思考
-----------------------------------------------------------------------------------------------------------------------------
下面東西可以不做學(xué)習(xí)重點(diǎn)
? 2.出現(xiàn)crash異常應(yīng)該怎么處理

? 3.把混淆的代碼需要還原
? ? ? ?客戶端使用的方法------->GUI工具

? ? ? ? 服務(wù)端同學(xué)使用的方法 ------>retrace命令? ??

二、NativeCrash監(jiān)控處理方式

現(xiàn)在采用的是:Google-breakpad做為主流

采用add2Line工具把.so文件+偏移地址可以準(zhǔn)確判定代碼出錯(cuò)的位置
native crash監(jiān)聽: 創(chuàng)建singalHandler方法,通過singal_stack去存儲(chǔ)singal_action去拿到崩潰堆棧