點(diǎn)贊評(píng)論外永,感覺有用的朋友可以關(guān)注筆者公眾號(hào) iOS 成長(zhǎng)指北兆衅,持續(xù)更新
原書為 iOS Crash Dump Analysis Book毁枯,已得作者授權(quán)磺陡,歡迎 star
當(dāng)近期的代碼修改導(dǎo)致應(yīng)用程序發(fā)生崩潰時(shí)沼本,我們可以很容易的對(duì)崩潰進(jìn)行分析然后找到相關(guān)代碼并進(jìn)行修改兢交。但是通常薪捍,崩潰只是由于操作環(huán)境的變化而出現(xiàn)。那可能是最煩人的。例如酪穿,應(yīng)用程序在辦公室中正常運(yùn)行凳干,但在客戶站點(diǎn)崩潰。我們沒有時(shí)間去探究為什么崩潰被济,但需要快速解決或提出解決方法救赐。當(dāng)探索一個(gè)新項(xiàng)目時(shí),會(huì)出現(xiàn)另一個(gè)常見的問題場(chǎng)景只磷。 在這里净响,我們沒有使用代碼庫(kù)的經(jīng)驗(yàn),但是在編譯和運(yùn)行應(yīng)用程序后立即會(huì)遇到崩潰問題喳瓣。
在本章中馋贤,我們將探討由于操作環(huán)境的變化而導(dǎo)致崩潰的可能原因。無(wú)需深入分析手頭問題的細(xì)節(jié)就可以解決許多問題畏陕。 實(shí)際上配乓,有時(shí)我們只需在取得進(jìn)展的同時(shí)進(jìn)行回顧,便可以追溯到根本原因惠毁。
故障排除
資源缺失問題
有些時(shí)候犹芹,我們的應(yīng)用程序由于資源缺失問題而在啟動(dòng)時(shí)崩潰。
我們應(yīng)該嘗試去編譯運(yùn)行項(xiàng)目中的所有的Xcode Target鞠绰。有時(shí)候腰埂,某個(gè)特定的 Target,會(huì)成為該項(xiàng)目整體環(huán)境不可獲取的一部分如果是這樣蜈膨,我們可以做一個(gè)注釋屿笼,以便稍后解決這些問題。
二進(jìn)制兼容問題
由于二進(jìn)制兼容的問題翁巍,有些時(shí)候驴一,我們的應(yīng)用程序會(huì)在啟動(dòng)時(shí)發(fā)生崩潰。
如果我們剛剛更新了我們的Xcode灶壶,或者在編譯好我們工程的同時(shí)拉代碼進(jìn)行了更新肝断。我們可以使用 Option-Command-Shift-K
命令編譯過程中產(chǎn)生的中間文件,目標(biāo)文件及可執(zhí)行文件驰凛,使得項(xiàng)目回到?jīng)]有編譯之前的狀態(tài)胸懈,然后重新編譯。
一般來(lái)說我們可以直接刪除
~/Library/Developer/Xcode/DerivedData
達(dá)到近似效果
只有模擬器有的問題
有些時(shí)候恰响,我們的應(yīng)用程序只在模擬器上發(fā)生崩潰趣钱。
這時(shí)候,我們應(yīng)該嘗試模擬器的 Hardware->Reset
功能對(duì)內(nèi)容和功能進(jìn)行重置渔隶。我們可以嘗試使用 iPad 模擬器來(lái)替代 iPhone模擬器羔挡,反之亦然。示例項(xiàng)目通常用于解釋特定技術(shù)间唉,而不會(huì)去考慮產(chǎn)品化或著通用性绞灼。
特定設(shè)備的問題
有些時(shí)候,我們的應(yīng)用程序只會(huì)在客戶設(shè)備上發(fā)生崩潰呈野。
我們可以檢查 Wi-Fi
設(shè)置或嘗試將 iPad 熱點(diǎn)連接到 iPhone低矮。在辦公室/家庭環(huán)境中開發(fā)我們的應(yīng)用程序時(shí),有時(shí)我們會(huì)忽略諸如連接或延遲之類的網(wǎng)絡(luò)問題被冒。如果這就是問題所在军掂,我們應(yīng)該記錄下來(lái)以便嘗試并修復(fù)這些問題。
用戶設(shè)備部署的問題
有些時(shí)候昨悼,我們的應(yīng)用程序僅在客戶設(shè)備上發(fā)生崩潰蝗锥。
當(dāng)我們將電腦與用戶的設(shè)備相連時(shí),我們可能正在進(jìn)行 Debug
環(huán)境的部署率触。這意味著推送通知的 tokens
將是開發(fā)環(huán)境而不是生產(chǎn)環(huán)境的推送 tokens
终议。這同時(shí)也意味著資源的訪問授權(quán)(例如,對(duì) Camera
相機(jī)功能的授權(quán))不再有效葱蝗,因?yàn)樗鼈兛赡芤呀?jīng)通過應(yīng)用程序的 TestFlight 版本或先前的App Store版本(生產(chǎn)版本)獲得了批準(zhǔn)穴张。
我們應(yīng)該嘗試通過 Command
-< 選擇左側(cè)面板中的 Run
,右側(cè)面板中的 Info
選項(xiàng)两曼,Build Configuration
設(shè)置 Release
(不是 Debug
)來(lái)切換部署配置皂甘。 我們還應(yīng)手動(dòng)檢查 iPad/iPhone
設(shè)置中的任何資源訪問授權(quán)。
特定語(yǔ)言環(huán)境的問題
有時(shí)候悼凑,客戶設(shè)備的特定的語(yǔ)言環(huán)境會(huì)導(dǎo)致崩潰的發(fā)生
錯(cuò)誤的語(yǔ)言環(huán)境中可能會(huì)缺失某些資源文件偿枕。此外,處理語(yǔ)言環(huán)境充斥著毫無(wú)征兆的特殊情況户辫。我們應(yīng)該嘗試將區(qū)域設(shè)置暫時(shí)更改為已知的語(yǔ)言區(qū)域益老。 當(dāng)你回歸問題時(shí)不要忘記做好筆記。
不同地區(qū)的用戶寸莫,NSCalendar 默認(rèn)的 firstWeekday 的值是不一致的捺萌,這個(gè)基于當(dāng)?shù)氐牧?xí)慣。如果你的 APP 的受眾更為廣泛膘茎,請(qǐng)注意這一點(diǎn)
對(duì)于崩潰的思考
從上面的例子中得到的教訓(xùn)就是我們需要在更廣泛的背景下去思考我們的代碼桃纯。我們應(yīng)該考慮應(yīng)用程序的運(yùn)行環(huán)境。 包括:
- 編譯后的代碼
- 代碼模塊之間的二進(jìn)制不兼容性(不同的語(yǔ)言版本披坏,編譯器和工具鏈)
- 捆綁或下載到應(yīng)用程序中的資源文件
- 構(gòu)建配置(例如
Release
或Debug
) - 網(wǎng)絡(luò)環(huán)境态坦,可用性/延遲/速度
- 應(yīng)用程序的允許使用的權(quán)限
- 應(yīng)用程序被拒絕的權(quán)限(在移動(dòng)設(shè)備管理安全環(huán)境中)
- 平臺(tái)變種
- 方向
- 前后端不同的操作模式
- 硬件性能(舊的慢速硬件與更快的新設(shè)備)
- 硬件組件(GPU,內(nèi)存棒拂,CPU伞梯,配件等)
- 地理位置相關(guān)問題
- 區(qū)域問題(語(yǔ)言環(huán)境等)
- 存在診斷設(shè)置
- 存在調(diào)試器或分析器
- 目標(biāo)設(shè)備的操作系統(tǒng)版本
作為樹立正確的思路以解決應(yīng)用程序崩潰的第一步玫氢,我們有必要解決上述每個(gè)操作環(huán)境差異,并試著記下這種差異是否會(huì)導(dǎo)致我們知道或懷疑可能發(fā)生的崩潰谜诫。這告訴我們漾峡,崩潰更多是關(guān)于環(huán)境而不是源代碼。另一個(gè)次要的見解是喻旷,我們?cè)侥軌蚋鶕?jù)特定的環(huán)境差異生成一系列假設(shè)生逸,我們就能更容易、更快地找到其他人看起來(lái)很神秘的崩潰的根本原因且预,而且我們幾乎是神奇的想出了問題可能出在哪里的建議槽袄。
以下是民間傳說中的一些奇怪的信息技術(shù)崩潰案例,以激發(fā)我們的欲望并讓我們展開思考:
基于不同語(yǔ)言環(huán)境的崩潰
俄語(yǔ)語(yǔ)言環(huán)境在日期處理期間導(dǎo)致崩潰锋谐。
這是因?yàn)?1984-04-01
被用來(lái)當(dāng)做哨兵日期遍尺。但是,在俄羅斯是沒有這樣的日期/時(shí)間涮拗,因?yàn)樵诙砹_斯當(dāng)天是沒有午夜的狮鸭,即沒有 1984-04-01 00:00:00
。這是因?yàn)槎砹_斯的夏令時(shí)開始于當(dāng)天的 1
點(diǎn)鐘多搀。
這是在 WecudosPro iPad 應(yīng)用程序開發(fā)期間在俄羅斯進(jìn)行測(cè)試時(shí)看到的
地理位置引起的崩潰
一臺(tái)計(jì)算機(jī)在每天的不同時(shí)間都會(huì)發(fā)生崩潰歧蕉。
這個(gè)問題實(shí)際上是因?yàn)檫@臺(tái)計(jì)算機(jī)被放置在一個(gè)有船只經(jīng)過的河口旁邊的窗戶。在漲潮時(shí)康铭,一艘軍艦將駛過惯退,其雷達(dá)將破壞電子設(shè)備從而導(dǎo)致計(jì)算機(jī)發(fā)生崩潰。
在 Kepner-Tregoe 正式的問題解決培訓(xùn)會(huì)上从藤,這個(gè)民間傳說故事被告知給在英國(guó)的 Sun Microsystems 客服中心的工程師們催跪。
總線噪音崩潰
當(dāng)計(jì)算機(jī)同時(shí)承受較大的網(wǎng)絡(luò)負(fù)載和磁盤負(fù)載時(shí),系統(tǒng)會(huì)發(fā)生崩潰夷野。
這個(gè)奔潰是由于磁盤損壞造成的懊蒸。每64字節(jié)的內(nèi)存中都會(huì)出現(xiàn)一個(gè)零。它是計(jì)算機(jī)的緩存行大小悯搔。由于內(nèi)存板接線錯(cuò)誤骑丸,導(dǎo)致旁邊的磁盤帶狀電纜在64字節(jié)邊界處產(chǎn)生噪音。
這是在 Sun Volume Systems Group 計(jì)算機(jī)的早期原型中看到的妒貌。
感謝你閱讀本文通危! ??