如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进?
我希望能够说出(制作):
(gdb) trace Foo* Bar* printf
并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用.有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流.
无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果.我需要保留的调用顺序.
通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数.虽然我愿意完全记录所有功能.或者,也许告诉gdb记录特定库中的所有函数.
某些GDB向导必须有一个用于此常见作业的脚本!
在你的情况下,我将转向define
gdb中的命令,它允许您定义一个函数,该函数最多可以包含10个参数.
您可以将函数名称传递给"trace"作为您定义的函数的参数,或者将它们全部记录在函数本身中.我会做类似以下的事情
define functiontrace if $arg0 break $arg0 commands where continue end end if $arg1 ...
gdb中用户定义函数的参数引用为$ arg0- $ arg9.或者,您可以在函数中记录要跟踪的每个函数,而不是使用$ arg0-9.
注意:这不会缩进堆栈跟踪中的深度,但每次调用函数时都会打印堆栈跟踪.我发现这种方法比strace等更有用...因为它会记录你想要的任何函数,系统,库,本地或其他.