Was sind die Ursachen „EXC_BAD_ACCESS“ Fehler, wenn wifi Informationen zu bekommen?
Frage
Ich erhalte die folgende Fehlermeldung
Programm empfangene Signal. „EXC_BAD_ACCESS“
Warnung: check_safe_call: konnte nicht aktuelles Frame wiederherstellenWarnung:. Kann nicht vorher ausgewählten Rahmen wiederherzustellen
Warnung:. Kann nicht vorher ausgewählten Rahmen wiederherstellen
Meine App ist wifi Informationen zu erhalten
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");
Wenn der Code erreicht open(&airportHandle)
, erhalte ich den Fehler, aber ich bin mir nicht sicher, weil an dieser Linie zum Anschlag.
Wie kann ich dieses Problem lösen?
Lösung
Für alle EXC_BAD_ACCESS Fehler, Sie versuchen, in der Regel eine Nachricht an ein freigegebenes Objekt zu senden. Die BEST Weg, um diese nach unten zu verfolgen, ist die Verwendung NSZombieEnabled .
Dies funktioniert, indem nie ein Objekt tatsächlich die Freigabe, sondern indem man es als „Zombie“ Verpackung und eine Fahne im Inneren Einstellung, die sagt, dass es normalerweise freigegeben worden wäre. Auf diese Weise, wenn Sie es versuchen wieder zugreifen zu können, wissen, dass es nach wie vor, was es war, bevor Sie den Fehler gemacht, und mit diesem wenig Informationen, können Sie in der Regel denselben Weg zurückverfolgen, um zu sehen, was das Problem war.
Es hilft vor allem im Hintergrund-Threads, wenn manchmal der Debugger auf alle notwendigen Informationen scheißt aus.
sehr wichtig zu beachten ist jedoch, dass Sie zu 100% machen müssen, dass dies nur in Ihrem Debug-Code und nicht Ihren Verteilungscode. Denn nichts ist jemals veröffentlicht, wird Ihre App auslaufen und auslaufen und undicht werden. Erinnern mich, dies zu tun, habe ich dieses Protokoll in meinem AppDelegate:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Wenn Sie Hilfe benötigen, die genaue Zeile zu finden, erstellen eine Build-and-Debug (CMD-Y) anstelle von einem Build-and-Run (CMD-R). Wenn die App abstürzt, wird der Debugger Ihnen genau zeigen, welche Zeile und in Kombination mit NSZombieEnabled, sollten Sie in der Lage sein, warum genau herauszufinden.
Andere Tipps
EXC_BAD_ACCESS tritt immer dann, wenn Zugriff auf den Speicher bereits freigegeben haben. In Ihrem Beispielcode, kann ich nicht sehen, wo airportHandle
initialisiert wird, oder wheter es überhaupt für diese Angelegenheit initialisiert.
Wenn es initialisiert wurde, aber Sie haben nur vergessen, dass Code zu schreiben, sollten Sie die Überprüfung versuchen, wenn Sie den Griff irgendwo veröffentlicht worden.
Zum Debuggen solch eine Zugriffsverletzung, ist es oft sinnvoll, die NSZombieEnabled
Umwelt Flagge auf YES
einzustellen. Dies wird die Obj-C-Laufzeit zu Protokoll Zugriff auf freigegebene Speicher an die Konsole verursachen. Sie können eine komplettes Tutorial über den Umgang mit Instrumenten, die Informationen gemeinsam verwenden, um Ihr Problem zu finden.
Sie können es leicht tun mit Instrumenten: Sehen Sie diesen wirklich großen Beitrag:
EXC_BAD_ACCESS. gefunden wird vor allem, wenn u ein beliebiges Objekt freigegeben, die Sie weiter in future.it nicht mehr nötig haben, ist zu finden, aber es gibt Lösung, um herauszufinden, u in einem DEBUG-Modus sein muss haben. dann folgen Sie diesen Links
http://www.codza.com/how-to- Debug-EXC_BAD_ACCESS-on-iphone
es funktioniert wirklich
Ich arbeite an der gleichen Sache, und ich das gleiche Problem. Wenn Sie im Debug-Modus eingeben, können Sie sehen, dass, wenn wir open = dlsym(libHandle, "Apple80211Open");
die Funktion noch nutzen gleich auf 0
Also meiner Meinung nach der Sie suchen die Apple80211Open
in einem Rahmen, der diese Funktion nicht enthalten hat.
ist Apple80211Open
im Apple80211
privaten Rahmen, der in> iOS 2.x SDK veraltet ist. Das Äquivalent im MobileWifi Rahmen, die für die 3.x und 4.x SDK ist, ist /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
statt /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi