【问题标题】:Programmatic access to old and new values of a watchpoint in gdb以编程方式访问 gdb 中观察点的新旧值
【发布时间】:2017-02-17 00:34:40
【问题描述】:

我真正在做的是尝试在单个位的设置或清除上设置观察点。我通过在包含该位的单词上设置一个观察点来做到这一点,然后以*word & mask 为条件(用于设置,或(~*word) & mask 用于清除。)

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

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

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

【问题讨论】:

    标签: gdb rr


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我有一个函数恰好有++depth 作为它的第一行,--depth 作为它的最后一行(void 函数,没有其他返回)。我希望我的 Python 代码(gdb.Breakpoint 的子类)在此函数的开始和结束处运行。 set breakpoint where the function returns 的所有技巧似乎都对我不起作用,所以我认为在我的变量 depth 上设置观察点可能会起作用——它确实有效,但我无法区分 ++depth--depth(函数进入和退出) .有什么解决办法吗?
    • 我确实想出了一个技巧,我在函数开始处设置断点和depth 变量上的观察点,并保持始终跟踪的全局状态(基本上是堆栈)其中已触发。在函数断点处将(推入堆栈;在观察点中,如果最后一个触发器是函数,则将 | 推入堆栈(并且您知道您正在进入该函数),否则弹出两次(您知道您正在退出它)等等。但是我想象有一些不那么疯狂的东西。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多