为了调查托管堆损坏,我想使用 ba(访问中断)断点。我可以在托管代码中使用它们吗?如果是,我如何以编程方式设置它们?
更新:也可以在 WinDbg 中设置它们(-> 为每个 XY 类型的对象设置 ba)
为了调查托管堆损坏,我想使用 ba(访问中断)断点。我可以在托管代码中使用它们吗?如果是,我如何以编程方式设置它们?
更新:也可以在 WinDbg 中设置它们(-> 为每个 XY 类型的对象设置 ba)
'ba' 命令设置的断点称为处理器或硬件断点。
首先是好消息
设置硬件断点很容易。您需要使用数据地址设置处理器的调试寄存器(DR0、DR1、DR2 或 DR3)之一,并使用字段设置调试控制寄存器 DR7 以设置内存大小和访问类型。指令(在 x64 汇编器中)如下所示:
MOV 拉克斯,DR0
显然,您将不得不从您选择的语言中以某种方式执行此汇编指令,或者使用与 C++ 和内联汇编的互操作,但这比设置软件断点更容易。
现在坏消息
首先,在 SMP 机器上,您必须对所有可以接触您的代码的处理器执行此操作。如果您为进程配置处理器亲和性,或者在单进程机器上进行调试,这可能是可以解决的。其次,英特尔架构上只有 4 个调试处理器。如果您尝试使用 WinDbg 设置处理器断点,在第 4 次之后它会Too many data breakpoints for thread N
在您点击g
.
我假设您询问自动化的全部目的是因为有太多对象无法手动设置断点。由于无论如何您都被限制为 4 个ba
断点,因此自动化这一点没有多大意义。