O que causa erro “EXC_BAD_ACCESS” ao obter informações wifi?
Pergunta
Estou recebendo o seguinte erro
Programa sinal recebido:. “EXC_BAD_ACCESS”
aviso: check_safe_call: não poderia restaurar quadro atualaviso:. Não é possível restaurar quadro selecionado anteriormente
aviso:. Não é possível restaurar quadro previamente selecionado
Meu aplicativo é obter informações 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");
Quando os alcances código open(&airportHandle)
, recebo o erro, mas não tenho certeza porque nesta linha que ele pare.
Como posso resolver isso?
Solução
Para quaisquer erros EXC_BAD_ACCESS, que normalmente são tentando enviar uma mensagem para um objeto lançado. O BEST maneira de controlar estes para baixo é o uso NSZombieEnabled .
Isso funciona, nunca realmente liberar um objeto, mas por envolvê-lo como um "zumbi" e definindo um sinalizador dentro dela que diz que normalmente teria sido liberada. Dessa forma, se você tentar acessá-lo novamente, ele ainda sabia o que era antes de você cometeu o erro, e com este pouco de informação, normalmente você pode recuar para ver qual era o problema.
Ela ajuda especialmente em threads em segundo plano quando o depurador às vezes craps para fora em alguma informação útil.
muito importante notar no entanto, é que você precisa de 100% certeza de que essa é apenas em seu código de depuração e não o seu código de distribuição. Porque nada é lançado, o aplicativo irá vazar e vazar e vazar. Para me lembrar de fazer isso, eu coloquei esse log no meu AppDelegate:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Se você precisar de ajuda para encontrar a linha exata, fazer uma compilação-and-Debug (CMD-Y) em vez de um Build-and-Run (CMD-R). Quando as falhas de aplicativos, o depurador irá mostrar-lhe exatamente qual linha e em combinação com NSZombieEnabled, você deve ser capaz de descobrir exatamente o porquê.
Outras dicas
EXC_BAD_ACCESS sempre ocorre ao acessar memória que você já lançado. No seu código de exemplo, eu não posso ver onde airportHandle
é inicializado, ou wheter ele é inicializado em tudo para essa matéria.
Se ele foi inicializado, mas você simplesmente se esqueceu de postar esse código, você deve tentar verificar se você lançou a algum lugar alça.
Para depurar tal uma violação de acesso, muitas vezes é útil para definir o NSZombieEnabled
flag Ambiente para YES
. Isso fará com que o tempo de execução Obj-C para acessar o log para a memória liberada para o console. Você pode encontrar um completo tutorial sobre como usar essa informação em conjunto com instrumentos para encontrar o seu problema.
Você pode fazer isso facilmente com Instrumentos: Ver isso realmente ótimo post:
EXC_BAD_ACCESS. é encontrada principalmente quando u lançado qualquer objeto que você tenha ainda mais necessária em future.it é incapaz de encontrar, mas não há solução para descobrir u deve ter para estar em um modo de depuração. em seguida, siga estes links
http://www.codza.com/how-to- debug-EXC_BAD_ACCESS-on-iphone
ele realmente funciona
Eu estou trabalhando na mesma coisa, e eu recebo o mesmo problema. Se você entrar no modo de depuração, você pode ver que quando usamos open = dlsym(libHandle, "Apple80211Open");
a função ainda é igual a 0.
Então, na minha opinião, você está procurando o Apple80211Open
em um quadro que não continha essa função.
Apple80211Open
é no âmbito privado Apple80211
que está desatualizado em> iOS 2.x SDK. O equivalente no âmbito MobileWifi, que é para o 3.xe 4.x SDK, é /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
vez de /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi