gpt4 book ai didi

c++ - gdb:改变特定对象时中断

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:36 25 4
gpt4 key购买 nike

我有一个用 C++ 定义的对象,它有一个指向它的指针,用于整个项目的各种函数和文件。我在更新数据时遇到问题,所以我想调试它以查看发生了什么。理想情况下,我想在每次访问对象时中断。但是,watch 需要特定的内存地址。因此,例如,如果我有:

class data{
public:
int a;
int b;
};

那么 gdb 只会在 a 被更改时中断,因为指向数据的指针指向 a,但当 b 被更改时则不会.

是否有办法在 data 类覆盖的整个内存范围发生变化时中断?

最佳答案

Is there a way to break whenever the entire range of memory covered by the data class is altered?

也许。

GDB 硬件观察点在硬件中使用特殊的调试寄存器,这些寄存器的工作方式通常有限制。在 x86 上,您最多可以设置 4 个字大小的硬件观察点,例如您给了您可以&data->a 上设置观察点> 和 &data->b,这将“覆盖”data 的整个内存。

我猜你的实际 data 有更多的成员,所以 4 个字大小的观察点是不够的。

如果您在支持 Valgrind 的平台上,并且您的程序可以在 Valgrind 下执行,那么您可以使用 Valgrind 的内置 gdbserver在内存的任意区域设置观察点。

更新:

I looked through the page you linked to and couldn't find what I was looking for

我不确定你在找什么。这是一个示例 session ,展示了它是如何工作的:

#include <stdlib.h>

void foo(char *p)
{
*p = 'a';
}

typedef struct {
char buf[1024];
} data;

int main()
{
data *d = calloc(1, sizeof(data));
foo(d->buf + 999);
}

gcc -g main.c

valgrind --vgdb-error=0 ./a.out
...
==10345== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==10345== /path/to/gdb ./a.out
==10345== and then give GDB the following command
==10345== target remote | vgdb --pid=10345

... Valgrind 现在等待调试器附加。

在另一个窗口中:

gdb ./a.out
GNU gdb (GDB) 7.4
...
(gdb) target remote | vgdb --pid=10345
relaying data between gdb and process 10345
[Switching to Thread 10345]
0x0000000004000af0 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) b main
Breakpoint 1 at 0x40053d: file main.c, line 14.
(gdb) c

Breakpoint 1, main () at main.c:14
14 data *d = calloc(1, sizeof(data));
(gdb) n
15 foo(d->buf + 999);
(gdb) watch *d
Hardware watchpoint 2: *d

请注意,“硬件”观察点已在整个 *d 上设置。只有在 Valgrind 是硬件的意义上,它才是硬件观察点。

(gdb) p d.buf[999]
$1 = 0 '\000'
(gdb) c
Hardware watchpoint 2: *d

Old value = {buf = '\000' <repeats 1023 times>}
New value = {buf = '\000' <repeats 999 times>, "a", '\000' <repeats 23 times>}
foo (p=0x51b6457 "a") at main.c:6
6 }
(gdb) q

瞧:调试器在第 999 个元素被修改时停止,证明观察点“覆盖”了整个结构。

关于c++ - gdb:改变特定对象时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com