iOS崩潰日志分析

前言

我們一般使用友盟等第三方平臺來收集程序崩潰信息,但是一般情況下收集到的崩潰信息是我們無法看懂的,都是一些16進制的內(nèi)存地址,無法準(zhǔn)確定位到出錯的代碼政敢。通常像這樣的情況是由于我們沒有上傳符號文件到第三方平臺,所以無法解析出具體的代碼胚迫。

.dSYM為后綴的文件就是符號文件喷户,里面存儲著程序的符號表,也就是函數(shù)和內(nèi)存地址的對應(yīng)關(guān)系访锻,有了這個符號文件褪尝,我們就可以通過崩潰信息中的內(nèi)存地址解析出具體的出錯代碼,每次打包App生成的符號文件都可能不一樣朗若,所以說崩潰發(fā)生在哪個App版本就使用哪個版本的符號文件解析崩潰代碼恼五。

因為打包好之后的App安裝包和符號文件是分開來的(出于安裝包大小的考量)昌罩,所以App包中沒有符號文件哭懈,因此線上版本的App產(chǎn)生崩潰時只能得到崩潰地址,具體的解析工作還需拿到對應(yīng)的dSYM符號文件之后才能進行茎用。本地開發(fā)時符號文件就在本地遣总,所以出現(xiàn)崩潰時Xcode打印出來的崩潰信息能看到具體的崩潰代碼睬罗。

  • dSYM符號文件的位置

Xcode -> window -> Organizer -> 選擇對應(yīng)的包然后show in finder -> 顯示包內(nèi)容 -> dSYMs文件夾里存放的文件就是符號文件

選擇崩潰產(chǎn)生的對應(yīng)的App版本
  • 自己收集崩潰信息

通過自己收集崩潰信息,我們能夠理解更多問題

1.首先在AppDelegate文件的didFinishLaunchingWithOptions方法中設(shè)置崩潰回調(diào)函數(shù),程序出現(xiàn)崩潰時會調(diào)用該函數(shù)旭斥,我們在該函數(shù)里面收集崩潰信息
2.實現(xiàn)該函數(shù)handleException()
3.獲取程序slide偏移值 (現(xiàn)在的App在運行到內(nèi)存以后容达,會在前面隨機空出一部分內(nèi)存,而slide值就是這個隨機空白段的長度垂券,由于我們打包生成的符號文件是不加這個空白段的花盐,所以我們收集到的崩潰地址需要減去slide值,才能在符號文件中解析出正確的信息)

slide演示

崩潰的收集代碼如下

#import "AppDelegate.h"
#import <mach-o/dyld.h>     //需要導(dǎo)入這個頭文件 使用獲取偏移值的api

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //1菇爪、設(shè)置異乘阈荆回調(diào)函數(shù)
    NSSetUncaughtExceptionHandler(handleException);
    return YES;
}

//重要,用于獲取偏移值
long calculate(void) {
    long s = 0;
    for (uint32_t i = 0; i < _dyld_image_count(); i++) {
        if (_dyld_get_image_header(i)->filetype == MH_EXECUTE) {
            long slide = _dyld_get_image_vmaddr_slide(i);
            s = slide;
            break;
        }
    }
    return s;
}

/**
 *  2凳宙、異澄踝幔回調(diào)函數(shù)實現(xiàn)
 */
void handleException(NSException *exception){
    //2.設(shè)備型號

    //3.系統(tǒng)版本
    NSString *OSVersion = [NSString stringWithFormat:@"iOS %@",[UIDevice currentDevice].systemVersion];
    //4.崩潰名
    NSString *exceptionName = [exception name];
    //5.崩潰原因
    NSString *reason = [exception reason];
    //6.函數(shù)調(diào)用棧信息(重要)
    NSArray *array = [exception callStackSymbols]; //調(diào)用棧信息 拼接成字符串
    NSString *callStackStr = @"";
    for (NSString *str in array) {
        callStackStr = [NSString stringWithFormat:@"%@\n%@",callStackStr,str];
    }
    //7.崩潰前畫面app畫面截圖(可選,沒有太多參考價值)
    //8.崩潰時間
    //9.app版本
    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString *AppVersion = [infoDict objectForKey:@"CFBundleShortVersionString"];

    //10.偏移值(重要)
    NSString *slide = [NSString stringWithFormat:@"%ld",calculate()];

    //11.上傳崩潰信息到自己的后臺
    ...
    
    exit(0);// 需要手動殺死程序  
}
  • 分析崩潰信息

QQ20190305-154428.png

上面就是我獲得的函數(shù)調(diào)用棧callStackSymbols信息氏涩,第一列為調(diào)用順序届囚,第二列就是對應(yīng)的庫,第三列是對應(yīng)方法函數(shù)對應(yīng)的內(nèi)存地址是尖。從第二列可以看出意系,大部分都是系統(tǒng)庫調(diào)用,這是我們無法修改的饺汹,所以不用管昔字。我們只關(guān)注項目名所對應(yīng)的那幾行,那才是我們自己編寫的代碼首繁,所以只需要關(guān)注5作郭、6、22行的信息弦疮。由于棧的調(diào)用順序夹攒,我們只需要分析最根層的方法即可,因為那才是崩潰發(fā)生的根源胁塞,也就是說只需要分析第5行咏尝。

由上面的崩潰信息可以看到第5行的內(nèi)存地址是0x00000001012f9d90,我們可以通過命令行去dSYM符號文件中尋找該內(nèi)存地址所對應(yīng)的方法啸罢,這樣就可以分析發(fā)生崩潰的方法了编检。

但是現(xiàn)在的iOS系統(tǒng)增加了一些安全措施,僅僅通過這個地址我們還無法從dSYM文件中解析出有用信息扰才,因為每次運行程序時允懂,系統(tǒng)都會在程序內(nèi)存前面加上一段隨機的空白段,所以我們需要用當(dāng)前得到的地址0x00000001012f9d90減去隨機空白段的長度才能得到最終的地址衩匣,只有這個地址才可以從dSYM文件中解析出正確的方法信息蕾总。這個偏移值我們可以通過系統(tǒng)的api獲取粥航,在上面的崩潰收集方法里已經(jīng)收集了slide偏移值。

  • 解析方法

將第5行需要解析的地址減去偏移值slide得到最終地址(地址是16進制表示的生百,而偏移值是十進制的递雀,注意轉(zhuǎn)換)

1??使用命令行解析

  • 打開終端,cd到dSYM文件所在的目錄
  • 在終端運行如下命令即可打印顯示崩潰所在的類蚀浆、方法和行數(shù)信息
$atos -o 你的項目名.app.dSYM/Contents/Resources/DWARF/你的項目名 最終地址

2??使用DSYMTools工具解析

參考文章
沒有dsym符號文件如何解析崩潰
用命令和.dSYM 文件查找錯誤日志
偏移值的獲取和符號地址的計算
dSYMTools
iOS自己捕獲異常定位錯誤代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缀程,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子市俊,更是在濱河造成了極大的恐慌杠输,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕衙,死亡現(xiàn)場離奇詭異蠢甲,居然都是意外死亡,警方通過查閱死者的電腦和手機据忘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鹦牛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勇吊,你說我怎么就攤上這事曼追。” “怎么了汉规?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵礼殊,是天一觀的道長。 經(jīng)常有香客問我针史,道長晶伦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任啄枕,我火速辦了婚禮婚陪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘频祝。我一直安慰自己泌参,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布常空。 她就那樣靜靜地躺著沽一,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓糙。 梳的紋絲不亂的頭發(fā)上铣缠,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音,去河邊找鬼攘残。 笑死拙友,一個胖子當(dāng)著我的面吹牛为狸,可吹牛的內(nèi)容都是我干的歼郭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼辐棒,長吁一口氣:“原來是場噩夢啊……” “哼病曾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漾根,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤泰涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辐怕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逼蒙,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年寄疏,在試婚紗的時候發(fā)現(xiàn)自己被綠了是牢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡陕截,死狀恐怖驳棱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情农曲,我是刑警寧澤社搅,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站乳规,受9級特大地震影響形葬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暮的,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一荷并、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧青扔,春花似錦源织、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凛剥,卻和暖如春侠仇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工逻炊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留互亮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓余素,卻偏偏與公主長得像豹休,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桨吊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Apple Develop官方原文:Understanding and Analyzing Application...
    iDeveloper閱讀 5,446評論 1 9
  • 該文章屬于劉小壯原創(chuàng)威根,轉(zhuǎn)載請注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 37,519評論 45 122
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 這個總結(jié)也拖视乐,拖到了現(xiàn)在.. 整個二月說起來洛搀,就是在三亞玩,然后回來復(fù)習(xí)六級佑淀,再到準(zhǔn)備考研 學(xué)校是暫時定好了留美,可是...
    小梨渦妹閱讀 283評論 0 0
  • 然亦傘閱讀 132評論 0 0