按名称或签名计算函数调用。 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++ 调用内存访问冲突