跟踪所有变量以执行gdb中的功能

时间:2020-03-25 03:42:16

标签: c automation scripting gdb gdbinit

我想跟踪C函数中所有变量的状态。

我知道我可以在gdb中使用info命令来获取当前上下文中的所有变量状态。

我可以使用gdbinit来自动化gdb。

但是我要做的是在函数上设置一个断点,然后在执行每行打印后执行info命令。

基本上,我想设置2个断点:一个在函数的开头,一个在同一函数的结尾(我不知道如何做到),并在这两个点之间逐行执行。

我想要在gdbinit中输入类似内容:

b <func_name>
commands
while <inside the function>:
   info locals
   next
end
run

有没有办法显示上面的while循环?

1 个答案:

答案 0 :(得分:3)

基本上,我想设置2个断点:一个在函数的开头,一个在同一函数的结尾(我不知道如何做到),并在这两个点之间逐行执行。

您可以找到如何在函数here的末尾设置断点。但是,这不是必需的。

您可以使用$_caller_is() GDB便利函数来完成当前例程的执行,并在返回后停止。

示例:

int fn()
{
  int sum = 0;
  for (int j = 0; j < 5; j++) {
    sum += j;
  }
  return sum;
}

int main()
{
  return fn() - 10;
}

现在是GDB会话:

gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b 4
Breakpoint 1 at 0x1130: file t.c, line 4.
(gdb) run
Starting program: /tmp/a.out

Breakpoint 1, fn () at t.c:4
4     for (int j = 0; j < 5; j++) {
(gdb) while $_caller_is("main")
 >info locals
 >next
 >end
j = 1431654464
sum = 0
5       sum += j;
j = 0
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 0
sum = 0
5       sum += j;
j = 1
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 1
sum = 1
5       sum += j;
j = 2
sum = 1
4     for (int j = 0; j < 5; j++) {
j = 2
sum = 3
5       sum += j;
j = 3
sum = 3
4     for (int j = 0; j < 5; j++) {
j = 3
sum = 6
5       sum += j;
j = 4
sum = 6
4     for (int j = 0; j < 5; j++) {
j = 4
sum = 10
7     return sum;
sum = 10
8   }
sum = 10
main () at t.c:12
12    return fn() - 10;
(gdb) q

P.S。对于除玩具问题以外的所有问题,这种调试方法都将大大效率​​低下,并且效率不足(很少有有趣的状态完全被局部变量捕获)。