2009-06-10 6 views
30

Tengo una simple pregunta sobre la depuración en Xcode y GDB.¿Cómo miro un objeto en el depurador de Xcode?

menudo me topo con un error:

unrecognized selector sent to instance 0x1081ad0 

que hace que la carga del programa en el BGF. ¿Hay una manera fácil de examinar qué instancia se encuentra en esa memoria de GDB?

Respuesta

42

po 0x1081ad0

po = Imprimir objeto. Incluso puede llamar a los métodos, como

po [myArray objectAtIndex:0]

Tenga en cuenta que sólo funciona en objetos, por lo

po 1

se colgará su programa.

+7

"po 1" no bloqueará su programa - gdb es más inteligente que eso. Simplemente imprimirá un mensaje de error. –

+10

También tenga en cuenta que para imprimir elementos que no sean objetos (como un int), solo nosotros p, como 'p 1' – RickDT

+1

¿dónde puede escribir eso? – chwi

6

Hay un par de cosas que puede hacer.

  1. Puede insertar un punto de quiebre que activará cada vez que tenga una excepción, por lo que, básicamente, crear un punto de quiebre para esto (ir a los puntos de ruptura y crear una nueva): - [aumento NSException]
  2. Alternativamente, se puede ver en realidad lo que el objeto en ese lugar mem es:

    símbolo de información o 0x1081ad0

    línea de información * 0x1081ad0

Hay más información en cocoadev wiki entry for exceptionhandling y debugging tips for objective C at cocoawithlove.

9

Steven es correcto - el comando gdb po es un atajo para print-object, que en realidad llama -debugDescription (no -description, como era de esperar) en el objeto proporcionado como argumento. En muchos casos, verá el mismo resultado en ambos métodos, ya que uno llama al otro a menos que se anule. (Véase la relacionada Nota:. llamada en this Apple technote para obtener más información Tenga en cuenta que en su ejemplo de código, po $r3 imprime el contenido de un registro PowerPC, pero se puede utilizar cualquier puntero de objeto/referencia, incluyendo registros de Intel, etc.)

Además, tenga en cuenta que print-object solo funcionará en objetos válidos que no se hayan desasignado. No servirá de nada si estás enviando un mensaje a un puntero borked. Sin embargo, dado el error que usted citó, parecería que es una instancia de objeto válida, simplemente no implementa el método que está tratando de invocar.

También es remotamente posible que el objeto ya haya sido destruido. This answer debería ayudar en ese caso.


Editar:

Hay otras maneras de "examinar" los objetos en el depurador.Le pregunté al this SO question sobre los formateadores de datos Xcode, que es una manera de determinar cómo aparece una clase personalizada en la columna Resumen del depurador. La documentación vinculada a esa pregunta explica cómo funciona. Encontré el enfoque de resumen para ayudar mucho a ver el estado de un objeto.

0

Su instancia no es válida. Has liberado el objeto en otro lugar, pero no borraste tu puntero ... habilita la detección Zombie.

Cuestiones relacionadas