Как получить распечатку функций, вызываемых в программе на C ++ под Linux? - PullRequest
1 голос
/ 20 января 2011

То, что я хочу, - это сочетание того, что можно получить с помощью статического анализа кода, такого как Doxygen, и стекового фрейма, который вы можете увидеть при использовании GDB. Я знаю, какую проблемную функцию я отлаживаю, и я хочу видеть соседство вызовов функций, которые управляли выполнением этого вызова функции. Например, запуск простого HelloWorld! будет выводить что-то вроде:

main:
   Greeter::Greeter()
   Greeter::printHello()
   Greeter::printWorld()

обозначает, что из основной функции вызывался конструктор, а затем вызывались функции printHello и printWorld. Обратите внимание, что в GDB, если я прервусь в printWorld, я не смогу увидеть в стеке, что вызывается printHello.

Любые идеи о том, как отследить вызовы функций без необходимости вставлять сообщения журнала в множество исходных файлов?

Спасибо !!

Ответы [ 6 ]

2 голосов
/ 21 января 2011

Опция -finstrument-functions до gcc указывает компилятору вызывать предоставленную пользователем функцию профилирования при каждом входе и выходе функции.

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

1 голос
/ 20 января 2011

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

К сожалению, нет приложения для автоматического создания этого списка, но есть вспомогательные макросы длясэкономить много времени.Определите один макрос с именем LOGFUNCTION или что вы хотите, и определите его как:

#define LOGFUNCTION printf("In %s (%s:%d)\n", __PRETTY_FUNCTION__, __FILE__, __LINE__);

Теперь вам нужно вставить строку LOGFUNCTION туда, куда вы хотите добавить трассировку.

везде, где вы считаете нужным.

см. http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html и http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

0 голосов
/ 20 января 2011

Вы пытались использовать gprof для генерации графа вызовов?Вы также можете преобразовать вывод gprof во что-то более простое, например gprof2dot .

0 голосов
/ 20 января 2011

Я не совсем уверен, в чем проблема с трассировкой GDB, но, возможно, профилировщик ближе к тому, что вы хотите?Например, используя valgrind:

valgrind --tool cachegrind ./myprogram
kcachegrind callgrind.out.NNNN
0 голосов
/ 20 января 2011

Он хочет получить информацию (например, backtrace from gdb), но распечатать в «более хорошем» формате, чем gdb. Я думаю, что вы не можете. Я имею в виду, может быть, есть какое-то приложение, которое отслеживает ваше приложение и делает что-то подобное, но я никогда не слышал о чем-то подобном.

Лучшее, что вы можете сделать, - это использовать GDB, возможно, создать какой-нибудь скрипт bash, который использует gdb для получения информации и распечатывает ее так, как вам нравится.

Конечно, ваше приложение ДОЛЖНО быть скомпилировано с символами отладки (-g param to gcc).

0 голосов
/ 20 января 2011

GDB имеет трассировку стека, он делает то, что вы просите.

...