11

gdb の Objective-C オブジェクトにメッセージを送信しようとしています。

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

私はそれにメッセージを送ることができません。何か不足していますか?本当にシンボルが必要ですか、それとも何か他のものが必要ですか?

4

3 に答える 3

10

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 ]
于 2008-09-15T06:54:05.183 に答える
1

キャストする必要がある可能性はあります$esiか?

p (NSUInteger)[(NSArray *)$esi count]
于 2008-09-11T18:27:46.937 に答える
0

@ [ジョン・カルスビーク]

次に、シンボルの欠落について文句を言います。

(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
$11 = 367589056
(gdb) po $eax
<NSCFArray 0x15e8f6c0>(
    file://localhost/Users/ask/Documents/composing-fractals.pdf
)

(gdb) p (int)[$eax retainCount]
$12 = 1

ですから、私が調査していたオブジェクトに問題があったと思います...または何か。

ご協力いただきありがとうございます!

于 2008-09-12T11:02:27.933 に答える