設(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ù)會無法直接在崩潰棧中獲取到偏移后的地址,需要以下方法獲取偏移地址
