Pregunta

Estoy recibiendo el siguiente error

  

Programa recibió la señal: “EXC_BAD_ACCESS”
  Advertencia: check_safe_call: no se pudo restaurar la trama actual

     

advertencia:. No se puede restaurar marco seleccionado previamente
  advertencia:. No se puede restaurar marco seleccionado previamente

Mi aplicación es obtener información 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");

Cuando el código alcanza open(&airportHandle), recibo el error, pero no estoy seguro porque en esta línea que se detenga.

¿Cómo puedo resolver esto?

¿Fue útil?

Solución

En cualquier error EXC_BAD_ACCESS, generalmente se intenta enviar un mensaje a un objeto lanzado. La BEST manera de seguir estas abajo es usar NSZombieEnabled .

Esto funciona en realidad nunca la liberación de un objeto, pero envolviéndolo como un "zombie" y el establecimiento de una bandera en su interior que dice que normalmente habría sido puesto en libertad. De esta manera, si se intenta acceder de nuevo, todavía sabía lo que era antes de realizar el error, y con este poco de información, normalmente se puede dar marcha atrás para ver cuál era el problema.

Es de especial utilidad en las discusiones de fondo cuando el depurador veces dados a cabo en cualquier información útil.

muy importante señalar sin embargo, es que se necesita un 100% asegurarse de que esto es sólo en su código de depuración y no su código de distribución. Porque nada es puesto en libertad, su aplicación va a gotear y gotear y gotear. Para recordarle que haga esto, puse este registro en mi AppDelegate:

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

Si necesita ayuda para encontrar la línea exacta, hace una compilación-y-depuración (CMD-Y) en lugar de crear una generación-y-Run (CMD-R). Cuando la aplicación se bloquea, el depurador le mostrará exactamente qué línea y en combinación con NSZombieEnabled, usted debería ser capaz de averiguar exactamente por qué.

Otros consejos

EXC_BAD_ACCESS siempre ocurre cuando se accede a la memoria ya se ha liberado. En el código de ejemplo, no puedo ver donde se inicializa airportHandle o wheter se inicializa en absoluto para esa materia.

Si se ha inicializado pero simplemente se olvidó de colocar ese código, usted debe tratar de comprobar si se suelta la palanca en alguna parte.

Para depurar tales una violación de acceso, a menudo es útil para establecer el indicador de Medio Ambiente NSZombieEnabled a YES. Esto hará que el tiempo de ejecución Obj-C para registrar el acceso a la memoria liberada a la consola. Se puede encontrar una completa tutorial sobre cómo utilizar esa información, junto con los instrumentos para encontrar el problema.

EXC_BAD_ACCESS. se encuentra principalmente en libertad cuando u cualquier objeto que ha necesitado más de future.it es incapaz de encontrar, pero no hay solución para averiguar u debe tienen que estar en un modo de depuración. a continuación, siga estos enlaces

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

realmente funciona

Estoy trabajando en lo mismo, y me sale el mismo problema. Si introduce en modo de depuración, se puede ver que cuando usamos la función open = dlsym(libHandle, "Apple80211Open"); todavía es igual a 0.

Así que en mi opinión que busca el Apple80211Open en un marco que no contenía esta función.

Apple80211Open está en el marco privado Apple80211 que está obsoleto en> SDK de iOS 2.x. El equivalente en el marco MobileWifi, que es para la 3.xy 4.x SDK, se /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager en lugar de /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top