c - 使 GDB 在调用时打印函数的控制流

标签 c debugging dynamic gdb call-graph

我如何让 gdb 打印感兴趣的函数,因为它们被调用,根据它们在堆栈中的深度缩进?

我希望能够说出类似(编造的)的话:

(gdb) trace Foo* Bar* printf

并让 gdb 打印所有以 Foo 或 Bar 开头的函数,因为它们被调用。有点像 gnu cflow,除了使用调试符号和只打印实际调用的函数,而不是所有可能的调用流。

无用的工具包括 cachegrind、callgrind 和 oprofile,它们对最常调用函数的结果进行排序。我需要保留调用顺序。

通配符(或等价物)是必不可少的,因为有很多 Foo 和 Bar 函数。尽管我会满足于记录所有功能。或者,也许告诉 gdb 记录特定库中的所有函数。

一些 GDB 向导必须有一个脚本来完成这个常见的工作!

最佳答案

在你的情况下,我会转向 gdb 中的 define 命令,它允许你定义一个函数,它最多可以接受 10 个参数。

您可以将函数名称作为您定义的函数的参数传递给“trace”,或者将它们全部记录在函数本身中。我会做类似下面的事情

define functiontrace
if $arg0
    break $arg0
    commands
        where
        continue
        end
    end

if $arg1
...

gdb 中用户定义函数的参数被引用为 $arg0-$arg9。或者,您可以只记录要在函数中跟踪的每个函数,而不是使用 $arg0-9。

注意:这不会缩进堆栈跟踪的深度,但会在每次调用函数时打印堆栈跟踪。我发现这种方法比 strace 等更有用...因为它会记录您想要的任何功能,系统、库、本地或其他。

关于c - 使 GDB 在调用时打印函数的控制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/311948/

相关文章:

JavaScript:在 IE7 中设置 div 标签的样式属性

c# - 如何从 C# ExpandoObject 按名称动态获取属性?

c - 解析命令仅适用于单字命令

c - 从 C 中的数组读取时出现错误字符/符号

debugging - NodeJS - NodeJS 的分步调试器

arrays - VBA 中的最长公共(public)子序列给出#VALUE!错误

arrays - D 动态数组初始化、stride和索引操作

c - 二维数组正在截断一些字符

c - 在二维数组中使用指针

php - magento 不发送任何邮件,如何调试?