objective-c debugging osx gdb reversing

objective c - Enviar mensajes a objetos al depurar Objective-C en gdb, sin símbolos



debugging osx (3)

Estoy tratando de enviar mensajes a objetos Objective-C en gdb.

(gdb) p $esi $2 = (void *) 0x1268160 (gdb) po $esi <NSArray: 0x1359c0> (gdb) po [$esi count] Target does not respond to this message selector.

No puedo enviarle ningún mensaje. ¿Me estoy perdiendo de algo? ¿Realmente necesito los símbolos u otra cosa?


¿Es posible que necesites lanzar $esi ?

p (NSUInteger)[(NSArray *)$esi count]


@ [John Calsbeek]

Luego se queja de los símbolos faltantes.

(gdb) p (NSUInteger)[(NSObject*)$esi retainCount] No symbol table is loaded. Use the "file" command. (gdb) p [(NSArray *)$esi count] No symbol "NSArray" in current context.

Intenté cargar los símbolos para Foundation:

(gdb) add-symbol-file /System/Library/Frameworks/Foundation.framework/Foundation add symbol table from file "/System/Library/Frameworks/Foundation.framework/Foundation"? (y or n) y Reading symbols from /System/Library/Frameworks/Foundation.framework/Foundation...done.

pero todavía sin suerte:

(gdb) p [(NSArray *)$esi count] No symbol "NSArray" in current context.

De todos modos, no creo que el casting sea la solución a este problema, no debería tener que saber qué tipo de objeto es, para poder enviarle mensajes. Lo extraño es que encontré un NSCFArray. No tengo problemas para enviar mensajes a:

(gdb) p $eax $11 = 367589056 (gdb) po $eax <NSCFArray 0x15e8f6c0>( file://localhost/Users/ask/Documents/composing-fractals.pdf ) (gdb) p (int)[$eax retainCount] $12 = 1

así que supongo que hubo un problema con el objeto que estaba investigando ... o algo así.

¡Gracias por tu ayuda!


Si debe anular gdb y enviar un mensaje a un objeto cuando no lo permita, puede usar performSelector:

(gdb) print (int)[receivedData count] Target does not respond to this message selector. (gdb) print (int)[receivedData performSelector:@selector(count) ] 2008-09-15 00:46:35.854 Executable[1008:20b] *** -[NSConcreteMutableData count]: unrecognized selector sent to instance 0x105f2e0

Si necesita pasar un argumento, use withObject:

(gdb) print (int)[receivedData performSelector:@selector(count) withObject:myObject ]