Отправка сообщений объектам при отладке Objective-C в gdb, без символов

Я пытаюсь отправлять сообщения объектам 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.

Я не могу послать ему сообщение. Я что-то пропустил? Мне действительно нужны символы или что-то еще?

Примечание. Тег [reversing] не предназначен для описания тем, связанных с обратным проектированием; вместо этого используйте [обратное проектирование]

user1354557 22.06.2016 18:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
1
3 579
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно ли, что нужно лить $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 ]

Другие вопросы по теме