解析iOS線上崩潰日志(crash Log)

1溃斋、錯(cuò)誤類型

開(kāi)發(fā)中遇到應(yīng)用崩潰是在所難免的,可以進(jìn)行斷點(diǎn)等一步一步的調(diào)試。但是APP上線之后也可能遇到一些bug枫耳,首先看一些這些線上app crash 信息:

* Application received signal SIGSEGV
* Application received signal SIGBUS
* -[NSConcreteMapTable keyboardWillShow:]: unrecognized selector sent to instance
* -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds for empty array
* -[JKArray objectAtIndex:]: index (0) beyond bounds (0)
  • SIGSEGV怨咪、SIGBUS 和第三個(gè)一般是因?yàn)樵L問(wèn)已被釋放的內(nèi)存或者調(diào)用不存在的方法導(dǎo)致的屋剑,
  • 余下兩個(gè)就是數(shù)組越界的問(wèn)題了。

這些我們都是知道的诗眨,然后來(lái)看看具體的log信息:

Application received signal SIGSEGV
unrecognized selector sent to instance

紅色框?qū)?yīng)的是 :dSYM UUID
黑色框?qū)?yīng)的是:異常內(nèi)存地址

2唉匾、解析方法

2.1、使用友盟錯(cuò)誤分析工具

友盟iOS錯(cuò)誤分析功能說(shuō)明

友盟錯(cuò)誤分析工具下載

2.2匠楚、使用dSYM 文件解析

<1> 什么是 dSYM 文件

Xcode編譯項(xiàng)目后巍膘,我們會(huì)看到一個(gè)同名的 dSYM 文件,dSYM 是保存 16 進(jìn)制函數(shù)地址映射信息的中轉(zhuǎn)文件芋簿,我們調(diào)試的 symbols 都會(huì)包含在這個(gè)文件中峡懈,并且每次編譯項(xiàng)目的時(shí)候都會(huì)生成一個(gè)新的 dSYM 文件,位于 /Users/<用戶名>/Library/Developer/Xcode/Archives 目錄下与斤,對(duì)于每一個(gè)發(fā)布版本我們都很有必要保存對(duì)應(yīng)的 Archives 文件 ( AUTOMATICALLY SAVE THE DSYM FILES 這篇文章介紹了通過(guò)腳本每次編譯后都自動(dòng)保存 dSYM 文件)肪康。

<2> dSYM 文件有什么作用

當(dāng)我們軟件 release 模式打包或上線后,不會(huì)像我們?cè)?Xcode 中那樣直觀的看到用崩潰的錯(cuò)誤撩穿,這個(gè)時(shí)候我們就需要分析 crash report 文件了磷支,iOS 設(shè)備中會(huì)有日志文件保存我們每個(gè)應(yīng)用出錯(cuò)的函數(shù)內(nèi)存地址,通過(guò) Xcode 的 Organizer 可以將 iOS 設(shè)備中的 DeviceLog 導(dǎo)出成 crash 文件食寡,這個(gè)時(shí)候我們就可以通過(guò)出錯(cuò)的函數(shù)地址去查詢 dSYM 文件中程序?qū)?yīng)的函數(shù)名和文件名齐唆。大前提是我們需要有軟件版本對(duì)應(yīng)的 dSYM 文件,這也是為什么我們很有必要保存每個(gè)發(fā)布版本的 Archives 文件了冻河。

<3> 如何解析dSYM 文件

打開(kāi)terminal(終端)箍邮,進(jìn)行查找和解析,大致步驟如下:

MacBook-Pro:~ myName$ cd /Users/<用戶名>/Library/Developer/Xcode/Archives

MacBook-Pro:Archives myName$ ls
2015-09-07  2015-11-03  2016-01-20  2016-05-30  2016-12-05
2015-09-11  2015-12-07  2016-03-01  2016-06-22  2016-12-13
2015-09-12  2016-01-05  2016-05-11  2016-06-30  2017-01-11
2015-09-14  2016-01-13  2016-05-12  2016-07-01  2017-03-11
2015-09-29  2016-01-14  2016-05-18  2016-08-12  2017-03-13
2015-11-02  2016-01-19  2016-05-23  2016-12-01

MacBook-Pro:Archives myName$ cd 2017-03-13

MacBook-Pro:2017-03-13 myName$ ls
xxx 2017-3-13 下午11.58.xcarchive

MacBook-Pro:2017-03-13 myName$ cd xxx\ 2017-3-13\ 下午11.58.xcarchive/

MacBook-Pro:xxx 2017-3-13 下午11.58.xcarchive myName$ ls
Info.plist  Products    SCMBlueprint    dSYMs

MacBook-Pro:xxx 2017-3-13 下午11.58.xcarchive myName$ cd dSYMs/

MacBook-Pro:dSYMs myName$ dwarfdump --uuid <項(xiàng)目名>.app.dSYM
UUID: 45733B26-456D-31A1-177C-7E8DE4EF7C15 (armv7) xxx.app.dSYM/Contents/Resources/DWARF/xxx
UUID: E46DBE29-9288-A32F-BC67-F7F4EA2149DF (arm64) xxx.app.dSYM/Contents/Resources/DWARF/xxx

MacBook-Pro:dSYMs myName$ dwarfdump --lookup 0x1000e4d54 -arch arm64 xxx.app.dSYM

----------------------------------------------------------------------
 File: xxx.app.dSYM/Contents/Resources/DWARF/xxx (arm64)
----------------------------------------------------------------------
Looking up address: 0x00000001000e4d54 in .debug_info... found!

0x0016524b: Compile Unit: length = 0x00001843  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x00166a92)

0x00165256: TAG_compile_unit [106] *
             AT_producer( "Apple LLVM version 8.0.0 (clang-800.0.42.1)" )
             AT_language( DW_LANG_ObjC )
             AT_name( "/Users/myName/Desktop/app/xxx/MyView.m" )
             AT_stmt_list( 0x0006b8d4 )
             AT_comp_dir( "/Users/myName/Desktop/app/xxx" )
             AT_APPLE_optimized( 0x01 )
             AT_APPLE_major_runtime_vers( 0x02 )
             AT_low_pc( 0x00000001000e3370 )
             AT_high_pc( 0x00000001000e5d74 )

0x00165da2:     TAG_subprogram [121] *
                 AT_low_pc( 0x00000001000e4ccc )
                 AT_high_pc( 0x00000001000e4d6c )
                 AT_frame_base( reg29 )
                 AT_object_pointer( {0x00165dc1} )
                 AT_name( "-[MyView showinView:]" )
                 AT_decl_file( "/Users/myName/Desktop/app/xxx/MyView.m" )
                 AT_decl_line( 99 )
                 AT_prototyped( 0x01 )
                 AT_APPLE_optimized( 0x01 )
Line table dir : '/Users/myName/Desktop/app/xxx'
Line table file: 'MyView.m' line 102, column 5 with start address 0x00000001000e4d48

Looking up address: 0x00000001000e4d54 in .debug_frame... not found.

1叨叙、進(jìn)入 dSYMs 文件夾

  • 進(jìn)入 Archives 文件夾:
cd /Users/<用戶名>/Library/Developer/Xcode/Archives
  • 查看 Archives 此文件夾下的列表:
ls
  • 選擇你要查找的文件夾進(jìn)入:
cd 2017-03-13
  • 查看 2017-03-13 此文件夾下的列表(列表下應(yīng)該只有一個(gè)):
ls
  • 繼續(xù)進(jìn)入 xcarchive
cd xxx 2017-3-13 下午11.58.xcarchive
  • 繼續(xù)進(jìn)入 dSYMs 文件夾
cd dSYMs

2锭弊、查找 UUID
查看 xx.app.dSYM 文件的 UUID:

dwarfdump --uuid <項(xiàng)目名>.app.dSYM

會(huì)自動(dòng)輸出 UUID,如下:

UUID: 45733B26-456D-31A1-177C-7E8DE4EF7C15 (armv7) xxx.app.dSYM/Contents/Resources/DWARF/xxx
UUID: E46DBE29-9288-A32F-BC67-F7F4EA2149DF (arm64) xxx.app.dSYM/Contents/Resources/DWARF/xxx

注意:正常情況下擂错,崩潰日志里面的 dSYM UUID(上面截圖里紅色框里) 一定會(huì)和此處輸出的一個(gè) UUID 一樣味滞,這樣才能進(jìn)行下一步查找,如果不一樣你就是進(jìn)錯(cuò)文件夾了(2017-03-13 文件夾),這里我在輸出里面隨意進(jìn)行了一些修改剑鞍。

3昨凡、查找 crash Log 的異常內(nèi)存地址
根據(jù)崩潰日志里 異常內(nèi)存地址arm64的信息進(jìn)行查找:

dwarfdump --lookup 0x1000e4d54 -arch arm64 <項(xiàng)目名>.app.dSYM

輸出的結(jié)果:

----------------------------------------------------------------------
 File: xxx.app.dSYM/Contents/Resources/DWARF/xxx (arm64)
----------------------------------------------------------------------
Looking up address: 0x00000001000e4d54 in .debug_info... found!

0x0016524b: Compile Unit: length = 0x00001843  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x00166a92)

0x00165256: TAG_compile_unit [106] *
             AT_producer( "Apple LLVM version 8.0.0 (clang-800.0.42.1)" )
             AT_language( DW_LANG_ObjC )
             AT_name( "/Users/myName/Desktop/app/xxx/MyView.m" )
             AT_stmt_list( 0x0006b8d4 )
             AT_comp_dir( "/Users/myName/Desktop/app/xxx" )
             AT_APPLE_optimized( 0x01 )
             AT_APPLE_major_runtime_vers( 0x02 )
             AT_low_pc( 0x00000001000e3370 )
             AT_high_pc( 0x00000001000e5d74 )

0x00165da2:     TAG_subprogram [121] *
                 AT_low_pc( 0x00000001000e4ccc )
                 AT_high_pc( 0x00000001000e4d6c )
                 AT_frame_base( reg29 )
                 AT_object_pointer( {0x00165dc1} )
                 AT_name( "-[MyView showinView:]" )
                 AT_decl_file( "/Users/myName/Desktop/app/xxx/MyView.m" )
                 AT_decl_line( 99 )
                 AT_prototyped( 0x01 )
                 AT_APPLE_optimized( 0x01 )
Line table dir : '/Users/myName/Desktop/app/xxx'
Line table file: 'MyView.m' line 102, column 5 with start address 0x00000001000e4d48

Looking up address: 0x00000001000e4d54 in .debug_frame... not found.

看一下結(jié)果:發(fā)現(xiàn)有 AT_name蚁署、Line table dir便脊、Line table file,這樣就找到了出錯(cuò)的地方(MyView showinView: 方法出錯(cuò)了)光戈。

注意:如果發(fā)現(xiàn) warning: unsupported file type: 錯(cuò)誤哪痰,這個(gè)問(wèn)題是因?yàn)橛形募蛘吣夸浀拿Q中包含空格,比如:2017-3-13/xxx 8-30-13 6.19 久妆,所以晌杰,需要轉(zhuǎn)義一下:2017-3-13/xxx\ 8-30-13\ 6.19\ xxx.xcarchive。最好要cd進(jìn)入下一級(jí)的名稱從當(dāng)前的ls列表復(fù)制過(guò)去筷弦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肋演,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烂琴,更是在濱河造成了極大的恐慌惋啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件监右,死亡現(xiàn)場(chǎng)離奇詭異边灭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)健盒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绒瘦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扣癣,你說(shuō)我怎么就攤上這事惰帽。” “怎么了父虑?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵该酗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我士嚎,道長(zhǎng)呜魄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任莱衩,我火速辦了婚禮爵嗅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笨蚁。我一直安慰自己睹晒,他們只是感情好趟庄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著伪很,像睡著了一般戚啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锉试,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天猫十,我揣著相機(jī)與錄音,去河邊找鬼键痛。 笑死炫彩,一個(gè)胖子當(dāng)著我的面吹牛匾七,可吹牛的內(nèi)容都是我干的絮短。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昨忆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丁频!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邑贴,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤席里,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拢驾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奖磁,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年繁疤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咖为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稠腊,死狀恐怖躁染,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情架忌,我是刑警寧澤吞彤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站叹放,受9級(jí)特大地震影響饰恕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜井仰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一懂盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糕档,春花似錦莉恼、人聲如沸拌喉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尿背。三九已至,卻和暖如春捶惜,著一層夾襖步出監(jiān)牢的瞬間田藐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吱七, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汽久,地道東北人刃麸。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓糟袁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親崭闲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吝岭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • iOS開(kāi)發(fā)中三痰,經(jīng)常遇到App在開(kāi)發(fā)及測(cè)試時(shí)不會(huì)有問(wèn)題,但是裝在別人的設(shè)備中會(huì)出現(xiàn)各種不定時(shí)的莫名的 crash窜管,因...
    咖咖嘻閱讀 6,154評(píng)論 3 21
  • 如果大家是用真機(jī)在調(diào)試的過(guò)程中出現(xiàn)了Crash散劫,那么請(qǐng)看iOS調(diào)試之 crash log分析 前言 導(dǎo)讀:Unde...
    KODIE閱讀 6,469評(píng)論 7 12
  • 本文就捕獲iOS Crash、Crash日志組成幕帆、Crash日志符號(hào)化获搏、異常信息解讀、常見(jiàn)的Crash五部分介紹失乾。...
    xukuangbo_閱讀 1,581評(píng)論 0 0
  • 解析崩潰日志 一 獲取crash 1.用戶把設(shè)備連接到電腦上常熙,打開(kāi)xcode-window,選中Devices-當(dāng)...
    大蝦咪閱讀 6,057評(píng)論 4 3
  • 關(guān)鍵詞 花 肥料 死了 一顆花 去年仗扬,我一直想給家里增添一點(diǎn)綠色症概,去花店左挑右...
    任性的王海川閱讀 923評(píng)論 2 1