6

我正在尝试调试我在 C++ 大学课程中编写的小型操作系统。在运行时,我的某个对象之一正在损坏。这似乎是由于意外写入错误的内存地址而发生的。由于我无法通过纯粹查看代码来找到发生这种情况的地方,因此我需要另一种方法。

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

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

4

2 回答 2

8

您可以放置​​一个观察点:

watch x

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

class A;
A x;

然后,只要 x 被修改,gdb 就会中断。

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

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

自然,这是非常缓慢的。If xis an intthen gdb 可以使用硬件断点。

如果您有特定的内存地址,您也可以查看它:

watch *0x1234

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

您还可以使用rwatch, 或awatch设置读/写断点来设置读断点。

于 2009-02-17T19:36:17.193 回答
3

如果您至少知道它发生的大致位置,您也可以只使用“显示”而不是观察并手动逐行逐行直到您看到更改发生的时间。使用“watch”查看地址实在是太慢了。

于 2009-02-17T21:52:51.483 回答