Какао: перерыв при каждом вызове метода? - PullRequest
5 голосов
/ 05 августа 2011

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

Более чистое решение - установить точки останова на каждом из моих методов, настроить их действия для выдачи команды отладчика: po NSStringFromSelector(_cmd) и настроить их на автоматическое продолжение. Это красивее и избавляет меня от необходимости помнить об удалении всех этих NSLog с, но не менее повторяется или отнимает много времени.

Что я действительно хочу, так это способ установить символическую точку останова, которая ломается на каждом методе (класса? Модуля?). У каких-нибудь мастеров отладки / времени выполнения есть решение или советы, с чего начать поиск?

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Все вызовы метода Objective-C проходят через один из вызовов времени выполнения C objc_msgSend, objc_msgSend_stret, objc_msgSendSuper и objc_msgSendSuper_stret согласно разделу «Отправка сообщений» в справочнике времени выполнения Objective-C . 1006 *. Таким образом, вы должны быть в состоянии перехватить их и дать им действия для регистрации соответствующих частей первых двух параметров (это target и селектор для обычных посылок, структура, описывающая суперкласс, который содержит как цель, так и тип класса для супер-вызовов ).

2 голосов
/ 05 августа 2011

Я думаю, что ваш нынешний подход к установлению контрольной точки для каждого интересующего вас метода - лучшая ставка. Как объяснил @Tommy, во время выполнения есть небольшое количество функций отправки сообщений, которые вы можете прервать, но я заставляю отладчик оценивать условную точку останова при каждой отправке одного сообщения, вероятно, значительно замедлит работу вашего приложения.

Один из способов сделать настройку точек останова немного проще - это сделать из командного файла GDB. Поместите команды для установки точек останова для всех представляющих интерес методов в одном файле, который вы можете загрузить в начале сеанса отладки. Установка всех точек останова в одном файле дает вам одно место для редактирования списка, и редактирование файла должно быть простым с копированием и вставкой.

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

2 голосов
/ 05 августа 2011

Используйте систему ведения журнала, такую ​​как Log4Cocoa . Регистрация метода, номера строки и файла, из которого он был вызван, является основной функцией таких систем регистрации.

Каждому вызову регистрации присваивается уровень детализации, определяющий, при каких условиях он должен регистрироваться. Затем вы установите уровень детализации, чтобы получить желаемый объем информации. Например, продукты, созданные для выпуска, будут регистрировать только ошибки и, возможно, предупреждения; Уровень отладки будет регистрировать все.

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