Как увидеть каждый метод, вызываемый при запуске приложения в симуляторе iPhone? - PullRequest
7 голосов
/ 25 сентября 2010

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 25 сентября 2010

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

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

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

alt text

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

5 голосов
/ 25 сентября 2010

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

  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 (строго «отправка сообщений», но это не одно и то же кольцо).

0 голосов
/ 25 сентября 2010

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

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