天天看點

iOS通過dSYM檔案分析crash

http://blog.csdn.net/hjy_x/article/details/20929095

重點是dwarfdump --uuid指令

我們在ios開發中會碰到的很多crash問題,如果Debug調試模式的話,我們可以往往很容易的根據log的輸出定位到導緻crash的原因,但對于已經上線的應用,或者是release環境包導緻的crash,我們就需要一些特殊的手段來通過crash log進行分析定位了。

通過參考網上的一些資料,總結了一下,下面介紹一下通過dSYM檔案以及crash log分析定位的方法。

1.導出crash log

通過Xcode的Organizer檢視某台iphone裝置的DeviceLog,選擇需要的crash log,導出XXX.crash檔案。

2.找到對應的app檔案

找到目前iphone裝置上安裝的ipa檔案,更改檔案字尾名為zip,解壓後得到Payload檔案夾,你需要的app檔案就在其中了。

3.找到對應build版本的dSYM檔案

dSYM檔案是iOS編譯後儲存16進制函數位址映射資訊的檔案,每次應用程式build後,都會生成對應的xxx.app, xxx.app.dSYM檔案。

4.确定dSYM、app以及crash檔案的關系

每一個xx.app, xxx.app.dSYM檔案都擁有相應的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:中的第一行尖括号内。如:

armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>

将對應的xxx.app.dSYM檔案以及xxx.app檔案以及xxx.crash檔案拷貝到同一檔案夾中,如:~/Desktop/DebugLog。

5.通過symbolicatecrash分析crash檔案

Xcode有自帶的symbolicatecrash工具,可以通過dSYM檔案将crash檔案中的16進制位址轉換成可讀的函數位址。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)

該檔案是隐藏檔案,可以通過如下指令查找并拷貝到系統目錄下,并建立快捷方式。

1)打開終端,進入到symbolicatecrash工具所在的檔案夾目錄

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

2)查找确認是否存在symbolicatecrash

ls -al | grep symbolicatecrash

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

sudo cp symbolicatecrash /usr/bin/symbolicatecrash

4)設定DEVELOPER_DIR系統變量

cd ~/

vi .bash_profile

并輸入如下内容

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"

儲存并退出

source .bash_profile

5)重新開機終端,确認是否已正确設定DEVELOPER_DIR系統變量

echo $DEVELOPER_DIR

檢視輸出結果是否為/Applications/Xcode.app/Contents/Developer

6)檢視PATH系統變量是否存在如下路徑/usr/bin

echo $PATH

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

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

8)上述準備工作完成後,進入dSYM和crash檔案對應的檔案夾目錄,如

cd ~/Desktop/DebugLog

9)執行如下指令,即可正确解析crash檔案

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

注意:symbolicatecrash的參數順序,否則會報類似如下錯誤

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.

今天就先到這裡,希望對大家有所幫助。

繼續閱讀