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