Подтвердить что ты не робот

Отслеживать все вызовы метода ObjC?

Иногда, глядя на кого-то еще большую программу Objective-C, трудно знать, с чего начать.

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

Есть ли способ сделать это? В принципе, сделайте одно изменение в каком-то центральном месте и запишите каждый метод, который вызывается. Предпочтительно ограничено методами, отличными от Apple.

4b9b3361

Ответ 1

Вы можете установить для переменной среды NSObjCMessageLoggingEnabled значение YES. Это будет записывать журнал всех сообщений в папке/tmp/msgSends-xxx.

Ответ 2

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

Как сделать это для ваших собственных методов, только если это задача касания. Может быть, если бы вы могли проверить имя класса, вызываемое и сделать какую-то магию, чтобы иметь условную точку останова только для вызовов, где префикс класса соответствует вашему?

Ответ 3

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

На стороне примечания, если это большая программа, лучше иметь какую-то документацию или интро-комментарий для людей, чтобы начать с кода.

В любом случае каждое приложение Cocoa имеет метод applicationDidFinishLaunching.... Это хорошее место для начала. Некоторые приложения также имеют свой основной (или "главное окно" ) класс, определенный в файле Info.plist. Обе эти вещи могут дать вам подсказку о том, какие классы (в частности, контроллеры просмотра) являются наиболее известными и какие методы, вероятно, будут иметь длинные трассировки стека во время работы программы. Как игровой цикл в игровом движке или какой-то другой часто называемый метод. Поставив точку останова внутри такого метода и глядя на трассировку стека в отладчике, вы можете получить общее представление о том, что происходит.

Если это приложение с интерфейсом UI, просмотр его файлов NIB и классов, используемых в них, также может помочь определить некоторые функции приложения, которые вы, возможно, ищете.

Другой вариант - запустить инструмент Time Profiler и установить флажки Hide missing symbols и Hide system libraries. Это даст вам не только вид птичьего полета на методы, которые вызывают внутри программы, но и будет пинтовать наиболее часто называемые.

Взаимодействуя с вашей программой с записью Time Profiler, вы также можете идентифицировать различные части функциональности программы и легко сопоставить их с вашими действиями.

Ответ 4

Инструменты позволяют создавать собственные "инструменты", которые на самом деле выглядят как DTrace скрипты. Используйте пункт меню "Инструмент" → "Создать новый инструмент" и выберите параметры, например, какую библиотеку вы хотите отслеживать, что вы хотите записывать, когда вы нажимаете определенные функции и т.д. Идите в дикую природу!

Ответ 5

Это интересный вопрос. Ответ был бы более интересным, если бы решение поддерживало несколько потоков выполнения и была какая-то временная шкала вызовов, которая могла бы сообщать о деятельности со временем (возможно, особенно с пользовательскими событиями, построенными каким-то образом).

Обычно я запускаю отладчик, устанавливаю точку останова в основной точке входа (например, - applicationDidFinishLaunching: withOptions:) и прохожу в отладчике.

В OSX есть также некоторые инструменты командной строки (например, образец и куча), которые могут обеспечить некоторую проницательность.

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

Если вам нужно было зарегистрировать номер потока, а также адрес вызова и некоторые сведения о кадре, кажется, что фрагменты будут построены для построения временной шкалы вызовов. Логика для определения соответствующей библиотеки (предоставляемой Apple или третьей стороны) должна существовать в Apple symbolicatecrash script.