我如何让 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/