基本操作:
1、電腦安裝好Xcode,連接好手機設備
2、打開Xcode,點擊Window-Devices and Simulators
3、選中手機設備,點擊View Device Logs,即可查看手機crash日志
這里有個問題,我們打印出來的crash日志里面,有代碼的函數名,但有些卻只有函數地址。
原因就在於我安裝到手機上的app並不是由我當前這台電腦編譯打包出來的,沒有**.app.dSYM這個文件,所以根本沒有辦法把地址同步解析出來。
處理方法:
1、在桌面創建一個Crash文件夾,然后去編譯打包的機器上打開Xcode-Window-Organizer,在Archives找到App,右鍵Show in Finder
2、復制**.ipa和**.app.dSYM到Crash文件夾
3、把symbolicatecrash文件(找到文件的方法見最下面)以及待解析的**.crash文件也一並復制到Crash目錄下
4、檢測dYSM文件和crash文件是否對應
從終端進入到剛剛創建的Crash文件中,輸入dwarfdump --uuid **.app.dSYM。如果輸出的uuid和crash文件中的一致,則可以解析出正確的crash文件。crash文件中的uuid位於Binary Images中的第一行尖括號內。
5、執行命令:./symbolicatecrash **.crash **.app.dSYM > crashLog.crash
如果解析成功了,就會有函數名了,像下面這樣
注意,一般情況下,第一次使用symbolicatecrash會產生一個error,如下的錯誤信息
Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
解決辦法是輸入 export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
再執行 ./symbolicatecrash **.crash **.app.dSYM > crashLog.crash 就能解析了。
怎樣正確找到需要的symbolicatecrash文件呢?
首先要知道一點,之所以在View Device Logs面板可以看到crash日志,主要的功臣就是一個叫symbolicatecrash的可執行文件。集成在Xcode中的symbolicatecrash有點類似於集成在Android Studio中的adb工具包一樣,並且兩者都是可以單獨拿出來使用的。
首先,找到symbolicatecrash文件的位置:find /Applications/Xcode.app -name symbolicatecrash -type f
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/iOSSupport/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
Xcode6.0之前:
"Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKit.framework->Versions->A->Resources"
或者
"Contents->Developer->Platforms->iPhoneOS.platform->Developer->Library->PrivateFrameworks->DTDeviceKitBase.framework->Versions->A->Resources"
Xcode6.0之后,改成 "Contents/SharedFrameworks"
只要找到"symbolicatecrash" 文件, 復制然后粘貼到一個 "Crash" 文件夾里面。
這里我用的是Xcode11,所以使用的是最后一個,把它拷貝到Crash文件夾就ok了。
假如查看crash log中的崩潰線程是這樣的:
Thread 0 Crashed: 0 libobjc.A.dylib 0x00003ec0 objc_msgSend + 24 1 MyApp 0x000036d2 0×1000 + 9938
我們得到了用戶發生崩潰情況的內存地址:0x000036d2
然后回到我們應用程序的build目錄,目錄下一定要包含**.app和**.app.dSYM兩個文件。在控制台使用dwarfdump命令,就能解析出內存地址,如:
dwarfdump –lookup 0x000036d2 –arch armv6 MyApp.app.dSYM