以编程方式访问 gdb 中观察点的旧值和新值
Programmatic access to old and new values of a watchpoint in gdb
我真正在做的是尝试在单个位的设置或清除上设置一个观察点。为此,我在包含该位的字上设置了一个观察点,然后使其以 *word & mask
为条件(用于设置,或 (~*word) & mask
用于清除。)
问题是同一个字中的其他一些位可能被修改了,并且条件可能恰好已经匹配。如果我有旧值和新值,我可以设置条件 (($old ^ $new) & mask)
.
我看了pythongdb.Breakpoint
class,但是好像也没有收到这个信息
我想我可以疯狂地设置一个命令列表,每当 *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 它。
我真正在做的是尝试在单个位的设置或清除上设置一个观察点。为此,我在包含该位的字上设置了一个观察点,然后使其以 *word & mask
为条件(用于设置,或 (~*word) & mask
用于清除。)
问题是同一个字中的其他一些位可能被修改了,并且条件可能恰好已经匹配。如果我有旧值和新值,我可以设置条件 (($old ^ $new) & mask)
.
我看了pythongdb.Breakpoint
class,但是好像也没有收到这个信息
我想我可以疯狂地设置一个命令列表,每当 *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 它。