2009-11-13 83 views
2

我收到以下錯誤獲取wifi信息時,什麼原因導致「EXC_BAD_ACCESS」錯誤?

編程接收信號:「EXC_BAD_ACCESS」。
警告:check_safe_call:無法還原當前幀

警告:無法還原先前選定的幀。
警告:無法恢復先前選定的幀。

我的應用程序是獲得無線信息

libHandle = dlopen("/System/Library/PrivateFrameworks/ MobileWiFi.framework/MobileWiFi",RTLD_LAZY); 

open = dlsym(libHandle, "Apple80211Open"); 
bind = dlsym(libHandle, "Apple80211BindToInterface"); 
close = dlsym(libHandle, "Apple80211Close"); 
scan = dlsym(libHandle, "Apple80211Scan"); 

open(&airportHandle); 

bind(airportHandle, @"en0"); 

當代碼達到open(&airportHandle),我收到了錯誤,但我不知道,因爲在該行停止。

我該如何解決這個問題?

+1

請注意,MobileWifi是一個私有框架,在運輸應用程序中使用這樣的框架是非常糟糕的理念。 Apple似乎甚至正在使用靜態分析器來清除已提交應用程序中的私人API調用。 – 2009-11-13 13:30:54

+0

[此博客文章](http://www.codza.com/how-to-debug-exc_bad_access-on-iphone)似乎涵蓋了這個問題。 – Suppressingfire 2009-11-13 06:08:42

回答

6

對於任何EXC_BAD_ACCESS錯誤,你通常試圖將消息發送到一個釋放的對象。 BEST跟蹤這些的方法是使用NSZombieEnabled

該作品以從未真正釋放的對象,但通過包裝它作爲一個「殭屍」,並設置裏面一個標誌,上面寫着它通常會被釋放。這樣,如果您嘗試再次訪問它,它仍然知道您發生錯誤之前是什麼樣的,並且通過這些信息,您通常可以回溯以查看問題所在。

這尤其是在後臺線程幫助時,調試器有時胡扯出任何有用的信息。

然而,非常重要的是要注意是,您需要100%確保這只是在您的調試代碼中,而不是您的分發代碼。因爲什麼都沒有發佈,你的應用程序將泄漏,泄漏和泄漏。提醒我要做到這一點,我把這篇日誌在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
    NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!"); 

如果您需要幫助找到確切路線,做一個構建與調試(CMD-Y),而不是建造 - 和 - 運行(CMD-R)。當應用程序崩潰時,調試器會向您顯示確切的線路,並結合NSZombieEnabled,您應該能夠準確找出原因。

+0

ObjectAllocator儀器可以配置爲啓用殭屍。如果它發現它,它會拋出一個帶有殭屍地址的警報,並且您可以在堆棧中回溯那個導致問題的調用(具有最新時間戳的調用) – 2009-11-13 08:13:58

+0

ZombieEnabled雖然不是全保護的,只適用於NSObjects。如果觸發的內存不是實際的對象(一個結構或其他東西),那麼NSZombie不會幫你。 – Kevlar 2009-11-13 17:15:03

1

EXC_BAD_ACCESS訪問存儲器時,你已經發布總是發生。在你的示例代碼中,我看不到airportHandle被初始化的位置,或者根本就沒有看到airportHandle的初始化位置。

如果已經初始化,但你只是忘了張貼的代碼,你應該嘗試檢查,如果你的地方釋放手柄。

要調試此類訪問衝突,通常將NSZombieEnabled環境標誌設置爲YES。這將導致Obj-C運行時將訪問權限釋放到控制檯。你可以找到一個full tutorial關於如何使用這些信息與儀器一起找到你的問題。

0

我工作的同樣的事情,我也得到了同樣的問題。如果你進入調試模式,你可以看到當我們使用open = dlsym(libHandle, "Apple80211Open");時,函數仍然等於0.

所以我認爲你在尋找一個不包含這個函數的框架中的Apple80211Open

Apple80211Open位於Apple80211私有框架,該框架在iOS 2.x SDK中已過時。用於3.x和4.x SDK的MobileWifi框架中的等效項是/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager而不是/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

相關問題