Как увидеть каждый метод, вызываемый при запуске приложения в симуляторе iPhone?

Мне бы очень хотелось видеть каждый метод, делегат, уведомление и т. Д., Которые вызываются / отправляются, когда я запускаю свое приложение в iPhone Simulator. Я думал, что правильное место для этого будет в отладчике, но я не могу найти правильную настройку.

Моя цель - увидеть все, что происходит в фоновом режиме, в то время как я, например, добавляю строку в UITableView или нажимаю кнопку "назад" в моем UINavigationController.

Это очень помогло бы выяснить, какой делегат использовать, когда что-то происходит в приложении или когда пользователь нажимает кнопку, меняет представление и т. Д.

Можно ли получить эту информацию?

3 ответа

Решение

Вы можете выйти из всего, что происходит, когда ваше приложение работает, используя DTrace, фреймворк, который позволяет вам исследовать внутреннюю работу всего, что работает на современном Mac. У нас пока нет DTrace для iOS, но он будет работать, пока вы работаете в симуляторе.

Я опишу основы DTrace в этой статье для MacResearch, а затем приведу пример пользовательского инструмента, который вы можете встроить в инструменты с помощью DTrace, в конце этой статьи. Этот инструмент регистрирует все методы, вызываемые на всех объектах (даже внутренних системных), с момента запуска приложения до его завершения. -applicationDidFinishLaunching:,

Чтобы упростить это, вы можете просто создать собственный инструмент, используя Instrument | Build New Instrument пункт меню в инструментах. Установите один из дескрипторов зонда, чтобы он выглядел следующим образом:

альтернативный текст

только игнорировать isInApplicationStart и параметры ведения журнала отметок времени. Простой зонд, отвечающий на любой метод Objective C в любом классе, запишет все эти сообщения в консоль Instruments, что звучит так, как вы хотите для отладки.

Если вы уверены, что хотите абсолютно все...

  1. точка остановки objc_msgSend а также objc_msgSend_stret, Почти все вызовы методов используют эти две функции (mumble mumble IMP-кеширование).
  2. Хорошо, теперь ваше приложение все время попадает в отладчик. Итак, нажмите на поле автоматического продолжения.
  3. Но теперь вы не видите ничего особенного, поэтому отредактируйте точки останова и добавьте команду "bt", чтобы получить обратную трассировку.
  4. Утопить в отладочном спаме.

Конечно, это не поймает другие функции Си.

Если вы просто хотите ловить уведомления, вы можете сделать что-то вроде этого (гораздо меньше спама):

+(void)load
{
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEveryNotification:) name:nil object:nil];
}

+(void)handleEveryNotification:(NSNotification*)notification
{
  CFShow(notification);
}

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

Делегаты не вызваны и не отправлены; это просто обычные вызовы метода Obj-C (строго "отправка сообщений", но это не имеет тот же сигнал).

Если вы добавите точку останова в свое приложение, вы сможете наблюдать за изменением стека вызовов, пока вы шагаете по коду. Это, вероятно, так близко, как вы собираетесь прийти к тому, что вы имеете в виду.

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