Visual Studio 2010中的程序化数据断点

Joh*_*eek 9 windows x86-64 seh 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设置中做一些舞蹈吗?

Nec*_*lis 2

做了一些测试,在 win7 x64 上安装了 VS 2010 SP1 Ultimate,使用 32 位二进制文​​件在硬件断点上正确中断(带或不带 SEH)。然而,当使用 64 位二进制文​​件时,它不会捕获单个步骤(并且我必须更改一些类型才能使其编译)。

深入挖掘一下,VS 的行为似乎很奇怪,因为虽然它没有捕获单步,但我无法让它正确地跳过将触发硬件断点的代码段。

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

更新

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

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

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