13

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

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

如您所见,它是一个硬件观察点,而不是软件,这可以解释缓慢。

现在调试器下的应用程序运行时间已从不到十秒变为一小时并且还在增加。到目前为止,观察点已经触发了 3 次,第一次是在 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

4 回答 4

9

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

例如

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

watch buf_address- 极其缓慢。

watch *buf_address- 非常快。

于 2012-09-11T17:32:35.470 回答
5

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

(gdb) watch *0x12F5D58

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

(gdb) info break

看看你是否可以禁用一些观察点。

于 2010-03-15T09:51:21.353 回答
5

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

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

也许值得尝试一下。

于 2010-03-19T20:04:30.040 回答
1

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

于 2012-08-14T23:54:16.297 回答