我一直在尝试使用编程数据断点,就像 CBreakpoint
例如,通过使用 SetThreadContext
直接设置调试寄存器。我能找到的大多数引用资料都表明 Visual Studio 在遇到数据断点时仍然会中断,即使它本身没有设置该数据断点。但是,这似乎不是 Visual Studio 2010 的工作方式。
当程序未被调试时,我的数据断点可以正常工作(它因 STATUS_SINGLE_STEP
而崩溃,这是数据断点引发的异常)。如果我使用 WinDbg 进行调试,它也会正常中断。但是在任一 Visual Studio 2010 下调试它时,它似乎只是继续运送并忽略断点。有没有人有在 Windows 7 下使用 Visual Studio 2010 下以编程方式设置的数据断点的经验?我需要做些什么才能打破它们吗? (我尝试将 STATUS_SINGLE_STEP
添加到“第一次机会异常(exception)”列表中,但行为没有任何变化。)
或者,我可以做些什么来吞下调试器中的 STATUS_SINGLE_STEP
异常?结构化异常处理程序会在调试器看到异常之前吃掉它吗?这是一个 x86_64 程序这一事实有什么影响吗?我需要在 Visual Studio 2010 设置中跳一些舞吗?
最佳答案
做了一些测试,在 win7 x64 上安装了 VS 2010 SP1 Ultimate,使用 32 位二进制文件在硬件断点上正确中断(有和没有 SEH)。但是,当使用 64 位二进制文件时,它不会捕获单个步骤(我不得不更改一些类型才能使其编译)。
再深入一点,似乎 VS 表现得很奇怪,因为虽然它没有捕获单步,但我无法让它正确地跨过一段会触发硬件断点的代码。
我感觉库没有在 x64 下正确设置 DR 寄存器,这可能是针对 x64 在 SetThreadContext
中进行更改。
更新
再摆弄一点,我注意到您正在使用的库在设置或获取线程上下文之前不会挂起线程,MSDN说这是一个很大的禁忌:
You cannot get a valid context for a running thread. Use the SuspendThread function to suspend the thread before calling GetThreadContext.
但是,即使使用 another library正确挂起目标线程并无错误地执行其所有调用仍然不会让 VS 捕获 BP,这让我认为不仅您使用的库有问题,而且 VS 的 x64 调试器也有问题。
关于windows - Visual Studio 2010 中的编程数据断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076786/