Obtener información sobre direcciones de memoria defectuosas en LLDB


Estoy tratando de depurar un EXC_BAD_ACCESS en mi aplicación para iPhone. Se bloquea en una llamada a un método y en la línea del método es EXC_BAD_ACCESS (code=1, address = xxx).

Antes, solo habría usado gdb info malloc-history <xxx> para comenzar a depurar, pero estoy teniendo problemas para encontrar un comando paralelo en LLDB.

Vi este hilo que decía usar Instrumentos, pero cuando lo hago todavía tengo el bloqueo, pero no puedo averiguar cómo saber exactamente desde dónde se bloquea la aplicación en los Instrumentos.

Solo necesito averigua a dónde apuntaba este pedazo de memoria que se está estrellando. ¿Cuál es la mejor manera de hacer esto usando LLDB o Instrumentos?

Author: Community, 2012-03-24

4 answers

Este problema es muy fácil de resolver con un backtrace informativo. Desafortunadamente con la última versión de iOS y Xcode, una buena pista de pila a veces es difícil de conseguir. 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.

  1. Abra la navegación de punto de interrupción en Xcode 4 (Esto parece un rectángulo con un punto en el lado derecho)
  2. Presione el botón ' + ' en la parte inferior izquierda y agregue un "Punto de interrupción de excepción". Asegúrese de romper 'En tiro' para 'Todas' excepciones.

Ahora debería obtener un backtrace completo inmediatamente antes de que ocurra esta excepción. Esto debería permitirle al menos centrarse en dónde se está lanzando esta excepción.

 37
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-13 20:04:28

Puede ver la pila malloc si depura utilizando instrumentos.

Me encontré con el mismo problema que usted y del mismo modo quería saber cómo obtener el historial malloc cuando se utiliza lldb. Lamentablemente no encontré un comando ingenioso como malloc-history encontrado en gdb. Para ser honesto, acabo de cambiar mi depurador, pero me pareció molesto ya que sentí que no debería tener que hacer eso.

Para encontrar la historia de malloc usando instrumentos:

  1. Perfila tu proyecto
  2. Seleccionar Zombies de la lista de instrumentos introduzca la descripción de la imagen aquí
  3. Haga que su aplicación desencadene el problema
  4. En este punto, se le debe presentar la dirección que ya estaba desasignada y puede explorarla. introduzca la descripción de la imagen aquí Debería ser una simple cuestión de ver la historia de malloc en este punto. Borré 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.

Un Último Word

El problema con el que me encontré dio un mensaje como:

*** -[SomeClass retain]: mensaje enviado a la instancia desasignada 0x48081fb0 someProject (84051,0xacd902c0) malloc: grabación de malloc apila al disco usando el registrador estándar

Estaba realmente desconcertado de dónde venía este retain ya que el código en el que se estaba rompiendo no tenía uno (no en el getter o setter de la línea en la que estaba). Resulta que no estaba llamando removeObserver:forKeyPath: cuando un cierto objeto era dealloc ' ed. Más tarde en la ejecución KVO se produjo hacer a un setter en una línea y que explotó el programa ya que KVO estaba tratando de notificar a un objeto que ya estaba liberado.

 44
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-26 20:56:54

Puedes usar este comando en lldb:

image lookup --address 0xec509b

Puede encontrar más comandos en: MAPA DE COMANDOS DE LLDB A GDB

 14
Author: tristan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-22 00:14:43

Tal vez es demasiado tarde, pero para más ayuda, en LLDB:

(lldb) p *(MyClassToPrint*)memory_address

Por ejemplo

(lldb) p *(HomeViewController*)0x0a2bf700
 10
Author: Fabian Guerra Soto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 18:52:51