按名称或签名计算函数调用。 GCC、C++

Posted

技术标签:

【中文标题】按名称或签名计算函数调用。 GCC、C++【英文标题】:Count function calls by name or signature. Gcc, C++ 【发布时间】:2011-02-18 02:31:00 【问题描述】:

我有一些 c++ 编写的包。 Linux,海合会。我可以修改编译过程(更改 Makefile、标志等),但可以更改 C++ 源代码。

使用不同的参数运行包,它执行一项工作并退出。

如何计数: 1) 特定名称的函数调用次数? 2) 特定签名的函数调用次数? 3) 参数之一为特定类型的函数调用次数,即 std::string(类型由签名指定)? 4) extra STL对象的函数调用次数,即std::string拷贝构造函数?

(我的意思是计算运行期间的调用次数。)

我想用 GDB 来做,但我发现做 (1) 非常困难,并且根本没有找到如何做 (2)-(4)。


所有可接受的答案我都会在这里写给人类。

【问题讨论】:

人类欣赏它! 好吧,我觉得推荐它很有趣,但这不就是 gprof 实际上擅长的东西吗? 它可以计数,但是当你有名字和计数时,你必须以某种方式将你想要的功能与它“连接”起来。我的意思是(1)很容易实现。但是,即如何将具有指定参数类型的函数调用与 gprof 实际返回的函数名连接起来?现在我认为它太复杂了。如果有一种从 gprof 中提取它的简单方法,我将不胜感激。 gprof 不显示经过修饰的名称吗?它们可能不容易阅读,因为扩展的数据类型非常冗长,但 void foo(int)void foo(double) 不是一个函数,它们是两个(在 C++ 中)具有不同调用计数的函数。听起来这就是你想要的,除非我误解了。 【参考方案1】:

你可以尝试在linux下运行DTRACE。它绝对是您想要完成的任务的绝佳工具。

【讨论】:

【参考方案2】:

你检查过 Valgrind 的callgrind吗?

如果您不使用线程(或愿意尝试一下),gprof 在某些情况下非常容易。但是,有一个workaround 用于线程。

【讨论】:

以上是关于按名称或签名计算函数调用。 GCC、C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 eax 和 esi 中调用带有参数的函数。 GCC C++

按名称传递参数

当引入参数时,从指针调用成员函数的 C++ 调用内存访问冲突

gcc 和 clang 抛出“没有匹配的函数调用”但 msvc (cl) 编译并按预期工作

[Scala函数特性系列]——按名称传递参数

[Scala函数特性系列]——按名称传递参数