Подтвердить что ты не робот

Могу ли я получить предупреждения для отправки сообщений об ошибках?

Я знаю, что отправлять сообщения нильским объектам в Objective-C вполне нормально. Тем не менее, мне любопытно, есть ли какая-либо поддержка во время выполнения для таких ситуаций. Я вижу, что это полезно в ситуациях тестирования/отладки.

4b9b3361

Ответ 1

После небольшой игры с отладчиком это то, что я узнал.

Вы можете установить точку останова в objc_msgSend с условием останова на первом аргументе равным нулю (приемник):

  • Откройте окно "Точки останова": Command-Option-B
  • Дважды щелкните по последней строке, чтобы создать новую символическую точку останова.
  • Введите символ: objc_msgSend
  • Введите условие в столбце "Условие": *(int*)($esp+4) == 0

Когда вы запускаете свой исполняемый файл, он очень сильно ломается, так как очень часто отправляется сообщение в nil. Чтобы получить обзор того, что происходит, вы можете еще больше настроить свою точку останова:

  1. Нажмите кнопку "плюс", чтобы добавить команду точки останова.
  2. Выберите "Команда отладчика" из всплывающего окна.
  3. Введите p (char*)*(int*)($esp+8) в поле команды
  4. Установите флажок "автоматически продолжить" в строке точки останова (тот, у которого указана маленькая стрелка в последнем столбце).

Когда вы продолжите выполнение, вы увидите все имена сообщений (отправленных на нуль) в консоли отладчика.

Все вышеперечисленное работает только на Intel Mac (32 бит Cocoa или Cocoa Touch в симуляторе). Архитектура PPC или ARM использует другие имена регистров и соглашения о вызовах. Я оставляю это как упражнение для вас, чтобы узнать, как заставить это работать на этих платформах;)