以编程方式访问 gdb 中观察点的旧值和新值

Programmatic access to old and new values of a watchpoint in gdb

我真正在做的是尝试在单个位的设置或清除上设置一个观察点。为此,我在包含该位的字上设置了一个观察点,然后使其以 *word & mask 为条件(用于设置,或 (~*word) & mask 用于清除。)

问题是同一个字中的其他一些位可能被修改了,并且条件可能恰好已经匹配。如果我有旧值和新值,我可以设置条件 (($old ^ $new) & mask).

我看了pythongdb.Breakpointclass,但是好像也没有收到这个信息

我想我可以疯狂地设置一个命令列表,每当 *word 的值发生变化时记录当前值,并将其用作 $old。但是有一半时间我在使用它,我实际上是通过 rr 使用它,所以我可能会倒退。

在 gdb 中没有直接获取这些值的方法;多年来,它一直是 wish-list bug(以您的确切案例为例...)。信息存储在与断点关联的 struct bpstats 对象的 old_val 字段中;但这仅用于打印旧值,不会暴露在其他地方。

一个选项可能是更改 gdb 以通过方便的变量或通过 Python.

公开此值

I suppose I could go crazy and set a command list that records the current value whenever the value of *word changes, and use that as $old. But half the time I'm using this, I'm actually using it through rr, so I might be going backwards.

这似乎是可行的。您的脚本可以检查当前的执行方向。主要的困难是记住在制作这个观察点时重置保存的值,或者在禁用之后然后 re-enabling 它。