2009-11-13 3 views
2

Je reçois l'erreur suivanteQu'est-ce qui provoque l'erreur "EXC_BAD_ACCESS" lors de l'obtention d'informations wifi?

Programme signal reçu: « EXC_BAD_ACCESS ».
avertissement: check_safe_call: impossible de restaurer l'image en cours

avertissement: Impossible de restaurer la trame précédemment sélectionnée.
avertissement: Impossible de restaurer la trame précédemment sélectionnée.

Mon application est d'obtenir des informations 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"); 

Lorsque le code atteint open(&airportHandle), je reçois l'erreur mais je ne suis pas sûr parce qu'à cette ligne, il arrête.

Comment puis-je résoudre ce problème?

+1

Notez que MobileWifi est un cadre privé, et l'utilisation d'un tel cadre dans une application d'expédition est très mauvaise idée. Apple semble même utiliser un analyseur statique pour éliminer les appels API privés dans les applications soumises maintenant. –

+0

[Cet article de blog] (http://www.codza.com/how-to-debug-exc_bad_access-on-iphone) semble couvrir le problème. – Suppressingfire

Répondre

6

Pour les erreurs EXC_BAD_ACCESS, vous essayez généralement d'envoyer un message à un objet libéré. Le meilleur façon de suivre ces vers le bas est l'utilisation NSZombieEnabled.

Cela fonctionne en ne libérant jamais réellement un objet, mais en l'enveloppant comme un "zombie" et en plaçant un drapeau à l'intérieur disant qu'il aurait normalement été libéré. De cette façon, si vous essayez d'y accéder à nouveau, vous savez toujours ce que c'était avant de faire l'erreur, et avec ce petit peu d'information, vous pouvez généralement revenir en arrière pour voir quel était le problème.

Il aide en particulier dans les threads d'arrière-plan lorsque le débogueur manque parfois d'informations utiles.

TRÈS IMPORTANT DE REMARQUER cependant, c'est que vous devez vous assurer à 100% que c'est seulement dans votre code de débogage et pas votre code de distribution. Parce que rien n'est jamais publié, votre application va fuir et fuir et fuir. Pour me rappeler de ce faire, je mets ce journal dans mon appdelegate:

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

Si vous avez besoin d'aide pour trouver la ligne exacte, compilons et-Debug (CMD-Y) au lieu d'un Build-et- Exécuter (CMD-R). Lorsque l'application tombe en panne, le débogueur vous montrera exactement quelle ligne et en combinaison avec NSZombieEnabled, vous devriez être capable de savoir exactement pourquoi.

+0

ObjectAllocator L'instrument peut être configuré avec zombie activé. S'il le trouve, il lance une alerte avec l'adresse zombie et vous pouvez voir là-bas dans la pile la trace de l'appel qui a causé le problème (l'appel avec l'horodatage le plus récent) –

+0

ZombieEnabled n'est pas complètement étanche; cela ne fonctionne que pour NSObjects. Si la mémoire qui déclenche ce n'est pas un objet réel (une structure ou quelque chose d'autre) alors NSZombie ne vous aidera pas. – Kevlar

1

EXC_BAD_ACCESS se produit toujours lors de l'accès à la mémoire que vous avez déjà libérée. Dans votre exemple de code, je ne peux pas voir où airportHandle est initialisé, ou si elle est initialisée du tout d'ailleurs.

S'il a été initialisé mais que vous avez oublié de publier ce code, vous devriez essayer de vérifier si vous avez relâché la poignée quelque part. Pour déboguer une telle violation d'accès, il est souvent utile de définir l'indicateur d'environnement NSZombieEnabled sur YES. Cela entraînera l'exécution de Obj-C runtime à la mémoire libérée accès à la console. Vous pouvez trouver un full tutorial sur la façon d'utiliser cette information avec Instruments pour trouver votre problème.

0

EXC_BAD_ACCESS. On le trouve principalement quand vous libérez un objet dont vous avez besoin à l'avenir.Il est incapable de trouver mais il y a une solution pour savoir que vous devez être en mode DEBUG. puis suivez ces liens

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

cela fonctionne vraiment

0

Je travaille sur la même chose, et je reçois la même question. Si vous entrez en mode débogage, vous pouvez voir que lorsque vous utilisez open = dlsym(libHandle, "Apple80211Open"); la fonction est toujours égale à 0.

Donc, à mon avis, vous cherchez le Apple80211Open dans un cadre qui ne contenait pas cette fonction.

Apple80211Open est dans le cadre privé Apple80211 qui est obsolète dans> iOS 2.x SDK. L'équivalent dans le cadre MobileWifi, qui est pour le SDK 3.x et 4.x, est /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager au lieu de /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

Questions connexes