Что вызывает ошибку “EXC_BAD_ACCESS” при получении информации о Wi-Fi?

StackOverflow https://stackoverflow.com/questions/1727417

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Принятый программой сигнал:“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), Я получаю сообщение об ошибке, но я не уверен, потому что на этой строке оно останавливается.

Как я могу решить эту проблему?

Это было полезно?

Решение

При любых ошибках 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 вы сможете точно выяснить причину.

Другие советы

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

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

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

Вы можете сделать это ЛЕГКО с помощью инструментов:Посмотрите этот действительно замечательный пост:

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

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

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

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

Я работаю над тем же самым, и у меня та же проблема.Если вы войдете в режим отладки, вы увидите это, когда мы используем 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top