Используйте GDB для проверки класса Objective C на случай сбоя (HandleDelegateSource неверный доступ) - PullRequest
3 голосов
/ 25 ноября 2008

Я пытаюсь отладить случайную ошибку на iPhone, сбой со следом, который выглядит следующим образом:

objc_message_send
__invoking__
[NSInvocation invoke]
HandleDelegateSource
MainRunLoop
....

Когда GDB останавливается, я хотел бы иметь возможность определить детали того, какой селектор пытается вызвать система - я установил точку останова сейчас вокруг [NSInvocation Invoke], но с этого момента не могу понять, как исследовать детали объекта NSInvocation, в котором я остановился.

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Простой окончательный ответ - в GDB вы можете просто просмотреть регистр с именем вызываемого селектора (параметрSelector в ответе Лотара). Это строка C, поэтому вы наблюдаете ее с помощью одной из следующих команд (в зависимости от того, работаете ли вы в симуляторе или на устройстве):

Simulator: display /s $ecx
Device: display /s $r1
1 голос
/ 10 апреля 2009

Если вы посмотрите справочную информацию для objc_msgSend , вы увидите, что селектор является вторым аргументом. Теперь должно быть проще расшифровать выходные данные отладчика.

objc_msgSend
Отправляет сообщение с простым возвращаемым значением экземпляру класса.
id objc_msgSend (id получателя, SEL theSelector, ...)

Параметры
theReceiver
Указатель, указывающий на экземпляр класса, который должен получить сообщение.
theSelector
Селектор метода, обрабатывающего сообщение.
...
Переменный список аргументов, содержащий аргументы метода.

...