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

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

一段时间后,我用 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

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

最佳答案

它应该在两个条件下工作:首先,您禁用地址空间随机化;其次,您使用 watch -location

要禁用随机化,请使用:

(gdb) set disable-randomization on

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

接下来,使用:
(gdb) watch -location NeverGoOutOfScope

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

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

关于c++ - 是否可以在同一个 gdb session 中重新运行时保留硬件观察点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37031948/

10-11 10:33