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

rai*_*mue 6 c++ debugging trace gdb

我正在尝试调试我在C++大学课程中编写的小型操作系统.在运行时某处我的一个对象被破坏了.这似乎是由于意外写入错误的内存地址而发生的.由于我无法从纯粹的代码中找到发生这种情况的地方,我需要另一种方式.

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

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

Nat*_*man 8

你可以把观察点:

watch x
Run Code Online (Sandbox Code Playgroud)

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

class A;
A x;
Run Code Online (Sandbox Code Playgroud)

每当修改x时,gdb就会中断.

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

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

当然,这慢.如果x是,int那么gdb可以使用硬件断点.

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

watch *0x1234
Run Code Online (Sandbox Code Playgroud)

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

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