Как увидеть каждый метод, вызываемый при запуске приложения в симуляторе iPhone?
Мне бы очень хотелось видеть каждый метод, делегат, уведомление и т. Д., Которые вызываются / отправляются, когда я запускаю свое приложение в iPhone Simulator. Я думал, что правильное место для этого будет в отладчике, но я не могу найти правильную настройку.
Моя цель - увидеть все, что происходит в фоновом режиме, в то время как я, например, добавляю строку в UITableView или нажимаю кнопку "назад" в моем UINavigationController.
Это очень помогло бы выяснить, какой делегат использовать, когда что-то происходит в приложении или когда пользователь нажимает кнопку, меняет представление и т. Д.
Можно ли получить эту информацию?
3 ответа
Вы можете выйти из всего, что происходит, когда ваше приложение работает, используя DTrace, фреймворк, который позволяет вам исследовать внутреннюю работу всего, что работает на современном Mac. У нас пока нет DTrace для iOS, но он будет работать, пока вы работаете в симуляторе.
Я опишу основы DTrace в этой статье для MacResearch, а затем приведу пример пользовательского инструмента, который вы можете встроить в инструменты с помощью DTrace, в конце этой статьи. Этот инструмент регистрирует все методы, вызываемые на всех объектах (даже внутренних системных), с момента запуска приложения до его завершения. -applicationDidFinishLaunching:
,
Чтобы упростить это, вы можете просто создать собственный инструмент, используя Instrument | Build New Instrument
пункт меню в инструментах. Установите один из дескрипторов зонда, чтобы он выглядел следующим образом:
только игнорировать isInApplicationStart
и параметры ведения журнала отметок времени. Простой зонд, отвечающий на любой метод Objective C в любом классе, запишет все эти сообщения в консоль Instruments, что звучит так, как вы хотите для отладки.
Если вы уверены, что хотите абсолютно все...
- точка остановки
objc_msgSend
а такжеobjc_msgSend_stret
, Почти все вызовы методов используют эти две функции (mumble mumble IMP-кеширование). - Хорошо, теперь ваше приложение все время попадает в отладчик. Итак, нажмите на поле автоматического продолжения.
- Но теперь вы не видите ничего особенного, поэтому отредактируйте точки останова и добавьте команду "bt", чтобы получить обратную трассировку.
- Утопить в отладочном спаме.
Конечно, это не поймает другие функции Си.
Если вы просто хотите ловить уведомления, вы можете сделать что-то вроде этого (гораздо меньше спама):
+(void)load
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEveryNotification:) name:nil object:nil];
}
+(void)handleEveryNotification:(NSNotification*)notification
{
CFShow(notification);
}
Конечно, уведомления выполняются с помощью обычных вызовов методов, поэтому первый метод также показывает их (хотя и в большом количестве спама).
Делегаты не вызваны и не отправлены; это просто обычные вызовы метода Obj-C (строго "отправка сообщений", но это не имеет тот же сигнал).
Если вы добавите точку останова в свое приложение, вы сможете наблюдать за изменением стека вызовов, пока вы шагаете по коду. Это, вероятно, так близко, как вы собираетесь прийти к тому, что вы имеете в виду.