9

我一直在尝试使用编程数据断点,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 设置中我需要做一些舞蹈吗?

4

3 回答 3

2

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

再深入一点,似乎 VS 表现得很奇怪,因为虽然它没有捕获单个步骤,但我无法让它正确地跨过一段将触发硬件断点的代码。

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

更新

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

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

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

于 2012-08-29T09:07:42.810 回答
0

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

在这里找到了这个答案: https ://social.msdn.microsoft.com/Forums/windowsserver/en-US/47ebd835-e538-4ff6-8c91-df45bd46d548/vc-express-2012-x64-clr-breakpoint-not-hit -no-executable-associated-static-library?forum=windbg

于 2015-10-09T20:31:41.143 回答
-3

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

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

于 2012-09-01T02:06:03.630 回答