c++ - 在 gdb 中跟踪对类实例/内存范围的写访问

标签 c++ debugging gdb trace

我正在尝试调试我在大学类(class)中用 C++ 编写的小型操作系统。在运行时某处我的对象之一被损坏。这似乎是由于不小心写入了错误的内存地址而发生的。由于我无法从纯看代码找到发生这种情况的地方,我需要另一种方式。

由于这是一个操作系统,我无法将 valgrind 之类的工具附加到它,但我可以在附加了 gdb 的模拟器 (bochs/qemu) 中运行它。

gdb 中是否有一种方法可以跟踪对类实例或更一般的特定内存范围的写访问?我想在写访问发生时立即中断,这样我就可以验证这是否有效。

最佳答案

你可以放置一个观察点:

watch x

x 被修改时,这将中断。 x 可以是任何类型的变量。如果你有:

class A;
A x;

然后 gdb 将在 x 被修改时中断。

您实际上可以在任何表达式上放置一个观察点,当表达式发生变化时 gdb 将中断。但是要小心这一点,因为如果表达式不是底层硬件支持的东西,gdb 将不得不在每条指令之后对其进行评估,这会导致糟糕的性能。例如,如果上面的 A 是一个有很多成员的类,那么 gdb 可以监视整个实例 x,但它的工作方式是:

  • 执行指令
  • 跳转到调试断点
  • 检查x是否改变
  • 返回程序

当然,这非常慢。如果 x 是一个 int,那么 gdb 可以使用硬件断点。

如果你有一个特定的内存地址,你也可以观看它:

watch *0x1234

当 [0x1234] 的内容发生变化时,这将中断。

也可以使用rwatch设置读断点,或者使用awatch设置读/写断点。

关于c++ - 在 gdb 中跟踪对类实例/内存范围的写访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/558366/

相关文章:

c++ - typedef 中的 typedef

c++ - C++11模板参数错误绑定(bind)示例?

c++ - Visual Studio natvis 语句的局部变量

asp.net - 使用 QueryString 值调试 ASP.NET 页面

c - 为什么在 GDB 中, "frame at"的值与 ebp($fp) 寄存器的值不同?

android - 使用 .bp 为 android 创建未剥离的可执行文件

c++ - 找到不同时间之间最快的时间在c++中返回错误的答案

c++ - 启用 "Optimize for debugging"的后果是什么?

Java调试——在jar包中搜索字符串

c - gdb 检查和打印给出不同的值