对gdb中观察点的新旧值的编程访问

对gdb中观察点的新旧值的编程访问,gdb,rr,Gdb,Rr,我真正做的是在设置或清除单个位时设置一个观察点。我通过在包含位的字上设置一个观察点,然后使其以*word&mask为条件(用于设置,或(~*word)和mask用于清除) 问题是同一单词中的其他一些位可能会被修改,而条件可能恰好已经匹配。如果我有新旧值,我可以设置一个条件($old^$new)&mask) 我查看了pythongdb.Breakpoint类,但它似乎也没有收到此信息 我想我可能会发疯,设置一个命令列表,每当*word的值发生变化时记录当前值,并将其用作$old。但是有一半的时间我

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

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

我查看了python
gdb.Breakpoint
类,但它似乎也没有收到此信息


我想我可能会发疯,设置一个命令列表,每当
*word
的值发生变化时记录当前值,并将其用作
$old
。但是有一半的时间我是通过rr来使用它的,所以我可能会倒退;多年来(以你的确切案例为例…)这一直是个问题。。信息存储在与断点关联的
struct bpstats
对象的
old_val
字段中;但这只用于打印旧值,而不在其他地方公开

一种选择可能是通过方便变量或Python更改gdb以公开该值

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


这似乎是可行的。您的脚本可以检查当前的执行方向。主要的困难是在创建此观察点时,或者在禁用并重新启用它之后,记住重置保存的值。

我有一个函数,它的第一行正好是
++depth
,最后一行是
--depth
(无效函数,无其他返回)。我希望Python代码(gdb.Breakpoint的子类)在函数的开始和结束处运行。所有的技巧似乎对我都不起作用,所以我认为在变量
depth
上设置一个观察点可能会起作用,但我无法区分
++depth
--depth
(函数enter和exit)。有什么解决办法吗?我确实想出了一个技巧,在函数begin处设置断点,在
depth
变量上设置观察点,并保持全局状态(基本上是堆栈),跟踪这两个变量触发的所有时间。在函数断点中,将
推到堆栈上;在观察点中,如果最后一个触发器是函数,则将
|
推到堆栈上(您知道您正在输入函数),否则弹出两次(您知道您正在退出),等等。但我认为存在一些不那么疯狂的情况。:-)