Я пытаюсь отправлять сообщения объектам Objective-C в gdb.
(gdb) p $esi
= (void *) 0x1268160
(gdb) po $esi
<NSArray: 0x1359c0>
(gdb) po [$esi count]
Target does not respond to this message selector.
Я не могу послать ему сообщение. Я что-то пропустил? Мне действительно нужны символы или что-то еще?





Возможно ли, что нужно лить $esi?
p (NSUInteger)[(NSArray *)$esi count]
@ [Джон Калсбек]
Потом жалуется на недостающие символы.
(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.
Я попытался загрузить символы для 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.
но все равно не повезло:
(gdb) p [(NSArray *)$esi count]
No symbol "NSArray" in current context.
В любом случае, я не думаю, что приведение типов является решением этой проблемы, вам не нужно знать, что это за объект, чтобы иметь возможность отправлять ему сообщения. Странно то, что я нашел NSCFArray, на который нет проблем с отправкой сообщений:
(gdb) p $eax
= 367589056
(gdb) po $eax
<NSCFArray 0x15e8f6c0>(
file://localhost/Users/ask/Documents/composing-fractals.pdf
)
(gdb) p (int)[$eax retainCount]
= 1
так что, я думаю, была проблема с объектом, который я исследовал ... или что-то в этом роде.
Спасибо за вашу помощь!
Если вы должны переопределить gdb и отправить сообщение объекту, когда он не позволяет вам, вы можете использовать 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
Если вам нужно передать аргумент, используйте withObject:
(gdb) print (int)[receivedData performSelector:@selector(count) withObject:myObject ]
Примечание. Тег [reversing] не предназначен для описания тем, связанных с обратным проектированием; вместо этого используйте [обратное проектирование]