EXC_BAD_ACCESS詳解調(diào)試及僵尸模式

原文:What Is EXC_BAD_ACCESS and How to Debug It

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

1. 什么是 EXC_BAD_ACCESS?

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

2.保持簡單

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

3. EXC_BAD_ACCESS的本質(zhì)

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

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

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

4.調(diào)試EXCBADACCESS

調(diào)試EXCBADACCESS可能會非常棘手和令人沮喪的。然而,現(xiàn)在EXCBADACCESS不再是你一個謎,它沒有想象中的那么可怕。 你需要知道的第一件事是您的應用程序并不一定是在崩潰的那一刻,您的應用程序不可訪問內(nèi)存區(qū)域。這就是常使調(diào)試EXCBADACCESS如此困難的原因。 同樣受損指針也是如此。您的應用程序不會崩潰,因為指針走被損壞時。同時,如果您在應用程序來回傳遞一個受損的指針也不會崩潰。當應用程序試圖引用受損指針的時候,就會發(fā)生奔潰。

5.僵尸調(diào)試模式

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

在Xcode中,您可以啟用僵尸對象,這意味著被釋放的對象將會以僵尸的形式被保留。換言之,保留釋放的對象就是為了調(diào)試。這里沒有涉及任何魔法。如果您向僵尸對象發(fā)送消息時,你的應用程序?qū)捎贓XCBADACCESS而崩潰。

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

在Xcode中啟用僵尸是很容易的。注意,這可能會因的Xcode的版本而不同的。以下方法適用于Xcode的6和7,單擊左上角的Edit Scheme,并選中Edit Scheme。 在左側(cè)選中Run?,在上方打開?Diagnostics選項。要啟用僵尸對象,勾選?Enable Zombie Objects選框。

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

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

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

不幸的是,僵尸對象將無法保存您的一天每次崩潰的EXCBADACCESS的記錄。既然僵尸對象沒有這些伎倆,那么你可以采取其他的方法進行一些適當?shù)姆治觥?/p>

6.分析

如果僵尸對象不能解決你的問題,那么問題的根源可能就不那么簡單了。在這種情況下,您需要仔細看看在應用程序崩潰時執(zhí)行的代碼。這可能是繁瑣和耗時的。 為了幫助你發(fā)現(xiàn)你的代碼的問題,你可以使用Xcode來分析你的代碼,幫助你找到出現(xiàn)問題的地方。注意,Xcode分析項目,它會指出每一個潛在的可能出現(xiàn)的問題的地方。 使用Xcode來分析你的項目,從Xcode的?Product菜單選擇?Analyze或按?Shift-Command-B.Xcode的將需要片刻的時間,但是當它完成的時候你會在左邊的??Issue Navigator看到問題列表。由分析發(fā)現(xiàn)的問題用藍色高亮顯示。

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

如果你找不到造成EXCBADACCESS的錯誤,那就需要你仔細審視Xcode項目,分析其中發(fā)現(xiàn)的每一個問題。

7.結(jié)論

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

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

推薦閱讀更多精彩內(nèi)容