GDB硬件观察点非常慢 - 为什么?

时间:2010-03-15 09:36:46

标签: gdb watchpoint

在大型C应用程序中,我在内存地址上设置了硬件观察点,如下所示:

(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58

正如您所看到的,它是一个硬件观察点,而不是软件,它可以解释缓慢。

现在,调试器下的应用程序运行时间已从不到10秒变为1小时并且正在计数。到目前为止,观察点已触发三次,这是15分钟后第一次包含地址的内存页面被sbrk读取。当然,在那15分钟内,由于内存页面无法访问,因此观察点应该是高效的吗?而这仍然无法解释,为什么之后会如此缓慢。

平台是x86_64,GDB版本是Ubuntu 9.10包:

$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]

并根据来源建立GDB 7.1:

$ gdb-7.1 --version
GNU gdb (GDB) 7.1

提前感谢任何想法可能是什么原因或如何解决/解决它。

编辑:删除演员

编辑:gdb 7.1

4 个答案:

答案 0 :(得分:8)

我发现观看大字符缓冲区的速度非常慢,而观看缓冲区中的字符非常快。

e.g。

static char buf[1024];
static char* buf_address = &buf;

watch buf_address - 极其缓慢。

watch *buf_address - 非常快。

答案 1 :(得分:5)

这很可能是因为你每次都在施展它。试试这个:

(gdb) watch *0x12F5D58

另一个选择是您设置了太多硬件观察点,因此gdb被迫使用软件观察点。尝试检查您使用的观察点数:

(gdb) info break

并查看是否可以禁用某些观察点。

答案 2 :(得分:5)

我实际上遇到了GDB 7.x.x中硬件观察点的问题,这是不可接受的,因为观察点是我工作中的必需品。

根据同事的建议,我下载了6.7.1的源代码并在本地构建了它。观察点现在好多了。

可能值得一试。

答案 3 :(得分:1)

在x86上,您有以下限制:所有观察点可以覆盖不超过四个内存地址,每个内存地址可以监视一个内存字 - 这是因为硬件观察点(快速观察点)使用处理器调试寄存器,你有四个,因此需要注意四个地方。

相关问题