我想知道是否有人知道打印出C ++应用程序执行的所有函数调用的方法。它类似于linux命令strace
或ltrace
,除了它不仅打印系统调用,还打印正常的函数调用,析构函数调用,复制构造,方法等。 。
基本上就像GDB在你step
时那样做,然后打印堆栈,除了这是自动的......
答案 0 :(得分:2)
-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
那样开箱即用