iOS EXC_BAD_ACCESS的本質詳解以及殭屍模式調試

原文鏈接

EXC_BAD_ACCESS簡單理解

當你遇到由EXC_BAD_ACCESS造成的崩潰時,那就意味着你向一個已經釋放的對象發送消息。這是最常見的情況。

EXC_BAD_ACCESS的本質

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

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

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

EXC_BAD_ACCESS調試須知的三點

1、調試EXC_BAD_ACCESS可能會非常棘手和令人沮喪。
2、你需要知道的是您的應用程序並不一定是在崩潰的那一刻,無法訪問內存區域。這就是常使調試EXC_BAD_ACCESS變得困難的原因。
3、同樣受損指針也是如此。當你的指針被損壞時,您的應用程序不會崩潰。同時,如果您在應用程序中來回傳遞一個受損的指針也不會崩潰。當應用程序試圖引用受損指針的時候,就會發生奔潰。

EXC_BAD_ACCESS調試——殭屍調試模式

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

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

殭屍調試模式具體操作

在Xcode中啓用殭屍對象是很容易的。單擊左上角的Edit Scheme,並選中Edit Scheme。在左側選中Run ,在上方打開 Diagnostics選項。要啓用殭屍對象,勾選 Zombie Objects選框。

殭屍調試模式

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

  -[CLTextView textInputView]: message sent to deallocated instance 0x7acb0200

在上面的例子中, Xcode告訴我們,textInputView的消息:被髮送到一個殭屍對象。然而,殭屍對象不再是CLTextView類的一個實例。以前分配給CLTextView實例的內存區域不再映射到您的應用程序。這爲你瞭解問題產生的根本原因提供一個不錯的建議。不幸的是,殭屍對象將無法保存您的一天每次崩潰的EXC_BAD_ACCESS的記錄。既然殭屍對象沒有這些方法,那麼你可以採取其他的方法進行一些適當的分析。
上面例子產生殭屍對象的原因:在寫UITextView分類時,添加了一個名字爲UITextViewTextDidChangeNotification通知,使用完之後在下面代碼中釋放了,導致錯誤。

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UITextViewTextDidChangeNotification
                                                  object:self];
}

Xcode分析項目(如果殭屍對象不能解決你的問題)

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

Xcode分析

當你點擊一個問題,Xcode的會指向問題代碼塊,這些正是你要的注意的地方。注意,Xcode僅僅是建議。在某些情況下,這是可能的,問題是不相關的,不固定。如果你找不到造成EXC_BAD_ACCESS的錯誤,那就需要你仔細審視Xcode項目,分析其中發現的每一個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章