我正在尝试调试我在 C++ 大学课程中编写的小型操作系统。在运行时,我的某个对象之一正在损坏。这似乎是由于意外写入错误的内存地址而发生的。由于我无法通过纯粹查看代码来找到发生这种情况的地方,因此我需要另一种方法。
由于这是一个操作系统,我无法将 valgrind 之类的工具附加到它,但我可以在附加了 gdb 的模拟器(bochs/qemu)中运行它。
gdb 中有没有办法跟踪对类实例或更一般的特定内存范围的写访问?我想在写访问发生时立即中断,这样我就可以验证这是否有效。
您可以放置一个观察点:
watch x
这将在x
修改时中断。 x
可以是任何类型的变量。如果你有:
class A;
A x;
然后,只要 x 被修改,gdb 就会中断。
您实际上可以在任何表达式上放置一个观察点,当表达式更改时 gdb 将中断。不过要小心这一点,因为如果表达式不是底层硬件支持的东西,gdb 将不得不在每条指令之后评估它,这会导致糟糕的性能。例如,如果A
上面是一个有很多成员的类,那么 gdb可以监视整个实例x
,但它的工作方式是:
x
已更改自然,这是非常缓慢的。If x
is an int
then gdb 可以使用硬件断点。
如果您有特定的内存地址,您也可以查看它:
watch *0x1234
当 [0x1234] 的内容发生变化时,这将中断。
您还可以使用rwatch
, 或awatch
设置读/写断点来设置读断点。
如果您至少知道它发生的大致位置,您也可以只使用“显示”而不是观察并手动逐行逐行直到您看到更改发生的时间。使用“watch”查看地址实在是太慢了。