Автоматическая трассировка выполнения программы

Я хотел бы знать, можем ли мы включить трассировку в любом приложении C или c++.

например, с опцией gcc или небольшим инструментом я включу трассировку, и трассировка будет напечатана на консоли или сброшена в файл.

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

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

strace не очень полезно, Так как он дает в основном системные вызовы.

8 ответов


чтобы отследить функцию входа / выхода, вы можете перекомпилировать свой код с помощью опции -finstrument-functions так что каждый раз, когда вызывается функция, а


для GCC вы можете построить с помощью профилирования поддержка, а затем запустите программу. Это создаст gmon.out файл, который в свою очередь будет содержать (своего рода) трассировку функций, выполняемых программой.

Это даже не приблизится к утилите или простоте использования написанной от руки трассировки printf () s, хотя.


Так как вы спрашивали о gcc. У него есть опция -finstrument-functions что позволяет выполнять произвольный код до и после вызовов функций.


использовать Log4cxx.

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

выполните шаги для запуска примера программы.


Если вы не хотите изменять все свои printf() вызовы, я бы предложил сделать что-то по этим строкам в файле заголовка и включить его во все ваши файлы кода C:

#ifndef DEBUG /* if not in debug mode, disable printf */
  #ifdef printf
    #undef printf
    #define printf(format, ...)
  #endif 
#endif

что круто с тем, что вы также можете заменить printf с функцией сбора:

#define printf(format, ...) my_log_function( format, ##__VA_ARGS__ )

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


насчет ltrace?

трассировки утилиты для вызовов функций библиотеки.


используйте Lttng, но для этого требуется инструментарий исходного кода, если вы хотите отслеживать на двоичных файлах systemtap linux. Также Аспект C++ может использоваться, если вам нужно кодировать и предварительно компилировать с компилятором аспекта


Я знаю, что вы не хотите добавлять что-то к каждой функции, но если это так же просто, как изменение { на { _ , это вас завоюет? Немного сценариев может сделать это автоматически-ping меня, если вам это нужно. Если это работает, то посмотрите на эту небольшую утилиту, которую я собрал - только один файл заголовка, чтобы включить, а затем вы получите хорошую портативную трассировку

https://github.com/goblinhack/callstack

например,: void my_function (void) {_ // rest of code }

вызов CALLSTACK_DUMP () на в любое время, чтобы сбросить текущий callstack.

просто делать

make
./callstack

Stack dump:
(stack) 1 main.cpp void foo3(int, int), line 7
(stack) 2 main.cpp void foo2(int), line 12
(stack) 3 main.cpp void foo1(), line 17
(stack) 4 main.cpp int main(int32_t, char **), line 22