一種SDK crash 定位方案

設(shè)計背景與需求

背景:在制作sdk時,往往由于接入方APP為第三方廠家,一旦sdk發(fā)生崩潰,存在反饋crash不及時,dsym文件無法獲取等問題導(dǎo)致crash本身也難以解析。

需求:需要在代碼中動態(tài)判斷當(dāng)前crash是否是目標(biāo)sdk導(dǎo)致,自動上報crash達(dá)到自動預(yù)警的能力。

需要解決的問題?

異常/崩潰的捕獲,且不干擾其他異常捕獲的處理【略】

無符號表的情況下,如何判定堆棧中是否有目標(biāo)sdk的代碼?

Pod庫是否也可以做到

通過協(xié)議統(tǒng)一實現(xiàn)方案,方便遷移

動態(tài)庫 & 靜態(tài)庫

動態(tài)庫有庫的名稱,可以直接判定是否在目標(biāo)sdk中

靜態(tài)庫由于SDK和APP代碼屬于同一個二進(jìn)制塊,不容易判斷

函數(shù)地址

異常捕獲到的堆棧中,提取到崩潰棧的地址信息

如何確定地址在目標(biāo)sdk中?

1 拿到崩潰棧中地址信息

2 判斷地址是否落在SDK中

如何獲取目標(biāo)sdk函數(shù)的地址區(qū)間

所加載的靜態(tài)庫通過MachOView 工具可以看到是一段連續(xù)地址

因此只需要拿到目標(biāo)sdk的第一個函數(shù)地址和最后一個函數(shù)地址,就得到了函數(shù)地址區(qū)間

在Compile Sources 的文件列表中第一個.m文件寫一個函數(shù)返回該函數(shù)地址,此地址即是sdk的第一個函數(shù)地址

同理,可以獲取到sdk的最后一個函數(shù)地址

Pod庫如何確保取首位地址正確

暫未發(fā)現(xiàn)podspec有設(shè)置 sources 文件順序的方法,通過嘗試發(fā)現(xiàn)pod生成的target配置中,sources是根據(jù)文件名進(jìn)行字典排序。

通過文件命名,來確保 XXBegain.m和XXEnd.m 一定在收尾引入。



需要注意ASLR機(jī)制

Release版本由于ASLR技術(shù)會無法直接在崩潰棧中獲取到偏移后的地址,需要以下方法獲取偏移地址



參考資料

iOS崩潰日志分析:http://www.itdecent.cn/p/7958ba264c81

SDK函數(shù)地址區(qū)間獲?。?/a>https://github.com/hssdx/sdk-crash

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

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

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