GDB:有什么方法可以构造 "Local" 方便的变量吗?

GDB: Is there some way to construct "Local" convenient variables?

我有一个实时 OO 程序(不过是用 C 语言编写的),我正在尝试调试它。我有一个问题,在特定的 window 时间内,数千个对象中的某些对象时不时地被损坏。我想在 window 的开头设置一个断点,它会自动在成员变量上设置一个观察点,然后在 window 的末尾通过另一个断点删除该观察点。问题是我需要某种方法将观察点编号绑定到给定对象。如果我可以通过某种机制构造一个方便的变量,例如,如果 $var=28,那么 set $x${var}=watch -l foo 将等同于 set $x28=watch -l foo。 (这实际上不起作用)这将允许我这样做:

breakpoint obj_init+23
command
  $var = *obj
  $x${var} = watch -l foo
  continue
done

breakpoint obj_final
command
  $var = *obj
  delete $x${var}
  continue
done

所以我(希望)不会超出可用硬件观察点的数量。

有谁知道我如何在不尝试编写 python 扩展的情况下实现这一点? (我的python很生疏。)

您可以使用 GDB 的 eval 命令来设置和使用名称由数字或字符串表达式的结果组成的变量。

您可以将 eval 视为对其参数执行 printf,然后执行结果字符串。 eval "set var $x%d = 1", 5 将 运行 命令 set var $x5 = 1.

您需要的另一条信息是,与所有断点命令一样,watch 命令会将便利变量 $bpnum 设置为断点编号。

break obj_init+23
commands
  set var $var = *obj
  watch -l foo
  eval "set var $x%d = $bpnum", $var
  continue
done

break obj_final
commands
  set var $var = *obj
  eval "delete $x%d", $var
  continue
done