在大型C应用程序中,我在内存地址上设置了硬件观察点,如下所示:
(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它是硬件观察点,而不是软件,它可以解释缓慢的问题.
现在,调试器下的应用程序运行时间已从不到十秒变为一小时并且正在计数.到目前为止,观察点已触发三次,这是15分钟后第一次包含地址的内存页面可读sbrk.当然,在这15分钟内,由于内存页面无法访问,因此观察点应该是高效的吗?这仍然无法解释,为什么之后会如此缓慢.
平台是x86_64,GDB版本是Ubuntu 9.10包:
$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]
Run Code Online (Sandbox Code Playgroud)
和库存GDB 7.1来源:
$ gdb-7.1 --version
GNU gdb (GDB) 7.1
Run Code Online (Sandbox Code Playgroud)
提前感谢任何想法可能是什么原因或如何解决/解决它.
编辑:删除演员
编辑:gdb 7.1
小智 8
我发现观看大字符缓冲区的速度非常慢,而在缓冲区中观看角色非常快.
例如
static char buf[1024];
static char* buf_address = &buf;
Run Code Online (Sandbox Code Playgroud)
watch buf_address - 极其缓慢.
watch *buf_address - 非常快.
这很可能是因为你每次都在施展它.试试这个:
(gdb) watch *0x12F5D58
Run Code Online (Sandbox Code Playgroud)
另一个选择是您设置了太多硬件观察点,因此gdb被迫使用软件观察点.尝试检查您使用的观察点数:
(gdb) info break
Run Code Online (Sandbox Code Playgroud)
并查看是否可以禁用某些观察点.
我实际上遇到了GDB 7.xx硬件观察点的问题,这是不可接受的,因为观察点是我工作中的必需品.
根据同事的建议,我下载了6.7.1的源代码并在本地构建了它.观察点现在工作得更好.
也许值得尝试一下.