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

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

最佳答案 它应该有两个条件:首先,你禁用地址空间随机化;第二,你使用手表 – 位置.

要禁用随机化,请使用:

(gdb) set disable-randomization on

我认为这是默认设置,因此您可以跳过此操作.

接下来,使用:

(gdb) watch -location NeverGoOutOfScope

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

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

点赞