2009-10-15 4 views
12

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

ответ

14

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

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

  1. Откройте окно «Breakpoints»: Command-Option-B
  2. Двойной щелчок на последнем ряду, чтобы создать новую символическую точку останова
  3. Введите символ: objc_msgSend
  4. Введите условие в столбце «состояние»: *(int*)($esp+4) == 0

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

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

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

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

4

В качестве альтернативы, вы можете использовать DTrace:

Using dtrace to log traces messages-to-nil

И это может быть done in Instruments тоже.

+0

Я добавил свой блог в свой RSS - отличный материал. – nall

+0

Прохладный. У меня есть больше сообщений в списке задач. Просто нужно найти время. – bbum

Смежные вопросы