Pergunta

Estou tentando enviar mensagens para objetos Objective-C no gdb.

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

Não consigo enviar nenhuma mensagem para ele.Estou esquecendo de algo?Eu realmente preciso dos símbolos ou de algo mais?

Foi útil?

Solução

Se você precisar substituir o gdb e enviar uma mensagem para um objeto quando ele não permitir, você poderá 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

Se você precisar passar um argumento, use withObject:

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

Outras dicas

É possível que você precise lançar $esi?

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

@[John Calsbeek]

Depois reclama da falta de símbolos.

(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.

Tentei carregar os símbolos da Fundação:

(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.

mas ainda sem sorte:

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

De qualquer forma, não acho que o casting seja a solução para esse problema, você não deveria precisar saber que tipo de objeto é para poder enviar mensagens para ele.O estranho é que encontrei um NSCFArray para o qual não tenho problemas em enviar mensagens:

(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

então acho que houve um problema com o objeto que eu estava investigando...ou alguma coisa.

Obrigado pela ajuda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top