是否可以在同一gdb会话中重新运行硬件观察点?

时间:2016-05-04 15:22:14

标签: c++ gdb

假设我启动一个gdb会话,并创建一个断点并运行。

中断后,我根据当前执行中符号的内存地址创建一个观察点,并删除原始断点。

一段时间后,我用Control-C中断程序,仍在gdb中,我发出run命令从头开始重新启动程序。

但是,我希望在重新启动调试过程时保留硬件观察点。

是否有gdb设置允许我在重播期间保留硬件观察点?

更新:以下是重现问题的示例。

int main(){
    int NeverGoOutOfScope = 0;
    NeverGoOutOfScope = 7;
    while (1);
}

以下是gdb命令的序列。

break 3
run
watch NeverGoOutOfScope
info watch 
run 
# After this point, the breakpoint remains but the watchpoint is gone.
info watch

是否可以保留观察点而无需重新创建它?

1 个答案:

答案 0 :(得分:2)

它应该有两个条件:首先,你禁用地址空间随机化;第二,你使用watch -location

要禁用随机化,请使用:

(gdb) set disable-randomization on

我认为这是默认设置,因此您可以跳过此步骤。

接下来,使用:

(gdb) watch -location NeverGoOutOfScope

这将记录观察点中变量的地址。这几乎总是你真正想要的 - 当变量超出范围时,gdb有一些花哨的代码来重新评估观察点表达式,但实际上我认为这更有说服力而不是有用。

这种方法适用于我的测试,但我必须在进程初始化期间忽略观察点的一些命中。