對於我們iOS開發者來說,最心碎的事莫過於蘋果審核一個星期后上架app store,而第二天就報出閃退bug。一周前我剛經歷過,而且最坑的是由於第一次做個人開發,經驗不足,沒有集成友盟的分析SDK,還好有幾個好心同事下載了,然后果然有兩台機器上出現了閃退。真是天無絕人之路,最重要的crash文件有了。下面我就來詳細描述一下具體的心路歷程以及分析方法。
iOS app的所有崩潰記錄都會記錄在設備上,所以對於和我一樣沒有集成讓用戶發送崩潰報告功能的iOS開發者來說,要獲得crash文件就必須先連上崩潰過的機器,然后打開Xcode,選擇Window -> Devices(如果是Xcode6以下,則是Window -> Organizer -> Devices),選擇你自己的機器,然后點擊View Device Logs,這時候會打開一個小窗口,這就是你機器上至目前為止存的所有app的崩潰信息了。如果是好久沒看過這個信息,打開后還要讀取好久才能完全讀完,總之,找到你的app最后一次崩潰記錄,右鍵導出。(先不要在意下圖的信息,我只是隨便找了一個)
我們先看一眼導出來的.crash文件,上半部分都是一些基本信息(基本沒用),重點看下崩潰部分的記錄,如下圖(是下圖,不是上圖!)
看紅框里的,隱隱有種不翔的預感,很像是數組越界之類的問題啊,可下邊幾行寫的都是啥,這怎么定位問題啊。先不管了,先在桌面上建個文件夾,就叫crash吧,然后把這個導出的.crash文件扔進去。想要再詳細點的記錄還缺幾樣東西呢。。。
找到你上次發布的ipa(如果實在沒有了就再從Archives里導出來一個,但一定要保證是你上次發布用的那個),右鍵 -> 打開方式 -> 歸檔實用工具(就是解壓縮),然后把Payload文件夾下的.app文件也扔到剛剛的crash文件夾里。
接下來還需要dSYM文件,還是在Archives里,找到發布用的那個,右鍵Show in Finder,如圖
然后對文件夾中的這個.xcarchive文件右鍵,顯示包內容,就可以看到一個名為dSYMs的文件夾,把里面的.dSYM文件拷出來,還是放到桌面的crash文件夾里。好了,還剩一個重頭了,就是標題上說的symbolicatecrash工具。
symbolicatecrash是一個隱藏工具,它在我的Mac中的具體路徑如下(Xcode6.1.app請換成你的Xcode名稱)
/Applications/Xcode6.1.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
你也可以在終端中輸入命令搜索:
find /Applications/Xcode6.1.app -name symbolicatecrash -type f
把這個路徑拷貝一下,然后粘到Finder的“前往文件夾”下,前往,就可以看到symbolicatecrash工具了,現在把它也拷到桌面的crash文件夾里。至此,crash文件夾里現在有4個文件了,分別是.app, .crash, .dSYM, symbolicatecrash。接下來就是用終端敲命令,生成更易分析的crash。
首先用cd命令進入到crash文件夾下,然后輸入以下命令
./symbolicatecrash /Users/xxxx/Desktop/crash/InOrder.crash /Users/xxxx/Desktop/crash/InOrder.app.dSYM > Control_symbol.crash
上述命令中,"xxxx"和"InOrder"請自行替換成對應的名稱。運行,這時候終端可能會報錯Error: "DEVELOPER_DIR" is not defined at /usr/local/bin/symbolicatecrash line 53. 這時候在終端中再輸入如下(Xcode6.1.app依然是要替換成實際名稱)
export DEVELOPER_DIR="/Applications/Xcode6.1.app/Contents/Developer"
然后再跑一下剛剛的那個命令,這時候看一下桌面的crash文件夾下就會多出一個名為“Control_symbol.crash”的文件,這就是可定位問題的crash文件了,我們打開看一下。
現在紅框里原來的那些亂七八糟的東西已經“翻譯”成了崩潰在具體的哪一個.m文件的哪一行。下面就是進行合理的猜想和調試了,比如我的崩潰就是因為這個第三方時間選擇控件使用截取字符串的形式來獲得時間,像09:23 PM就被固定的拆成了時、分、上下午標識3段,結果用戶使用24小時制的時候,時間就成了21:23,沒了上下午標識,array[2]超出下標妥妥的閃退。想想我腦洞也是蠻大的,這種問題原因都被猜到了。。。
如果還有哪里寫得不明白的可以在下邊評論中回復~~