Ответ 1
После небольшой игры с отладчиком это то, что я узнал.
Вы можете установить точку останова в objc_msgSend
с условием останова на первом аргументе равным нулю (приемник):
- Откройте окно "Точки останова": Command-Option-B
- Дважды щелкните по последней строке, чтобы создать новую символическую точку останова.
- Введите символ:
objc_msgSend
- Введите условие в столбце "Условие":
*(int*)($esp+4) == 0
Когда вы запускаете свой исполняемый файл, он очень сильно ломается, так как очень часто отправляется сообщение в nil. Чтобы получить обзор того, что происходит, вы можете еще больше настроить свою точку останова:
- Нажмите кнопку "плюс", чтобы добавить команду точки останова.
- Выберите "Команда отладчика" из всплывающего окна.
- Введите
p (char*)*(int*)($esp+8)
в поле команды - Установите флажок "автоматически продолжить" в строке точки останова (тот, у которого указана маленькая стрелка в последнем столбце).
Когда вы продолжите выполнение, вы увидите все имена сообщений (отправленных на нуль) в консоли отладчика.
Все вышеперечисленное работает только на Intel Mac (32 бит Cocoa или Cocoa Touch в симуляторе). Архитектура PPC или ARM использует другие имена регистров и соглашения о вызовах. Я оставляю это как упражнение для вас, чтобы узнать, как заставить это работать на этих платформах;)