我想知道是否有人知道打印出 C++ 应用程序执行的所有函数调用的方法。它将类似于 linux 命令strace
or ltrace
,不同之处在于它不仅会打印出系统调用,还会打印出正常的函数调用、析构函数调用、复制构造、方法等......
基本上就像 GDB 在你step
打印堆栈时所做的那样,除了这将是自动的......
-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