2

在 x86 GDB 上使用一些特殊的硬件资源(调试寄存器?)来设置观察点。在某些情况下,当资源不足时,GDB 会设置观察点,但它不起作用。有没有办法以编程方式监控 Linux 上这些资源的可用性?也许在procfs中的一些信息,或其他东西。我需要这些信息来选择池中的机器进行调试。

来自 GDB Internals: “由于它们依赖于硬件资源,因此硬件断点的数量可能会受到限制;当用户要求更多时,gdb 将开始尝试设置软件断点。(在某些架构上,尤其是 32 位 x86 平台上,gdb不能总是知道是否有足够的硬件资源来插入所有的硬件断点和观察点。在那些平台上,gdb 只有在继续被调试的程序时才会打印错误消息。)"

“请求了太多不同的观察点。(在某些体系结构上,在恢复调试程序之前无法检测到这种情况。)请注意,x86 调试寄存器用于硬件断点和观察点,因此设置过多的硬件断点可能会导致观察点插入失败。”

“32 位 Intel x86 处理器具有特殊的调试寄存器,旨在促进调试。gdb 提供了一个通用函数库,基于 x86 的端口可用于实现对观察点和硬件辅助断点的支持。”

4

1 回答 1

1

我需要这些信息来选择池中的机器进行调试。

不,你没有。x86 调试寄存器(有 4 个)是每个进程的资源,而不是每个机器的资源 [1]。对于正在调试的每个进程,您最多可以有 4 个硬件观察点。如果其他人在同一台机器上调试,你们不会互相干扰。

[1] 更准确地说,寄存器由内核多路复用:以与EAX寄存器相同的方式。系统上的每个进程和内核本身都使用, (单核)CPU 上EAX只有一个寄存器,但通过时间片的魔力,一切都可以正常工作。EAX

于 2011-10-25T03:37:08.553 回答