我收到以下错误
编程接收信号:“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)
时,我收到错误,但我不确定,因为此行停止了。
我该如何解决这个问题?
答案 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