程序員自我修養(yǎng)之java、C++ crash上報(bào)機(jī)制

一、JavaCrash的監(jiān)控

????1.JavaCrash的異常大致流程

異常線程的區(qū)別
設(shè)置uncaughtExceptionHandler異常處理器

? ? 代碼演示使用

? ??????原理文字描述: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去拿到崩潰堆棧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容