EXC_BAD_ACCESS的本質詳解以及僵尸模式調試原理

原文:What Is EXC_BAD_ACCESS and How to Debug It

有時候,你會遇到由EXC_BAD_ACCESS造成的崩潰。 這篇文章會告訴你什么是EXC_BAD_ACCESS,以及它產生的原因。我還會提供一些EXC_BAD_ACCESS錯誤的解決方案。

1. 什么是 EXC_BAD_ACCESS?

一旦你理解EXC_BAD_ACCESS的本質,你就會更好地理解這個模糊的名詞。這里有一個極為簡單的解釋,也有一個技術層面的解釋。我們首先從簡單的解釋開始說起。

2.簡單的解釋

不管什么時候當你遇到EXC_BAD_ACCESS這個錯誤,那就意味著你向一個已經釋放的對象發送消息。這是最常見的情況,但也有例外,我們將在稍后討論。

3. EXC_BAD_ACCESS的本質

技術層面的解釋有些復雜。在C和Objective-C中,你一直在處理指針。指針無非是存儲另一個變量的內存地址的變量。當您向一個對象發送消息時,指向該對象的指針將會被引用。這意味著,你獲取了指針所指的內存地址,并訪問該存儲區域的值。

當該存儲器區域不再映射到您的應用時,或者換句話說,該內存區域在你認為使用的時候卻沒有使用,該內存區域是無法訪問的。 這時內核會拋出一個異常( EXC ),表明你的應用程序不能訪問該存儲器區域(BAD ACCESS) 。

總之,當你碰到EXC_BAD_ACCESS ,這意味著你試圖發送消息到的內存塊,但內存塊無法執行該消息。但是,在某些情況下, EXC_BAD_ACCESS是由被損壞的指針引起的。每當你的應用程序嘗試引用損壞的指針,一個異常就會被內核拋出。

4.調試EXC_BAD_ACCESS

調試EXC_BAD_ACCESS可能會非常棘手和令人沮喪。然而,現在EXC_BAD_ACCESS不再是一個謎,它沒有想象中的那么可怕。

你需要知道的第一件事是您的應用程序并不一定是在崩潰的那一刻,無法訪問內存區域。這就是常使調試EXC_BAD_ACCESS變得困難的原因。

同樣受損指針也是如此。當你的指針被損壞時,您的應用程序不會崩潰。同時,如果您在應用程序中來回傳遞一個受損的指針也不會崩潰。當應用程序試圖引用受損指針的時候,就會發生奔潰。

5.僵尸調試模式

僵尸調試模式在過去幾年中得到了普及,事實上它們已經出現在Xcode上超過十年。僵尸聽起來有點戲劇性,但它實際上是為幫助我們調試EXC_BAD_ACCESS功能而取得一個偉大的名字。讓我來解釋它是如何工作的。

在Xcode中,您可以啟用僵尸對象,這意味著被釋放的對象將會以僵尸的形式被保留。換言之,保留釋放的對象就是為了調試。這里沒有涉及任何魔法。如果您向僵尸對象發送消息,你的應用程序將會由于EXC_BAD_ACCESS而崩潰。

這有什么好處嗎?讓EXC_BAD_ACCESS難以調試的原因是,你不知道你的應用程序試圖訪問哪個對象。僵尸對象在許多情況下解決這個問題。通過保留已釋放的對象,Xcode可以告訴你你試圖訪問哪個對象,這使的查找問題原因容易得多。

在Xcode中啟用僵尸對象是很容易的。注意,這可能會因的Xcode的版本而不同的。以下方法適用于Xcode的6和7,單擊左上角的Edit Scheme,并選中Edit Scheme。

在左側選中Run ,在上方打開 Diagnostics選項。要啟用僵尸對象,勾選 Enable Zombie Objects選框。

如果你現在遇到EXC_BAD_ACCESS ,在Xcode的控制臺輸出,告訴你該從哪里查找問題。看看下面的例子輸出。

2015-08-12 06:31:55.501 Debug[2371:1379247] -[ChildViewController respondsToSelector:] message sent to deallocated instance 0x17579780

在上面的例子中, Xcode告訴我們, respondsToSelector的消息:被發送到一個僵尸對象。然而,僵尸對象不再是ChildViewController類的一個實例。以前分配給ChildViewController實例的內存區域不再映射到您的應用程序。這為你了解問題產生的根本原因提供一個不錯的建議。

不幸的是,僵尸對象將無法保存您的一天每次崩潰的EXC_BAD_ACCESS的記錄。既然僵尸對象沒有這些方法,那么你可以采取其他的方法進行一些適當的分析。

6.分析

如果僵尸對象不能解決你的問題,那么問題的根源可能就不那么簡單了。在這種情況下,您需要仔細看看在應用程序崩潰時執行的代碼。這可能是繁瑣和耗時的。

為了幫助你發現你的代碼的問題,你可以使用Xcode來分析你的代碼,幫助你找到出現問題的地方。注意,Xcode分析項目,它會指出每一個潛在的可能出現的問題的地方。

使用Xcode來分析你的項目,從Xcode的 Product菜單選擇 Analyze或按 Shift-Command-B.Xcode的將需要片刻的時間,但是當它完成的時候你會在左邊的 Issue Navigator看到問題列表。由Analyze發現的問題用藍色高亮顯示。

當你點擊一個問題,Xcode的會指向問題代碼塊,這些正是你要的注意的地方。注意,Xcode僅僅是建議。在某些情況下,這是可能的,問題是不相關的,不固定。

如果你找不到造成EXC_BAD_ACCESS的錯誤,那就需要你仔細審視Xcode項目,分析其中發現的每一個問題。

7.結論

EXC_BAD_ACCESS是開發者面臨的一個共同的問題,它是手動內存管理固有的問題。雖然推行ARC內存管理方式 (自動引用計數)使得EXC_BAD_ACCESS沒那么頻繁,但他們并沒有真正的消失。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容