Visual Studio 2010 中的编程数据断点



我一直在尝试使用编程数据断点,就像CBreakpoint的例子一样,通过使用SetThreadContext直接设置调试寄存器。我能找到的大多数参考资料都表明,每当 Visual Studio 遇到数据断点时,它仍然会中断,即使它本身没有设置该数据断点。但是,这似乎不是Visual Studio 2010的工作方式。

我的情况是,当程序未调试时,我的数据断点可以正常工作(它崩溃并带有 STATUS_SINGLE_STEP ,这是数据断点引发的异常(。如果我使用 WinDbg 进行调试,它也会正确中断。但是,在Visual Studio 2010下调试它时,它似乎只是继续前进并忽略断点。有没有人在Windows 7下使用Visual Studio 2010下以编程方式设置的数据断点的经验?我需要对它们做些什么来打破它们吗?(我尝试将STATUS_SINGLE_STEP添加到"第一次机会例外"列表中,但行为没有改变。

或者,我是否可以执行任何操作来吞下调试器中的STATUS_SINGLE_STEP异常?结构化异常处理程序是否会在调试器看到异常之前吃掉它?这是一个x86_64计划这一事实是否会影响任何事情?在Visual Studio 2010设置中,我需要跳一些舞蹈吗?

做了一些测试,在win7 x64上获得了VS 2010 SP1 Ultimate,使用32位二进制文件在硬件断点上正确中断(有和没有SEH(。但是,当使用 64 位二进制文件时,它不会捕获单个步骤(我不得不更改一些类型才能让它编译(。

深入挖掘,它似乎是 VS 表现得很奇怪,因为虽然它没有捕获单个步骤,但我无法让它正确单步执行将触发 HW 断点的代码段。

我有一种感觉,库没有在 x64 下正确设置 DR 寄存器,这可能是为了对 x64 的SetThreadContext进行更改。

更新

再摆弄一下,我注意到您使用的库在设置或获取线程上下文之前不会挂起线程,MSDN 说这是一个很大的禁忌:

无法获取正在运行的线程的有效上下文。使用 SuspendThread 函数在调用 GetThreadContext 之前挂起线程。

但是,即使使用另一个正确挂起目标线程并执行其所有调用而没有错误的库仍然不会让 VS 捕获 BP,这让我认为不仅您使用的库有问题,而且 VS 的 x64 调试器也有问题。

您是否为项目启用了混合(本机和托管(调试?我转到项目属性->配置属性->调试器->调试类型设置为"混合">

在这里找到这个答案。

有一个名为 DebugBreak() 的函数,可用于在 MSVC 2010 下以编程方式中断执行,但它在 DebugBreak 内停止(反汇编代码(。因此,如果您想仅在代码中使用中断__asm int 3这非常简单,并且可以在所有英特尔兼容的CPU中使用。

还有一个注释在DebugBreak()__asm int 3之前使用IsDebuggerPresent()以避免运行时出错(当然你已经知道:)了!

最新更新