Windows VisualStudio2010中的编程数据断点

Windows VisualStudio2010中的编程数据断点,windows,visual-studio-2010,x86-64,seh,Windows,Visual Studio 2010,X86 64,Seh,我一直在尝试使用编程数据断点,例如,通过使用直接设置调试寄存器。我能找到的大多数引用都表明VisualStudio在遇到数据断点时仍然会中断,即使它本身没有设置该数据断点。然而,VisualStudio2010似乎不是这样工作的 我所处的情况是,当程序未调试时,我的数据断点工作正常(它在状态\u SINGLE\u STEP下崩溃,这是数据断点引发的异常)。如果我使用WinDbg调试,它也会正常中断。但是当在VisualStudio2010下调试它时,它似乎只是继续使用卡车并忽略断点。有没有人有过

我一直在尝试使用编程数据断点,例如,通过使用直接设置调试寄存器。我能找到的大多数引用都表明VisualStudio在遇到数据断点时仍然会中断,即使它本身没有设置该数据断点。然而,VisualStudio2010似乎不是这样工作的

我所处的情况是,当程序未调试时,我的数据断点工作正常(它在
状态\u SINGLE\u STEP
下崩溃,这是数据断点引发的异常)。如果我使用WinDbg调试,它也会正常中断。但是当在VisualStudio2010下调试它时,它似乎只是继续使用卡车并忽略断点。有没有人有过在VisualStudio2010和Windows7下使用编程设置的数据断点的经验?我需要做些什么来打破它们吗?(我尝试将
STATUS\u SINGLE\u STEP
添加到“first chance exceptions”(第一次机会例外)列表中,但行为没有改变。)


或者,我是否可以在调试器中执行任何操作来吞下
状态\u SINGLE\u步骤
异常?结构化异常处理程序会在调试器看到异常之前吃掉它吗?这是一个x86_64程序,这会影响到什么?我需要在Visual Studio 2010设置中跳一些舞吗?

做了一些测试,在win7 x64上获得了VS 2010 SP1 Ultimate,使用32位二进制在HW断点上正确断开(有和没有SEH)。但是,当使用64位二进制文件时,它不会捕获单个步骤(并且我不得不修改一些类型以使其进行编译)

再深入一点,它似乎是VS行为怪异,因为尽管它没有捕获单个步骤,但我无法让它正确地跨过将触发HW断点的代码段

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

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

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


然而,即使使用它正确地挂起目标线程并执行其所有调用而不出错,VS仍然无法捕获BP,这让我认为,您使用的库不仅有缺陷,而且VS的x64调试器也有缺陷

有一个名为
DebugBreak()
的函数,您可以使用它以编程方式中断MSVC 2010下的执行,但它会在
DebugBreak
内部停止(反汇编代码)。因此,如果您只想突破代码,请使用
\uu asm int 3
,这非常简单,适用于所有与英特尔兼容的CPU

另一个注意事项是在
debuggerpresent()
\uu asm int 3
之前使用
IsDebuggerPresent()
,以避免在运行时出错(当然,您已经知道了!:)

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

在这里找到了这个答案:

VS可能只监视来自软件源的调试中断,也称为
INT 2C
,您需要通过
WriteProcessMemory
(idk if
\u debugbreak
对您的用例有效)。@Necrolis我在自己的过程中完成这一切。我并没有试图在特定指令上停止…我已经验证了代码是否正确设置了DR寄存器,或者至少我认为是这样,因为它在没有调试器的情况下以及在WinDbg下都能正确捕获。在WinDbg下,我看到DR寄存器正确更改。但是我应该查看VS中的registers窗格,看看它们是否接受,或者VS是否正在重置它们……我还看到了警告,您不应该获取/设置正在运行的线程的上下文,这是完全有意义的。但是,它工作得很好,我看到至少有一个人推测,如果您使用
上下文\u调试\u寄存器
,这不是问题。(这对我来说很有意义:通常你会打碎指令指针和所有东西,但唯一会弄乱调试寄存器的东西是调试器。)这个问题是关于数据断点,而不是代码断点。虽然这个链接可以回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。只有链接的答案可能会变得无效,如果链接页面changes@MegaTron正确-请总结链接中与问题和答案相关的部分。