Quali sono le cause di errore “EXC_BAD_ACCESS” quando ottenere informazioni wifi?
Domanda
sto ottenendo il seguente errore
Programma segnale ricevuto:. “EXC_BAD_ACCESS”
warning: check_safe_call: non potrebbe ripristinare frame correnteAttenzione:. Impossibile ripristinare fotogramma selezionata in precedenza
warning:. Impossibile ripristinare fotogramma precedentemente selezionato
La mia app è quello di ottenere informazioni 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");
Quando il codice raggiunge open(&airportHandle)
, ricevo l'errore, ma non sono sicuro perché a questa linea si ferma.
Come posso risolvere questo?
Soluzione
Per eventuali errori EXC_BAD_ACCESS, si sono di solito tentando di inviare un messaggio a un oggetto rilasciato. La BEST modo per rintracciare questi giù è utilizzare NSZombieEnabled .
Questo funziona in realtà mai rilasciando un oggetto, ma avvolgendolo come un "zombie" e impostando una bandiera al suo interno che dice che normalmente sarebbe stato rilasciato. In questo modo, se si tenta di accedere di nuovo, ancora sapere quello che era prima che hai fatto l'errore, e con questo po 'di informazioni, di solito si può fare marcia indietro per vedere che cosa il problema era.
Aiuta soprattutto in thread in background quando il debugger a volte craps su tutte le informazioni utili.
molto importante notare tuttavia, è che è necessario al 100% assicurarsi che questo è solo nel codice di debug e non il codice di distribuzione. Perché nulla è mai rilasciato, la vostra applicazione sarà perdite e perdite e perdite. Per ricordarmi di fare questo, ho messo questo registro nel mio AppDelegate:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Se si riesce a trovare la linea esatta, Fare un Build-e-Debug (CMD-Y) invece di un Build-and-Run (CMD-R). Quando l'applicazione si blocca, il debugger vi mostrerà esattamente quale riga e in combinazione con NSZombieEnabled, si dovrebbe essere in grado di scoprire esattamente perché.
Altri suggerimenti
EXC_BAD_ACCESS si verifica sempre quando si accede la memoria è già stato rilasciato. Nel codice di esempio, non riesco a vedere dove airportHandle
viene inizializzato, o anche depurato viene inizializzato a tutti per quella materia.
Se è stato inizializzato ma basta dimenticato di inserire il codice, si dovrebbe provare a controllare se è stato rilasciato il manico da qualche parte.
Per eseguire il debug di tale violazione di accesso, spesso è utile per impostare il flag NSZombieEnabled
dell'Ambiente per YES
. Questo farà sì che il runtime Obj-C per registrare l'accesso alla memoria rilasciata alla console. È possibile trovare una tutorial completo su come utilizzare tali informazioni insieme a strumenti per trovare il vostro problema.
Si può fare facilmente con strumenti: Vedi questo davvero grande post:
EXC_BAD_ACCESS. si trova principalmente quando u rilasciato qualsiasi oggetto che avete più necessario in future.it è in grado di trovare, ma c'è una soluzione per scoprire u deve avere per essere in una modalità di debug. quindi seguire questi collegamenti
http://www.codza.com/how-to- debug-EXC_BAD_ACCESS-on-iphone
funziona davvero
Sto lavorando sulla stessa cosa, ed ottengo lo stesso problema. Se si immette in modalità debug, si può vedere che quando usiamo open = dlsym(libHandle, "Apple80211Open");
la funzione ancora uguale a 0.
Quindi, a mio parere si sta cercando per il Apple80211Open
in un quadro che non conteneva questa funzione.
Apple80211Open
è nel contesto privato Apple80211
che viene superata in> iOS 2.x SDK. L'equivalente nel quadro MobileWifi, che è per la 3.xe 4.x SDK, è /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
anziché /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi