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

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

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

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

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

Ответы на вопрос(3)

абсолютно все...

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

 Ben Dowling07 мар. 2013 г., 05:10
Можно ли поймать другие функции C?
 tc.07 мар. 2013 г., 05:14
@BenDowling Конечно: точка останова для каждой точки входа в функцию. Найти их будет немного сложнее.
 Micko25 сент. 2010 г., 14:37
Спасибо за ваш ответ! Я попробую, когда найду время. Извините за задержку!
 Ben Dowling07 мар. 2013 г., 08:49
Как мне установить точку останова для каждой точки входа в функцию? Моя цель - узнать, какие низкоуровневые функции iOS C вызываются, поэтому я заранее не знаю их имен.
 tc.07 мар. 2013 г., 20:04
@BenDowling Найти их будет немного сложнее, тем более что некоторые частные фреймворки не имеют имен символов.
Решение Вопроса

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

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

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

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

 Micko25 сент. 2010 г., 14:40
Спасибо за ваш ответ! Я тоже попробую, когда найду время. Извините за задержку!
 ramo23 мая 2014 г., 22:16
Это дает мне фатальную ошибку. любая идея

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

 Micko25 сент. 2010 г., 01:20
это верное направление, но оно все равно не даст вам всего, что происходило. есть что-то еще?
 Dan Ray27 сент. 2010 г., 13:23
Вы можете поместить точку останова в первую строку main () и буквально проходить через каждую строку кода и в каждом вызове фреймворка. Я не знаю, что еще вы могли бы хотеть увидеть.

Ваш ответ на вопрос