Quali sono le cause di errore “EXC_BAD_ACCESS” quando ottenere informazioni wifi?

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

  •  19-09-2019
  •  | 
  •  

Domanda

sto ottenendo il seguente errore

  

Programma segnale ricevuto:. “EXC_BAD_ACCESS”
  warning: check_safe_call: non potrebbe ripristinare frame corrente

     

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

È stato utile?

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.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top