0

我想知道是否有人知道打印出 C++ 应用程序执行的所有函数调用的方法。它将类似于 linux 命令straceor ltrace,不同之处在于它不仅会打印出系统调用,还会打印出正常的函数调用、析构函数调用、复制构造、方法等......

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

4

1 回答 1

3

使用-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);

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

这种检测也适用于在其他函数中内联扩展的函数。从概念上讲,分析调用将指示输入和退出内联函数的位置。这意味着这些函数的可寻址版本必须可用。如果你对一个函数的所有使用都是内联扩展的,这可能意味着代码大小的额外扩展。如果您在 C 代码中使用“extern inline”,则必须提供此类函数的可寻址版本。(无论如何,这通常是这种情况,但如果你很幸运并且优化器总是内联扩展函数,那么你可能会在不提供静态副本的情况下侥幸逃脱。)

可以为函数赋予属性 no_instrument_function,在这种情况下,将不会执行此检测。例如,这可以用于上面列出的分析函数、高优先级中断例程以及不能安全地调用分析函数的任何函数(如果分析例程生成输出或分配内存,则可能是信号处理程序)。

有一些开箱即用的工具,例如etrace

于 2012-09-27T07:21:39.127 回答