iOS_怎麼分析AppStore上面的Crash Log
阿新 • • 發佈:2019-02-18
如果使用者的手機同意了傳送診斷內容,那麼,app崩潰的時候就會把log傳送的app store,然後我們就能夠下載,分析。
以下是crash log的一部分
Last Exception Backtrace: 0 CoreFoundation 0x30acaf46 exceptionPreprocess + 126 1 libobjc.A.dylib 0x3af0b6aa objc_exception_throw + 34 2 CoreFoundation 0x30a0152e -[__NSArrayM objectAtIndex:] + 226 3 appName 0x000f462a 0x4000 + 984618 4 appName 0x00352aee 0x4000 + 3468014 … 18 appName 0x00009404 0x4000 + 21508
其中,第3、4、18行的16進位制地址代表什麼內容我們不得而知,需要去解析才能獲得。
1、使用工具symbolicatecrash
使用工具synbolicatecrash必須依賴於.dSYM檔案,.dSYM檔案是archive的時候從.archive檔案中提取的,每次release版本的時候讀需要儲存好它,以便今後分析各個版本的crash log。 synbolicatecrash工具是xcode自帶的一個工具,我的Xcode6.3在以下目錄中能找到它。/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/synbolicatecrash
synbolicatecrash是一個獨立的工具,可以拷貝出來使用。 我們把synbolicatecrash、.crash檔案、.dSYM檔案、.app檔案(可以從.dSYM檔案中提取)放到一個資料夾下。 首先讓我們確認下.crash檔案、.dSYM檔案、.app檔案的UUID是否相同,只有UUID相同了才能解析。 提取.app檔案的UUID:
執行命令:xcrun dwarfdump --uuid appname.app 得到結果:UUID: E70CA32E-303D-387D-9A60-7D4402511F42 (armv7) appname.app
提取.dSYM檔案的UUID:
執行命令:xcrun dwarfdump --uuid appname.app.dSYM 得到結果:UUID: E70CA32E-303D-387D-9A60-7D4402511F42 (armv7) appname.app.dSYM/Contents/Resources/DWARF/appname.app
提取.crash檔案的UUID:
可以看到以上三個檔案的UUID是相同的,代表我們可以去解析了。執行命令:grep "appName armv" *crash 或者 grep --after-context=2 "Binary Images:" *crash
得到結果:appname.crash:0x9000 - 0x320fff appname armv7 <e70ca32e303d387d9a607d4402511f42> /var/mobile/Containers/Bundle/Application/772F5038-6FA1-4D18-9057-F57BAF1EC240/appname.app/appname
其中<e70ca32e303d387d9a607d4402511f42>就是UUID
提取.crash檔案的UUID不僅可以用命令列,還可以直接開啟.crash檔案,找到Binary Images:區域,同樣會有以上命令列得出的結果
先執行命令:export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer 然後再執行命令:symbolicatecrash appname.crash appname.app.dSYM > appname.log 這樣解析過後的crash log就在appname.log檔案中了。
2、使用命令列工具atos
使用atos之前,先理解下什麼是模組載入地址。模組載入地址就是每次app啟動都會載入主模組(main module)到一個地址,這個地址相當於一個起始地址。Last Exception Backtrace:
0 CoreFoundation 0x30acaf46 exceptionPreprocess + 126
1 libobjc.A.dylib 0x3af0b6aa objc_exception_throw + 34
2 CoreFoundation 0x30a0152e -[__NSArrayM objectAtIndex:] + 226
3 appName 0x000f462a 0x4000 + 984618
4 appName 0x00352aee 0x4000 + 3468014
…
18 appName 0x00009404 0x4000 + 21508
上面crash log中的0x4000就是模組載入地址。 先執行命令: xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName 0x4000 -arch armv7
然後再輸入: 0x00352aee
得出結果: -[UIScrollView(UITouch) touchesEnded:withEvent:] (in appName) (UIScrollView+UITouch.h:26)
這樣就解析出來了。 有時候的crash log是下面這樣的:
0 appname 0x001b27d7 appname + 1394647
1 appname 0x001b2f05 appname + 1396485
看不出起始地址,只有最終地址和地址偏移量。但是起始地址可以算出來。 先把1394647轉換成16進位制,在用0x001b27d7減去前面轉換的值,得出的值就是起始地址。