前言
iOS分析定位崩潰問題有很多種方式,但是發布到AppStore的應用如果崩潰了,我們該怎麼辦呢?通常我們都會在系統中接入統計系統,在系統崩潰的時候記錄下崩潰日志,下次啟動時將日志發送到服務端,比較好的第三方有umeng之類的。今天我們來講一下通過崩潰日志來分析定位我們的bug。
dYSM文件
分析崩潰日志的前提是我們需要有dYSM文件,這個文件是我們用archive打包時生成的.xcarchive後綴的文件包。一個良好的習慣是,在你打包提交審核的時候,將生成的.xcarchive與ipa文件一同拷貝一份,按照版本號保存下來,這樣如果線上出現問題可以快速的找到你想要的文件來定位你的問題。
崩潰日志
一般崩潰日志都會像下面這樣:
NSConcreteMutableAttributedString addAttribute:value:range:: nil value (null) (( CoreFoundation 0x0000000185c642f4+ 160 libobjc.A.dylib 0x00000001974880e4 objc_exception_throw + 60 CoreFoundation 0x0000000185c64218 + 0 Foundation 0x0000000186a9dfb4 + 152 Xmen 0x10073fb30 Xmen + 7600944 Xmen 0x1006bbbf4 Xmen + 7060468 UIKit 0x000000018a9a47fc + 60 UIKit 0x000000018a9a512c + 104 UIKit 0x000000018a6b2b6c + 88 UIKit 0x000000018a9a4fd4 + 444 UIKit 0x000000018a78e274 + 1012 UIKit 0x000000018a999aac + 2904 UIKit 0x000000018a785268 + 172 UIKit 0x000000018a6a1760 + 580 QuartzCore 0x0000000189fe9e1c + 152 QuartzCore 0x0000000189fe4884 + 320 QuartzCore 0x0000000189fe4728 + 32 QuartzCore 0x0000000189fe3ebc + 276 QuartzCore 0x0000000189fe3c3c + 528 QuartzCore 0x0000000189fdd364 + 80 CoreFoundation 0x0000000185c1c2a4 + 32 CoreFoundation 0x0000000185c19230 + 360 CoreFoundation 0x0000000185c19610 + 836 CoreFoundation 0x0000000185b452d4 CFRunLoopRunSpecific + 396 GraphicsServices 0x000000018f35b6fc GSEventRunModal + 168 UIKit 0x000000018a70afac UIApplicationMain + 1488 Xmen 0x1008cf9c0 Xmen + 9238976 libdyld.dylib 0x0000000197b06a08 + 4 ) dSYM UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85 CPU Type: arm64 Slide Address: 0x0000000100000000 Binary Image: Xmen Base Address: 0x000000010007c000
是不是看的一臉懵逼,下面我來教大家如何結合crash log 與 dYSM文件 來分析定位出代碼崩潰在哪一個文件的哪一行代碼
提取崩潰日志中有用的信息
NSConcreteMutableAttributedString addAttribute:value:range:: nil value 崩潰的原因是value為nil
" 4 Xmen 0x10073fb30 Xmen + 7600944" 它指出了應用名稱,崩潰時的調用方法的地址,文件的地址以及方法所在的行的位置,我們需要的是這一個:"0x10073fb30"。
"dSYM UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85"。
"CPU Type: arm64"。
開始分析
打開終端進入到你的dYSM文件的目錄下面:
cd /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs
驗證下崩潰日志中的UUID與本地的dYSM文件是否是相匹配的:
"Xmen"為你的app名稱
dwarfdump --uuid Xmen.app.dSYM
結果是:
UUID: BFF6AE00-8B5F-39BD-AFD0-27707C489B25 (armv7) Xmen.app.dSYM/Contents/Resources/DWARF/Xmen UUID: 30833A40-0F40-3980-B76B-D6E86E4DBA85 (arm64) Xmen.app.dSYM/Contents/Resources/DWARF/Xmen
發現與我們日志中的:UUID和CPU Type是相匹配的
查找錯誤信息
dwarfdump --arch=arm64 --lookup 0x10073fb30 /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen
"arm64"與"0x1008cf9c0"分別對應於上面我們從日志中提取出來的有用信息
"/Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen"對應於你本地dYSM文件目錄
"Xmen"對應於你的app名稱
結果像下面這樣:
File: /Dandy/XMEN/上線版本/2.0.17_105/aaaa.xcarchive/dSYMs/Xmen.app.dSYM/Contents/Resources/DWARF/Xmen (arm64) Looking up address: 0x000000010073fb30 in .debug_info... found! 0x00219b05: Compile Unit: length = 0x00003dd0 version = 0x0002 abbr_offset = 0x00000000 addr_size = 0x08 (next CU at 0x0021d8d9) 0x00219b10: TAG_compile_unit [107] * AT_producer( "Apple LLVM version 8.0.0 (clang-800.0.42.1)" ) AT_language( DW_LANG_ObjC ) AT_name( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" ) AT_stmt_list( 0x001272a9 ) AT_comp_dir( "/Dandy/checkSvn/IOS/xmen" ) AT_APPLE_major_runtime_vers( 0x02 ) AT_low_pc( 0x000000010072b8ac ) AT_high_pc( 0x000000010074e350 ) 0x0021aec5: TAG_subprogram [119] * AT_low_pc( 0x0000000100739810 ) AT_high_pc( 0x000000010074006c ) AT_frame_base( reg29 ) AT_object_pointer( {0x0021aee3} ) AT_name( "-[DSSellerOrderSectionHeaderView updateContentWithOrderData:isEdit:]" ) AT_decl_file( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" ) AT_decl_line( 248 ) AT_prototyped( 0x01 ) 0x0021af36: TAG_lexical_block [138] * AT_ranges( 0x00008640 [0x000000010073cf90 - 0x000000010073fb88) [0x000000010073fbc0 - 0x000000010073fbc4) End ) Line table dir : '/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View' Line table file: 'DSSellerOrderSectionHeaderView.m' line 680, column 9 with start address 0x000000010073faf8 Looking up address: 0x000000010073fb30 in .debug_frame... not found.
我們來從終端結果來分析出我們想要的結果:
這一行告訴我們崩潰的代碼所在的文件的目錄
Line table dir : '/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View'
這一行告訴我們崩潰代碼所在的具體文件
AT_decl_file( "/Dandy/checkSvn/IOS/xmen/Xmen/Modules/StoreManage/SellerOrder/View/DSSellerOrderSectionHeaderView.m" )
這一行告訴我們崩潰代碼是在哪一個方法裡面
AT_name( "-[DSSellerOrderSectionHeaderView updateContentWithOrderData:isEdit:]" )
這一行告訴我們崩潰代碼具體在哪一行了
Line table file: 'DSSellerOrderSectionHeaderView.m' line 680, column 9 with start address 0x000000010073faf8
好的,現在我們分析到了崩潰代碼在哪一行了,下面我們來找一找bug
查找bug
我們的代碼都應該有托管平台,每個版本上線都需要打一個tag,這是一個好習慣。下面我拉下我崩潰的對應版本的tag,找到崩潰代碼那一行:
結合崩潰日志中告訴我:崩潰的原因是value為nil,發現是因為receiverTelephone字段中有中文導致轉url時為nil導致的,下面的解bug就看各自本領啦。
結語
希望對您有幫助,謝謝支持~