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

问题描述 投票:0回答:2

假设我启动一个 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

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

c++ gdb
2个回答
2
投票

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

watch -location

要禁用随机化,请使用:

(gdb) set disable-randomization on

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

接下来,使用:

(gdb) watch -location NeverGoOutOfScope

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

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


0
投票

在内存地址上设置监视指针可以解决您的问题。

(gdb) p &NeverGoOutOfScope
$4 = (int *) 0x7fffffffbc5c

(gdb) watch *(int *) 0x7fffffffbc5c
Hardware watchpoint 3: *(int *) 0x7fffffffbc5c

(gdb) r
© www.soinside.com 2019 - 2024. All rights reserved.