- app在本地調(diào)試debug模式下亲桦,我們很方便就可以定位到代碼崩潰位置,比如通過打全局?jǐn)帱c(diǎn)流昏,看控制臺輸出信息等粮坞。
- 當(dāng)app上架之后关顷,如果發(fā)生嚴(yán)重的bug,導(dǎo)致軟件閃退,我想大部分同學(xué)第一想法就是去相關(guān)模塊去一行一行的查看代碼有沒有問題吧
現(xiàn)在我們利用.crash
文件 .dSYM
文件和.app文件來一步定位到軟件奔潰位置
- 首先看看這幾個文件都是做什么的
-
.crash
文件 :記錄了app奔潰信息莹规,我們主要看程序奔潰地址- 可以通過
xcode->Window->Organizer->Crashes
獲取.crash
文件 - 連上手機(jī)
xcode->window->Devices->view Device logs
獲取 - 也可以通過iTunes connect 中獲取
- 可以通過
-
- 什么是
.dSYM
文件 dSYM 文件分析工具
Xcode編譯項(xiàng)目后良漱,我們會看到一個同名的 dSYM 文件,dSYM 是保存 16 進(jìn)制函數(shù)地址映射信息的中轉(zhuǎn)文件高镐,我們調(diào)試的 symbols 都會包含在這個文件中儡陨,并且每次編譯項(xiàng)目的時候都會生成一個新的 dSYM 文件,位于 /Users/<用戶名>/Library/Developer/Xcode/Archives 目錄下残吩,對于每一個發(fā)布版本我們都很有必要保存對應(yīng)的 Archives 文件 ( AUTOMATICALLY SAVE THE DSYM FILES 這篇文章介紹了通過腳本每次編譯后都自動保存 dSYM 文件)财忽。
- 通過`Xcode -> window ->organizer ->Archives ->選擇對應(yīng)Archives版本 右鍵show finder ->右鍵 顯示包內(nèi)容 -> dSYMs文件夾中就是我們要找的.dSYM文件`
-
.app
文件:找到我們打包生成的.ipa
文件->后綴名改為.zip
->打卡zip文件 里面就是我們要找的.app
文件
- ** 一般情況下 在crash文件中我們可以找到奔潰位置 如下圖的綠色夠夠**
** 大部分情況下,我們看到的都是上圖兩個紅叉標(biāo)識的那樣 只有十六進(jìn)制的函數(shù)地址泣侮,那么現(xiàn)在我們就要想辦法通過函數(shù)地址找到方法名和類名即彪,也就是給crash進(jìn)行符號化 **
-
** 使用symbolicatecrash工具符號化crash文件 **
- 在桌面上創(chuàng)建文件夾crash 把對應(yīng)的creah文件,dSYM文件活尊,和.app文件放到crash文件夾中
- 在終端 輸入
find /Applications/Xcode.app -name symbolicatecrash -type f
查看symbolicatecrash工具的位置隶校,** 不同版本Xcode symbolicatecrash 位置不同 ** - ** 我這里的位置是 **
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
進(jìn)入這個位置找到symbolicatecrash工具 也復(fù)制到桌面crash 文件夾中
-
在終端輸入下面的命令
cd /Users/mac/Desktop/crash
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
這個時候文件夾中會有symbol.crash文件,是經(jīng)過符號化后的crash文件蛹锰,我們可以很清楚的看到奔潰的方法名和類名以及行數(shù)
** 但是有時候深胳,我們可能得到的是一個空的
symbol.crash
文件,或者是沒有經(jīng)過符號化的symbol.crash文件铜犬,太晚了舞终,改天再加上解決辦法 **-
打印
.app
文件.dSYM
文件的UUID-
.app
文件 終端命令:dwarfdump --uuid .app文件(路徑)
-
.dSYM
文件 終端命令:dwarfdump --uuid .dSYM文件 (路勁)
- UUID 號,可以在.crash文件中 找到
- 1.
"slice_uuid":"9bfd01a9-4203-3d18-89ca-e0c9e01e0790"
Binary Images: 0x100044000 - 0x1004effff QRCodeCar arm64 <9bfd01a942033d1889cae0c9e01e0790>
如上面的 9bfd01a942033d1889cae0c9e01e0790 就是UUID
- 1.
-
-
使用atos 工具定位奔潰位置
使用symbolicatecrash
工具可以得到所有線程的方法信息癣猾。
使用atos 工具只能得到單條線程方法信息
過程如下:找到下圖的奔潰位置
- 終端命令:atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>
- 如:
atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc
輸出:-[AtomicElementViewController myTransitionDidStop:finished:context:]
- 如:
優(yōu)點(diǎn)敛劝,只需要.dSYM 文件,外加一句終端命令就可定位奔潰信息纷宇,簡單方便快捷夸盟。
缺點(diǎn),每次只能定位一條像捶。上陕。桩砰。
- 第三方定位奔潰位置
- 騰訊bugly接入
- 按照ugly接入文檔,集成到自己的項(xiàng)目中唆垃,無論是模擬器五芝,內(nèi)測還是上架appStroe都可以收集到奔潰信息
- 如圖:我的內(nèi)測版本
很清楚,我的app奔潰在了類名為
DXQR_LoginViewController
中辕万,方法名為p_loginNetMethod
在該類的第32行枢步,我可以直接打開工程去該位置去修復(fù)即可,是不是很方便=ツ颉W硗尽!
參考: