执行C ++应用程序的自动方法调用打印

时间:2012-09-27 07:13:39

标签: c++ debugging

我想知道是否有人知道打印出C ++应用程序执行的所有函数调用的方法。它类似于linux命令straceltrace,除了它不仅打印系统调用,还打印正常的函数调用,析构函数调用,复制构造,方法等。 。

基本上就像GDB在你step时那样做,然后打印堆栈,除了这是自动的......

1 个答案:

答案 0 :(得分:2)

使用-finstrument-functions

  

-finstrument-functions生成检测函数以进入和退出函数。在功能输入之后和功能之前   退出时,将调用以下分析函数   当前函数的地址及其调用站点。 (在某些平台上,   __builtin_return_address在当前函数之外不起作用,因此分析可能无法使用调用站点信息   否则就是其他功能。)

      void __cyg_profile_func_enter (void *this_fn,
                                     void *call_site);
      void __cyg_profile_func_exit  (void *this_fn,
                                     void *call_site);
     

第一个参数是当前函数的起始地址,可以在符号表中查找。

     

此工具也适用于内联扩展的功能   其他功能。分析调用将指示在哪里,   从概念上讲,输入和退出内联函数。这意味着   必须提供此类功能的可寻址版本。我摔倒   你对函数的使用是内联扩展的,这可能意味着一个   额外扩展代码大小。如果你在你的中使用`extern inline'   必须提供C代码,这些函数的可寻址版本。   (无论如何通常都是这种情况,但如果你运气好的话   优化器总是扩展内联函数,你可能已经得到了   离开而不提供静态副本。)

     

可以为函数赋予属性no_instrument_function,其中   如果没有这个仪器。这可以用于   例如,对于上面列出的分析功能,高优先级   中断例程,以及从中进行分析的任何函数   无法安全地调用函数(可能是信号处理程序,如果是   分析例程生成输出或分配内存。)

有些工具可以像etrace

那样开箱即用