abiertas - como cerrar aplicaciones en iphone sin boton home
Obtención de información sobre la dirección de memoria incorrecta en LLDB (4)
Estoy tratando de depurar un EXC_BAD_ACCESS en mi aplicación de iPhone. Se bloquea en una llamada de método y en la línea del método es EXC_BAD_ACCESS (code=1, address = xxx)
.
Antes, habría utilizado gdb info malloc-history <xxx>
para iniciar la depuración, pero tengo problemas para encontrar un comando paralelo en LLDB
.
Vi this hilo que decía que usaba Instruments, pero cuando lo hago, todavía tengo la falla, pero no puedo averiguar cómo decir exactamente de dónde se está estrellando la aplicación en Instruments.
Solo necesito averiguar hacia dónde apuntaba este pedazo de memoria que se está estrellando. ¿Cuál es la mejor manera de hacer esto usando LLDB
o Instruments?
Este problema es muy fácil de resolver con un seguimiento informativo. Desafortunadamente, con la última versión de iOS y Xcode, a veces es difícil encontrar una buena pista de pila. Afortunadamente, puede establecer un ''Punto de interrupción de excepción'' en Xcode para permitirle examinar este código antes de la excepción EXC_BAD_ACCESS.
- Abra la navegación de punto de interrupción en Xcode 4 (se ve como un rectángulo con un punto en el lado derecho)
- Presione el botón ''+'' en la parte inferior izquierda y agregue un ''Punto de interrupción de excepción''. Asegúrese de dividir ''On Throw'' para las excepciones ''All''.
Ahora debe obtener un retroceso completo inmediatamente antes de que se produzca esta excepción. Esto debería permitirle al menos cero en donde se lanza esta excepción.
Puede ver la pila malloc si realiza una depuración con instrumentos.
Encontré el mismo problema que usted y, de manera similar, quería saber cómo obtener el historial de malloc al usar lldb. Lamentablemente no encontré un comando ingenioso como malloc-history
encontrado en gdb. Para ser honesto, simplemente cambié mi depurador, pero me pareció molesto porque sentía que no debía hacerlo.
Para encontrar la historia de malloc utilizando instrumentos:
- Perfil tu proyecto
- Selecciona Zombies de la lista de instrumentos.
- Haz que tu aplicación active el problema
- En este punto, se le debe presentar la dirección que ya estaba desasignada y puede explorarla. Debería ser una simple cuestión de ver la historia de malloc en este punto. Bloqueé partes que tenían nombres de clase / proyecto específicos para el trabajo que estoy haciendo, pero creo que la esencia y la utilidad de cómo obtener esta información está presente.
Una ultima palabra
El problema que encontré me produjo un mensaje como:
*** - [someClass retain]: mensaje enviado a la instancia desasignada 0x48081fb0 someProject (84051,0xacd902c0) malloc: grabando las pilas malloc en el disco utilizando el registrador estándar
Me quedé realmente perplejo de dónde venía esta retain
ya que el código en el que se estaba rompiendo no tenía uno (ni en el captador ni en el colocador de la línea en la que estaba). Resulta que no estaba llamando a removeObserver:forKeyPath:
cuando se dealloc
un determinado objeto. Más tarde, en la ejecución, KVO ocurrió con un setter en una línea y eso voló el programa ya que KVO intentaba notificar un objeto que ya se había liberado.
Puedes usar un comando como este en lldb:
image lookup --address 0xec509b
Puede encontrar más comandos en: LLDB TO GDB COMMAND MAP
Tal vez sea demasiado tarde, pero para obtener más ayuda, en LLDB:
(lldb) p *(MyClassToPrint*)memory_address
P.ej
(lldb) p *(HomeViewController*)0x0a2bf700