Добавление кода в файлы классов непосредственно перед сборкой - Цель C - PullRequest
0 голосов
/ 21 сентября 2011

Я ищу разработку фреймворка, о котором я не хочу вдаваться в подробности.

Предположим, у меня в приложении iPhone более 100 классов с 1000+ методами.В этом сценарии я хочу добавить NSLog в каждый метод (в начале или в конце или в обоих) каждого класса.

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

Спасибо и С уважением,


Денис,

Ваш ответ был самым полезным на многих форумах.Большое спасибо.

Причина, по которой я ищу что-то подобное, заключается в том, что у нас много клиентских проектов, и много раз случается, что у нас возникают некоторые сбои или другие проблемы во время QA и UAT.~ 80% из них не воспроизводимы или требуют определенного сценария.Мы использовали .crash и dsym для отслеживания таких проблем.Но это не так полезно в таком сценарии.

Я ищу, чтобы предоставить add hoc build, в которой будут записываться шаги, которые выполнил пользователь, чтобы упростить воспроизведение таких проблем.

В настоящее время я использую предварительно скомпилированные заголовки и первый метод, который вы упомянули (в поисках первой открывающей фигурной скобки, а затем замените ее макросом).

Я рассмотрю DTrace и objc_msgSend, как вы упомянули.Тем временем я буду гуглить, если у вас есть какие-то предпочтительные учебники, это будет здорово.

Спасибо и С уважением,: D

1 Ответ

1 голос
/ 24 сентября 2011

То есть вы хотите добавить средство трассировки в свой код?

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

В качестве альтернативы, вы можетевы хотите использовать общедоступные функции времени выполнения Objective C для перечисления всех классов и всех их методов, а затем метод-swizzle каждого из них с другим, который NSLog перед переходом к оригиналу.

В качестве альтернативы, вы можете взятьреализация с открытым исходным кодом objc_msgSend и вставка вызова в NSLog в начале.Обратите внимание, что obj_msgSend tail вызывает в методе, так что вы не сможете добавить вызов по возвращении.Будьте готовы к огромному выходу, конечно.Возможно, вы захотите ограничить свой вызов NSLog значением параметра селектора objc_msgSend (например, общим префиксом).

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

Но лучше задать вопрос почему вы хотите это сделать.

...