获取wifi信息时导致“EXC_BAD_ACCESS”错误的原因是什么?

时间:2009-11-13 06:04:56

标签: iphone wifi ipod

我收到以下错误

  

编程接收信号:“EXC_BAD_ACCESS”   警告:check_safe_call:无法恢复当前帧

     

警告:无法恢复之前选择的框架   警告:无法恢复先前选择的帧。

我的应用是获取wifi信息

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)时,我收到错误,但我不确定,因为此行停止了。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:6)

对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。跟踪这些内容的 BEST 方式是使用NSZombieEnabled

这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。

当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。

非常重要注意但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:

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

如果您需要帮助查找确切的行,请执行构建和调试(CMD-Y)而不是构建并运行(CMD-R)。当应用程序崩溃时,调试器会向您显示确切的行,并与NSZombieEnabled结合使用,您应该能够确切地找到原因。

答案 1 :(得分:1)

访问已释放的内存时,始终会发生EXC_BAD_ACCESS。在您的示例代码中,我无法看到初始化airportHandle的位置,或者根本没有初始化它。

如果它已经初始化但你忘记发布该代码,你应该尝试检查你是否在某处释放了句柄。

要调试此类访问冲突,将NSZombieEnabled Environment标志设置为YES通常很有用。这将导致Obj-C运行时将对已释放内存的访问权限记录到控制台。您可以找到full tutorial如何将这些信息与Instruments一起使用来查找问题。

答案 2 :(得分:0)

答案 3 :(得分:0)

EXC_BAD_ACCESS。主要是当你释放你将来需要的任何物体时找到它。它无法找到,但有解决方案可以找出你必须处于调试模式。然后按照这些链接

http://www.codza.com/how-to-debug-exc_bad_access-on-iphone

它确实有效

答案 4 :(得分: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