C / C ++ Вопрос о методах программирования трассировки - PullRequest
6 голосов
/ 30 августа 2010

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

Учитывая задачу 'abc', которая была создана с отладочной информацией, и глобальной переменной "TRACE", обычно равной 0, я хотел бы распечатать в файл 'log' адрес каждой функции, которая вызывается время, когда TRACE установлено в 1 и обратно в 0.

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

Какие-нибудь реализованные методы там?

Ответы [ 3 ]

3 голосов
/ 30 августа 2010

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

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

2 голосов
/ 30 августа 2010

Поиск общего пролога / эпилога не будет работать при наличии пропуска указателя кадра и оптимизации хвостового вызова. Кроме того, современные оптимизаторы любят разделять функции на несколько частей и объединять общие хвостовые части различных функций.

Стандартного решения не существует.

Для компилятора Microsoft проверьте _penter и _pexit hooks. Что касается GCC, посмотрите параметр -finstrument-functions и друзья.

Кроме того, в Windows x86 вы можете использовать такой монитор, как WinApiOverride32 . Он в первую очередь предназначен для мониторинга вызовов DLL и системных API, но вы можете сгенерировать файл описания из файла карты вашего приложения и также контролировать внутренние функции.

( Отредактировано: добавлена ​​ссылка на опцию GCC. )

1 голос
/ 30 августа 2010

Убедитесь, что вы просматривали предопределенные идентификаторы __func__ или __FUNCTION__. Они предоставляют строковый литерал имени функции / метода, который вы в данный момент выполняете.

...