Pergunta

Estou recebendo o seguinte erro

Programa sinal recebido:. “EXC_BAD_ACCESS”
aviso: check_safe_call: não poderia restaurar quadro atual

aviso:. 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?

Foi útil?

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.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top