Windbg 以编程方式在托管代码中设置ba(访问中断)断点

Windbg 以编程方式在托管代码中设置ba(访问中断)断点,windbg,heap-corruption,Windbg,Heap Corruption,为了调查托管堆损坏,我想使用ba(访问中断)断点。我可以在托管代码中使用它们吗?如果是,如何以编程方式设置它们 更新:“ba”命令设置的断点称为处理器断点或硬件断点 首先是好消息 设置硬件断点很容易。您需要使用数据地址设置处理器的一个调试寄存器(DR0、DR1、DR2或DR3),并使用字段设置调试控制寄存器DR7,以设置内存大小和访问类型。指令(在x64汇编程序中)如下所示: MOV rax,DR0 显然,你必须从你选择的语言中执行这个汇编指令,或者使用互操作到C++和内联汇编,但是这比设置软件

为了调查托管堆损坏,我想使用ba(访问中断)断点。我可以在托管代码中使用它们吗?如果是,如何以编程方式设置它们


更新:“ba”命令设置的断点称为处理器断点或硬件断点

首先是好消息

设置硬件断点很容易。您需要使用数据地址设置处理器的一个调试寄存器(DR0、DR1、DR2或DR3),并使用字段设置调试控制寄存器DR7,以设置内存大小和访问类型。指令(在x64汇编程序中)如下所示:

MOV rax,DR0

显然,你必须从你选择的语言中执行这个汇编指令,或者使用互操作到C++和内联汇编,但是这比设置软件断点容易。 现在是坏消息了

首先,在SMP机器上,您必须对所有能够接触代码的处理器执行此操作。如果您为您的进程配置处理器亲缘关系,或者在单进程机器上进行调试,这可能是可以解决的。其次,Intel架构上只有4个调试处理器。如果您尝试使用WinDbg设置处理器断点,在第4次之后,它会在您点击
g
后抱怨线程N的
数据断点太多

我假设您询问自动化的全部目的是因为有太多的对象无法手动设置断点。由于您被限制在4个
ba
断点,因此自动化这一点没有多大意义