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