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