EXC_BAD_ACCESS的本質(zhì)詳解以及僵尸模式調(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ì)奕删,你就會更好地理解這個模糊的名詞。這里有一個極為簡單的解釋爹梁,也有一個技術(shù)層面的解釋右犹。我們首先從簡單的解釋開始說起。

2.簡單的解釋

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

3. EXC_BAD_ACCESS的本質(zhì)

技術(shù)層面的解釋有些復(fù)雜。在C和Objective-C中看成,你一直在處理指針君编。指針無非是存儲另一個變量的內(nèi)存地址的變量。當(dāng)您向一個對象發(fā)送消息時川慌,指向該對象的指針將會被引用吃嘿。這意味著祠乃,你獲取了指針?biāo)傅膬?nèi)存地址,并訪問該存儲區(qū)域的值兑燥。

當(dāng)該存儲器區(qū)域不再映射到您的應(yīng)用時亮瓷,或者換句話說,該內(nèi)存區(qū)域在你認(rèn)為使用的時候卻沒有使用降瞳,該內(nèi)存區(qū)域是無法訪問的嘱支。 這時內(nèi)核會拋出一個異常( EXC ),表明你的應(yīng)用程序不能訪問該存儲器區(qū)域(BAD ACCESS) 挣饥。

總之除师,當(dāng)你碰到EXC_BAD_ACCESS ,這意味著你試圖發(fā)送消息到的內(nèi)存塊扔枫,但內(nèi)存塊無法執(zhí)行該消息汛聚。但是,在某些情況下茧吊, EXC_BAD_ACCESS是由被損壞的指針引起的贞岭。每當(dāng)你的應(yīng)用程序嘗試引用損壞的指針,一個異常就會被內(nèi)核拋出搓侄。

4.調(diào)試EXC_BAD_ACCESS

調(diào)試EXC_BAD_ACCESS可能會非常棘手和令人沮喪。然而话速,現(xiàn)在EXC_BAD_ACCESS不再是一個謎讶踪,它沒有想象中的那么可怕。

你需要知道的第一件事是您的應(yīng)用程序并不一定是在崩潰的那一刻泊交,無法訪問內(nèi)存區(qū)域乳讥。這就是常使調(diào)試EXC_BAD_ACCESS變得困難的原因。

同樣受損指針也是如此廓俭。當(dāng)你的指針被損壞時云石,您的應(yīng)用程序不會崩潰。同時研乒,如果您在應(yīng)用程序中來回傳遞一個受損的指針也不會崩潰汹忠。當(dāng)應(yīng)用程序試圖引用受損指針的時候,就會發(fā)生奔潰雹熬。

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

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

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

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

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

在左側(cè)選中Run ,在上方打開 Diagnostics選項粗蔚。要啟用僵尸對象尝偎,勾選 Enable Zombie Objects選框。

如果你現(xiàn)在遇到EXC_BAD_ACCESS 鹏控,在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ū)域不再映射到您的應(yīng)用程序世吨。這為你了解問題產(chǎn)生的根本原因提供一個不錯的建議。

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

6.分析

如果僵尸對象不能解決你的問題陆赋,那么問題的根源可能就不那么簡單了沐祷。在這種情況下嚷闭,您需要仔細(xì)看看在應(yīng)用程序崩潰時執(zhí)行的代碼。這可能是繁瑣和耗時的赖临。

為了幫助你發(fā)現(xiàn)你的代碼的問題胞锰,你可以使用Xcode來分析你的代碼,幫助你找到出現(xiàn)問題的地方兢榨。注意嗅榕,Xcode分析項目,它會指出每一個潛在的可能出現(xiàn)的問題的地方吵聪。

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

當(dāng)你點擊一個問題,Xcode的會指向問題代碼塊块攒,這些正是你要的注意的地方励稳。注意,Xcode僅僅是建議囱井。在某些情況下驹尼,這是可能的,問題是不相關(guān)的庞呕,不固定扶欣。

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

7.結(jié)論

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妆绞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枫攀,更是在濱河造成了極大的恐慌括饶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来涨,死亡現(xiàn)場離奇詭異图焰,居然都是意外死亡,警方通過查閱死者的電腦和手機蹦掐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門技羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僵闯,“玉大人,你說我怎么就攤上這事藤滥”钏冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵拙绊,是天一觀的道長向图。 經(jīng)常有香客問我,道長标沪,這世上最難降的妖魔是什么榄攀? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谨娜,結(jié)果婚禮上航攒,老公的妹妹穿的比我還像新娘。我一直安慰自己趴梢,他們只是感情好漠畜,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坞靶,像睡著了一般憔狞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彰阴,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天瘾敢,我揣著相機與錄音,去河邊找鬼尿这。 笑死簇抵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的射众。 我是一名探鬼主播碟摆,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叨橱!你這毒婦竟也來了典蜕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤罗洗,失蹤者是張志新(化名)和其女友劉穎饵沧,沒想到半個月后闸与,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年虏冻,在試婚紗的時候發(fā)現(xiàn)自己被綠了膳凝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躺翻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卫玖,我是刑警寧澤公你,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站假瞬,受9級特大地震影響陕靠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脱茉,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一剪芥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琴许,春花似錦税肪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箭券,卻和暖如春净捅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辩块。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工蛔六, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人废亭。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓国章,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豆村。 傳聞我的和親對象是個殘疾皇子捉腥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

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