Что вызывает ошибку «EXC_BAD_ACCESS» при получении информации Wi-Fi? - PullRequest
2 голосов
/ 13 ноября 2009

Я получаю следующую ошибку

Программа получила сигнал: «EXC_BAD_ACCESS».
предупреждение: check_safe_call: не удалось восстановить текущий кадр

предупреждение: невозможно восстановить ранее выбранный кадр.
предупреждение: невозможно восстановить ранее выбранный кадр.

Мое приложение для получения информации Wi-Fi

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 ]

6 голосов
/ 13 ноября 2009

Для любых ошибок EXC_BAD_ACCESS вы обычно пытаетесь отправить сообщение освобожденному объекту. ЛУЧШИЙ способ отследить это - использовать NSZombieEnabled .

Это работает, никогда не выпуская объект, а заключая его в «зомби» и устанавливая внутри него флаг, который говорит, что обычно он был бы выпущен. Таким образом, если вы попытаетесь снова получить к нему доступ, он все еще будет знать, что было до того, как вы допустили ошибку, и с помощью этой небольшой информации вы обычно можете вернуться назад, чтобы увидеть, в чем проблема.

Это особенно помогает в фоновых потоках, когда отладчик иногда выбрасывает любую полезную информацию.

ОЧЕНЬ ВАЖНО ЗАМЕЧАНИЕ однако, вам нужно на 100% убедиться, что это только в вашем отладочном коде, а не в коде дистрибутива. Поскольку ничего не выпущено, ваше приложение будет течь и течь и течь. Чтобы напомнить мне сделать это, я поместил этот журнал в моем appdelegate:

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

Если вам нужна помощь в поиске точной строки, выполните Build-and-Debug (CMD-Y) вместо Build-and-Run (CMD-R). Когда приложение падает, отладчик покажет вам, какая именно строка и в сочетании с NSZombieEnabled, вы сможете точно узнать, почему.

1 голос
/ 13 ноября 2009

EXC_BAD_ACCESS всегда происходит при доступе к памяти, которую вы уже освободили. В вашем примере кода я не вижу, где инициализируется airportHandle или вообще ли он инициализируется в этом отношении.

Если он был инициализирован, но вы просто забыли опубликовать этот код, попробуйте проверить, выпустили ли вы где-нибудь дескриптор.

Чтобы отладить такое нарушение прав доступа, часто бывает полезно установить флаг NSZombieEnabled Environment на YES. Это заставит среду выполнения Obj-C регистрировать доступ к освобожденной памяти на консоль. Вы можете найти полный учебник о том, как использовать эту информацию вместе с Инструментами, чтобы найти вашу проблему.

0 голосов
/ 01 февраля 2011

Я работаю над тем же, и у меня та же проблема. Если вы войдете в режим отладки, вы увидите, что когда мы используем open = dlsym(libHandle, "Apple80211Open");, функция по-прежнему равна 0.

Так что, по моему мнению, вы ищете Apple80211Open в платформе, которая не содержала эту функцию.

Apple80211Open находится в частной платформе Apple80211, которая устарела в> iOS 2.x SDK. Эквивалент в платформе MobileWifi, который предназначен для SDK 3.x и 4.x, равен /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager вместо /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

0 голосов
/ 01 декабря 2010

EXC_BAD_ACCESS. в основном обнаруживается, когда вы отпускаете любой объект, который вам в дальнейшем понадобится в будущем. Он не может найти, но есть решение, чтобы выяснить, что вы должны быть в режиме отладки. затем перейдите по этим ссылкам

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

это действительно работает

0 голосов
/ 13 ноября 2009

Вы можете сделать это ЛЕГКО с инструментами: см. Этот действительно хороший пост:

http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-those-random-crashes-in-your-cocoa-app/comment-page-1/#comment-43762

...