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/

(注意:在Xcode6及以後版本,這個變成了/Applications/Xcode.app/Contents/SharedFrameworks/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"

保存並退出

source .bash_profile

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.

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章