蘋(píng)果iOS App開(kāi)發(fā)難免會(huì)遇到Bug,需要進(jìn)行調(diào)試。筆者曾經(jīng)遇到一個(gè)問(wèn)題是提交到App Store審核的App會(huì)報(bào)錯(cuò),但是在本地測(cè)試,哪怕是用TestFlight下載提交的那個(gè)版本測(cè)試,也不會(huì)報(bào)錯(cuò)。蘋(píng)果審核員提供了幾個(gè)crash的文件,建議我們進(jìn)行問(wèn)題排查。這就杯具了。因?yàn)殚_(kāi)發(fā)人員在發(fā)布的時(shí)候,在設(shè)置中設(shè)置“Strip Debug Symbols During Copy”中“Release”為“Yes”。
所以,打開(kāi)crash文件一看,在自己的APP那里,顯示的都是一堆內(nèi)存地址,像“0x10004000”這樣。
這該如何處理呢?
首先必須認(rèn)識(shí)到,crash文件的解讀離不開(kāi)“Symbolication”(符號(hào)化)。沒(méi)有符號(hào)化的crash文件就象上圖一樣,完全沒(méi)法理解。而如果正確的符號(hào)化了,就會(huì)變成下圖的樣子:
符號(hào)化的關(guān)鍵是一個(gè)叫做“.dSYMfile”的文件,這是在打包(Archieve)時(shí)一并生成的。一般情況下,Xcode的默認(rèn)配置,打包(Archieve)都會(huì)選擇“Release”的配置,而“Release”配置會(huì)默認(rèn)設(shè)置“Strip Debug Symbols During Copy”為“Yes”,這樣生成的binary實(shí)際上是不能提供符號(hào)信息的。
遇到這種情況,可以按照以下步驟處理:
1)獲取和App Store上的版本一致的代碼包。配置管理這個(gè)時(shí)候就顯出重要性了:)(所有的代碼都必須做配置管理,每一次發(fā)布都要打Tag!!)。
2)修改“Strip Debug Symbols During Copy”下“Release”為“No”。
3)重新打包(Archieve)。
4)打開(kāi)“Windows”->“Devices”,選擇開(kāi)發(fā)機(jī),點(diǎn)擊右側(cè)的“View Device Logs”。
5)將crash文件拖入左側(cè),并點(diǎn)擊“All Logs”。這時(shí),就可以看到右側(cè)原來(lái)不可讀內(nèi)容變成可讀的代碼,并且定位到了代碼行。
6)如果還是僅有內(nèi)存地址,那么就在左側(cè)的crash記錄上點(diǎn)擊右鍵,選擇“Re-Symbolicate Log”。如下圖:
有了明確的crash記錄做指導(dǎo),我們很快就定位到了真正問(wèn)題所在。快速地解決了問(wèn)題。
By the way:上圖所示的問(wèn)題實(shí)際上是百度的逆地址查詢(xún)有可能返回空字符串的城市名稱(chēng),坑爹的是,百度給出的結(jié)果狀態(tài)卻是正確的。但這空的城市名稱(chēng)實(shí)際上是沒(méi)法處理的。在國(guó)內(nèi),大多數(shù)情況下,可能都能得到正確值,但蘋(píng)果審核員在米國(guó)啊!!!
附上蘋(píng)果官方文檔鏈接: