Was sind die Ursachen „EXC_BAD_ACCESS“ Fehler, wenn wifi Informationen zu bekommen?

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

  •  19-09-2019
  •  | 
  •  

Frage

Ich erhalte die folgende Fehlermeldung

  

Programm empfangene Signal. „EXC_BAD_ACCESS“
  Warnung: check_safe_call: konnte nicht aktuelles Frame wiederherstellen

     

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

War es hilfreich?

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.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top