如何在Linux下获得C ++程序中调用的函数的打印?

时间:2011-01-20 15:33:20

标签: c++ c debugging trace

我想要的是混合使用静态代码分析(如Doxygen)和使用GDB时可以看到的堆栈帧。我知道我正在调试哪个有问题的函数,我想看到函数调用的邻域,它引导执行到这个函数调用。例如,运行一个简单的HelloWorld!会输出类似的东西:

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

表示从main函数调用构造函数,然后调用printHello和printWorld函数。请注意,在GDB中,如果我在printWorld中断,我将无法在堆栈框架中看到printHello被调用。

关于如何跟踪函数调用而不经历在无数源文件中插入日志消息的痛苦的任何想法?

谢谢!

6 个答案:

答案 0 :(得分:2)

-finstrument-functions optiongcc指示编译器在每个函数入口和出口处调用用户提供的分析函数。

您可以使用它来编写一个只记录每个函数入口和退出的函数。

答案 1 :(得分:1)

从阅读问题中我了解到,您需要在执行时按顺序执行所有相关功能的列表。

不幸的是,没有应用程序可以自动生成此列表,但是有一些辅助宏可以为您节省大量时间。定义一个名为LOGFUNCTION的宏或任何你想要的宏,并将其定义为:

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

现在,您必须将行LOGFUNCTION粘贴到要添加跟踪的任何位置。

只要你认为合适。

请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Names.htmlhttp://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

答案 2 :(得分:0)

GDB具有堆栈跟踪功能,可满足您的要求。

答案 3 :(得分:0)

他想要的是获取信息(例如,从gdb回溯),但以比gdb更好的格式打印。 我想你不能。我的意思是,也许有某种类型的应用程序可以跟踪你的应用程序并做类似的事情,但我从来没有听说过这样的事情。

你可以做的最好的事情是使用GDB,也许创建某种类型的bash脚本,使用gdb获取信息并以你喜欢的方式打印出来。

当然,您的应用程序必须使用调试符号(-g param to gcc)进行编译。

答案 4 :(得分:0)

我不完全确定gdb的回溯是什么问题,但是分析器可能更接近你想要的?例如,使用valgrind:

valgrind --tool cachegrind ./myprogram
kcachegrind callgrind.out.NNNN

答案 5 :(得分:0)

您是否尝试过使用gprof生成调用图?您还可以使用gprof2dot将gprof输出转换为更容易的东西。