【问题标题】:Trace all user defined function calls using gdb使用 gdb 跟踪所有用户定义的函数调用
【发布时间】:2011-05-10 03:18:09
【问题描述】:

我想跟踪所有已调用的用户定义函数(按顺序,最好使用输入参数)。有没有办法使用 gdb 做到这一点?或者是否有更好的免费/开源应用程序来完成这项工作? 请注意,我只想打印用户定义的函数调用。

例如:

int abc(int a, char b) {
  return xyz(a+b);
}

int xyz(int theta) {
  return theta * theta;
}

我需要以下输出:

abc(a, b); xyz(θ);

我的代码库非常庞大,并且被编译成多个部分,因此我想避免使用需要我在启用某些选项的情况下再次编译源代码的工具。

PS:我发现有一些方法可以在 gdb 中定义函数并将函数名称作为参数传递以找出调用跟踪。但在我的情况下,代码库非常庞大,我从它开始,所以我什至不确定所有函数都被称为什么等等。在这里列出所有函数是不切实际的。

TIA,

【问题讨论】:

  • 你明白现在每秒调用十亿个函数是很可能的吗?这将转化为每秒几千兆字节的输出。部分问题可能在于您的“用户定义”限制;第三方库也是用户定义的。也许您的意思是“在我自己的源代码中定义的函数” - 您可以将日志记录限制在您自己的 .o 文件中定义的函数。
  • 您可能想查看 gprof 而不是 gdb
  • 据我记得,唯一可以让您设置一些断点选择的 gdb 命令是 rbreak,它会在匹配正则表达式的函数上中断。您需要的断点是否适合 - 例如一个通用的命名空间前缀?

标签: c++ c gdb trace


【解决方案1】:

您需要针对您的二进制文件运行某种形式的第三方工具,例如 Quantify (IBM) 或 Callgrind(或上面提到的@Paul R gprof)。他们将生成一个调用树,它将为您提供所需的信息,例如谷歌:“调用树 C 函数”,它将揭示许多您可以链接到您的代码的好东西...

如果你想自己滚动,你需要在每个函数的顶部添加一行,这会创建一个堆栈分配的对象,你可以捕获 ctor/dtor 序列以了解你何时输入并退出该函数,然后维护这些“堆栈”以生成您自己的调用树...很容易做到(在单线程中,在多线程中很复杂)...

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 2015-11-07
    • 1970-01-01
    • 2020-07-05
    • 2017-06-01
    • 2014-05-23
    • 1970-01-01
    • 2011-11-02
    • 2018-10-26
    相关资源
    最近更新 更多