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信息:
紅色框?qū)?yīng)的是 :dSYM UUID
黑色框?qū)?yīng)的是:異常內(nèi)存地址
2唉匾、解析方法
2.1、使用友盟錯(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ò)去筷弦。