我一直在尝试使用编程数据断点,就像CBreakpoint http://www.morearty.com/code/breakpoint/例如,通过使用SetThreadContext http://msdn.microsoft.com/en-us/library/windows/desktop/ms680632.aspx直接设置调试寄存器。我能找到的大多数参考资料都表明,只要 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 的行为似乎很奇怪,因为虽然它没有捕获单步,但我无法让它正确地跳过将触发硬件断点的代码段。
我有一种感觉,该库没有正确设置 x64 下的 DR 寄存器,这可能是为了进行更改SetThreadContext
对于 x64。
Update
稍微摆弄一下,我注意到您正在使用的库在设置或获取线程上下文之前不会暂停线程,MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ms679362%28v=vs.85%29.aspx说这是一个很大的禁忌:
您无法获取正在运行的线程的有效上下文。在调用 GetThreadContext 之前使用 SuspendThread 函数挂起线程。
然而,即使使用另一个图书馆 http://www.codeproject.com/Articles/28071/Toggle-hardware-data-read-execute-breakpoints-prog正确地挂起目标线程并无错误地执行其所有调用仍然不会让 VS 捕获 BP,这让我认为不仅您使用的库有错误,而且 VS 的 x64 调试器也有错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)