【问题标题】:What causes “EXC_BAD_ACCESS” error when getting wifi information?获取 wifi 信息时出现“EXC_BAD_ACCESS”错误的原因是什么?
【发布时间】:2009-11-13 06:04:55
【问题描述】:

我收到以下错误

节目接收信号:“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) 时,我收到错误但我不确定,因为在这一行它会停止。

我该如何解决这个问题?

【问题讨论】:

  • This blog post 似乎涵盖了这个问题。
  • 请注意,MobileWifi 是一个私有框架,在运输应用程序中使用这样的框架是一个非常糟糕的主意。现在,Apple 似乎甚至在使用静态分析器来清除提交的应用程序中的私有 API 调用。

标签: iphone wifi ipod


【解决方案1】:

对于任何 EXC_BAD_ACCESS 错误,您通常会尝试向已释放对象发送消息。 最佳方法是使用NSZombieEnabled

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

当调试器有时会发现任何有用的信息时,它尤其有助于后台线程。

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

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

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

【讨论】:

  • ObjectAllocator Instrument 可以配置为启用僵尸。如果找到它,它会抛出一个带有僵尸地址的警报,您可以在堆栈回溯中看到导致问题的调用(具有最新时间戳的调用)
  • ZombieEnabled 不是完全证明的;仅适用于 NSObjects。如果触发的内存不是一个实际的对象(结构或其他东西),那么 NSZombie 不会帮助你。
【解决方案2】:

EXC_BAD_ACCESS 总是在访问你已经释放的内存时发生。在您的示例代码中,我看不到 airportHandle 的初始化位置,或者根本就没有初始化。

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

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

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      EXC_BAD_ACCESS。主要是在您释放您将来需要的任何对象时发现的。它无法找到,但有解决方案可以找出您必须处于调试模式。然后点击这些链接

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

      确实有效

      【讨论】:

        【解决方案5】:

        我正在做同样的事情,我遇到了同样的问题。如果进入调试模式,可以看到当我们使用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

        【讨论】:

          猜你喜欢
          • 2017-02-20
          • 1970-01-01
          • 1970-01-01
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 2019-05-01
          • 2011-12-14
          相关资源
          最近更新 更多