Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 是什么导致“;EXC#u坏访问”;获取wifi信息时出错?_Iphone_Wifi_Ipod - Fatal编程技术网

Iphone 是什么导致“;EXC#u坏访问”;获取wifi信息时出错?

Iphone 是什么导致“;EXC#u坏访问”;获取wifi信息时出错?,iphone,wifi,ipod,Iphone,Wifi,Ipod,我得到以下错误 程序接收到信号:“EXC\U坏访问”。 警告:检查安全呼叫:无法还原当前帧 警告:无法还原以前选择的帧。 警告:无法还原以前选择的帧 我的应用程序是获取wifi信息 libHandle = dlopen("/System/Library/PrivateFrameworks/ MobileWiFi.framework/MobileWiFi",RTLD_LAZY); open = dlsym(libHandle, "Apple80211Open"); bind = dlsym(li

我得到以下错误

程序接收到信号:“EXC\U坏访问”。
警告:检查安全呼叫:无法还原当前帧

警告:无法还原以前选择的帧。
警告:无法还原以前选择的帧

我的应用程序是获取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)
时,我收到了错误,但我不确定,因为在这一行它停止了


如何解决此问题?

EXC\u坏访问总是在访问已释放的内存时发生。在您的示例代码中,我看不到
airportHandle
在哪里初始化,也看不到它是在什么地方初始化的

如果它已经初始化,但您只是忘记发布代码,那么您应该尝试检查是否在某个地方释放了句柄


要调试这种访问冲突,通常需要将
NSZombieEnabled
环境标志设置为
YES
。这将导致Obj-C运行时将对释放内存的访问记录到控制台。您可以找到一个关于如何使用该信息和仪器来查找问题的指南。

对于任何EXC\u BAD\u访问错误,您通常会尝试向已发布的对象发送消息。追踪这些信息的最佳方法是使用

这样做的方法是,永远不会真正释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表示该对象通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前是什么,并且有了这一点信息,您通常可以回溯到问题所在

当调试器有时在任何有用的信息上出错时,它在后台线程中尤其有用

但是,需要注意的非常重要的一点是,您需要100%确保这只出现在调试代码中,而不是发布代码中。因为从来没有发布过任何东西,所以你的应用程序会一个接一个地泄漏。为了提醒我这样做,我将此日志放在appdelegate中:

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

如果您需要帮助查找确切的行,请执行生成并调试(CMD-Y)而不是生成并运行(CMD-R)。当应用程序崩溃时,调试器将准确地显示哪一行,结合NSZombieEnabled,您应该能够找到确切的原因。

您可以使用仪器轻松地完成此操作:请参阅这篇非常棒的帖子:


EXC\u坏访问。主要是在你释放了你将来需要的任何对象时发现的。它无法找到,但有一个解决方案可以发现你必须处于调试模式。然后点击这些链接


它真的很管用

我在做同样的事情,我得到了同样的问题。如果您进入调试模式,您可以看到当我们使用
open=dlsym(libHandle,“apple801open”)函数仍然等于0

因此,我认为您正在寻找一个不包含此函数的框架中的
apple801open


apple801open
位于
apple8011
私有框架中,该框架在iOS 2.x SDK中已过时。对于3.x和4.x SDK,MobileWifi框架中的等价物是
/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
,而不是
/System/Library/PrivateFrameworks/MobileWifi.framework/MobileWifi
,ObjectAllocator工具可以配置为启用僵尸。如果它找到它,它会抛出一个带有僵尸地址的警报,您可以在堆栈回溯中看到,导致问题的调用(具有最新时间戳的调用)僵尸启用不是完全可靠的;这只适用于NSO对象。如果触发的内存不是实际对象(结构或其他对象),那么NSZombie将不会帮助您。似乎涵盖了这个问题。请注意,MobileWifi是一个私有框架,在发布应用程序中使用这样的框架是一个非常糟糕的想法。苹果现在似乎甚至在使用静态分析器来清除提交的应用程序中的私有API调用。