假设我启动一个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有一些花哨的代码来重新评估观察点表达式,但实际上我认为这更有说服力而不是有用.
这种方法适合我的测试,但我必须在进程初始化期间忽略观察点的一些命中.