在x86上,GDB使用一些特殊的硬件资源(调试寄存器?)来设置观察点。在某些情况下,当没有足够的资源时,GDB会设置观察点,但它不起作用。 有没有办法以编程方式监视Linux上此资源的可用性?也许在procfs中有一些信息。我需要这个信息来选择池中的机器进行调试。
来自GDB内部: “由于它们依赖于硬件资源,硬件断点的数量可能有限;当用户要求更多时,gdb将开始尝试设置软件断点。(在某些架构上,特别是32位x86平台,gdb不能总是知道有足够的硬件资源来插入所有硬件断点和观察点。在这些平台上,只有当正在调试的程序继续时,gdb才会输出错误信息。)“
“请求了太多不同的观察点。(在某些体系结构中,在调试程序恢复之前无法检测到这种情况。)请注意,x86调试寄存器既用于硬件断点,也用于观察点,因此设置了太多硬件断点可能导致观察点插入失败。“
“32位Intel x86处理器具有专门用于调试的调试寄存器.gdb提供了一个通用的函数库,基于x86的端口可用于实现对观察点和硬件辅助断点的支持。”
答案 0 :(得分:1)
我需要此信息来选择池中的机器进行调试。
不,你没有。 x86调试寄存器(有4个)是每个进程资源,而不是每个机器资源[1]。对于要调试的每个进程,最多可以有4个硬件观察点。如果其他人在同一台机器上进行调试,则不会相互干扰。
[1]更准确地说,寄存器由内核多路复用:与例如EAX
注册。系统上的每个进程和内核本身都使用EAX
,在(单核)CPU上只有一个EAX
寄存器,但它通过时间切片的魔力都可以正常工作。