iOS通過dSYM文件分析crash

重點(diǎn)命令: dwarfdump --uuid

如果Debug調(diào)試模式的話,我們可以往往很容易的根據(jù)log的輸出定位到導(dǎo)致crash的原因,但對(duì)于已經(jīng)上線的應(yīng)用,或者是release環(huán)境包導(dǎo)致的crash,我們就需要一些特殊的手段來通過crash log進(jìn)行分析定位了。

下面介紹一下通過dSYM文件以及crash log分析定位的方法:

1.導(dǎo)出crash log

通過Xcode的Organizer查看某臺(tái)iphone設(shè)備的DeviceLog,選擇需要的crash log,導(dǎo)出XXX.crash文件。

2.找到對(duì)應(yīng)的app文件

找到當(dāng)前iphone設(shè)備上安裝的ipa文件,更改文件后綴名為zip,解壓后得到Payload文件夾,你需要的app文件就在其中了。

3.找到對(duì)應(yīng)build版本的dSYM文件

dSYM文件是iOS編譯后保存16進(jìn)制函數(shù)地址映射信息的文件,每次應(yīng)用程序build后,都會(huì)生成對(duì)應(yīng)的xxx.app, xxx.app.dSYM文件。

4.確定dSYM、app以及crash文件的關(guān)系

每一個(gè)xx.app, xxx.app.dSYM文件都擁有相應(yīng)的uuid,crash文件也有uuid,只有三者uuid一至才表明之三者可以解析出正確的日志文件。

查看xx.app文件的uuid的方法,在terminal中輸入命令:

dwarfdump --uuid xxx.app/xxx (xxx工程名)

查看xx.app.dSYM文件的uuid的方法,在terminal中輸入命令:

dwarfdump --uuid xxx.app.dSYM (xxx工程名)

而.crash的uuid位于,crash日志中的Binary Images:中的第一行尖括號(hào)內(nèi)。如:

armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>

將對(duì)應(yīng)的xxx.app.dSYM文件以及xxx.app文件以及xxx.crash文件拷貝到同一文件

夾中,如:~/Desktop/DebugLog。

5.通過symbolicatecrash分析crash文件

Xcode有自帶的symbolicatecrash工具,可以通過dSYM文件將crash文件中的16進(jìn)制地址轉(zhuǎn)換成可讀的函數(shù)地址。symbolicatecrash工具位于:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash(Xcode 4.5)

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash(Xcode 5.0)

該文件是隱藏文件,可以通過如下命令查找并拷貝到系統(tǒng)目錄下,并建立快捷方式。

1)打開終端,進(jìn)入到symbolicatecrash工具所在的文件夾目錄

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/

2)查找確認(rèn)是否存在symbolicatecrash

ls -al | grep symbolicatecrash

3)將symbolicatecrash工具拷貝到/usr/bin目錄下

sudo cp symbolicatecrash /usr/bin/symbolicatecrash

4)設(shè)置DEVELOPER_DIR系統(tǒng)變量

cd ~/
vi .bash_profile

并輸入如下內(nèi)容
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"

保存并退出

source .bash_profile

5)重啟終端,確認(rèn)是否已正確設(shè)置DEVELOPER_DIR系統(tǒng)變量

echo $DEVELOPER_DIR

查看輸出結(jié)果是否為/Applications/Xcode.app/Contents/Developer

6)查看PATH系統(tǒng)變量是否存在如下路徑/usr/bin

echo $PATH

7)如果PATH不存在如下路徑/usr/bin,可在~/.bash_profile中添加如下代碼

export PATH="/usr/bin:$PATH"

保存并退出

source .bash_profile

8)上述準(zhǔn)備工作完成后,進(jìn)入dSYM和crash文件對(duì)應(yīng)的文件夾目錄,如

cd ~/Desktop/DebugLog

9)執(zhí)行如下命令,即可正確解析crash文件

symbolicatecrash xxx.crash xxx.app.dSYM > test.txt

*注意:symbolicatecrash的參數(shù)順序,否則會(huì)報(bào)類似如下錯(cuò)誤

Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 678.

Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 681.

Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 685.

Use of uninitialized value in pattern match (m//) at /usr/bin/symbolicatecrash line 404.

Use of uninitialized value in scalar assignment at /usr/bin/symbolicatecrash line 418.

No crash report version in XXX.app.dSYM/ at /usr/bin/symbolicatecrash line 954.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容