假设我启动一个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
是否可以保留观察点而无需重新创建它?
答案 0 :(得分:2)
它应该有两个条件:首先,你禁用地址空间随机化;第二,你使用watch -location
。
要禁用随机化,请使用:
(gdb) set disable-randomization on
我认为这是默认设置,因此您可以跳过此步骤。
接下来,使用:
(gdb) watch -location NeverGoOutOfScope
这将记录观察点中变量的地址。这几乎总是你真正想要的 - 当变量超出范围时,gdb有一些花哨的代码来重新评估观察点表达式,但实际上我认为这更有说服力而不是有用。
这种方法适用于我的测试,但我必须在进程初始化期间忽略观察点的一些命中。