c++ - 是否可以在同一 gdb session 中跨重新运行保留硬件观察点?

标签 c++ gdb

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

相关文章:

c++ - Armadillo C++ : Passing a submatrix into a function

c++ - 按名称或签名计算函数调用。海合会,C++

c++ - 从 vscode C++ 调试步骤中排除文件?

linux - 将文件输入和标准输入传递给 gdb

ubuntu - 使用 Eclipse CDT gui wrapper for gdb 分析转储

linux - 如何使 gdb tui 窗口变大

c++ - 指向类数据成员 "::*"的指针

c++ - 如何确保迭代器不会越过 end()?

c++ - 什么是严格的别名规则?

c++ - 如何使用 C++ 遍历数独子网格?