windows - Visual Studio 2010 中的编程数据断点

标签 windows visual-studio-2010 x86-64 seh

我一直在尝试使用编程数据断点,就像 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/

相关文章:

asp.net - 无效的回发或回调参数

c# - 如何重建解决方案中的所有项目?

visual-studio-2010 - MVC 的 Visual Studio 和文件未找到警告

gcc - 如何在GNU汇编器中将函数或标签的地址加载到寄存器中

c# - 如何以编程方式获取/设置(Windows 程序的)可视化组件的数据?

windows - Perl: "start perl.exe <filename>"与 "perl.exe <filename>"有何不同

python - 为什么同一个程序在Windows和Linux上运行时看起来不同?

c++ - 为什么 Visual Studio 的智能感知会显示私有(private)成员和函数?

assembly - 为什么 x86 架构使用两个堆栈寄存器(esp;ebp)?

c - 海湾合作委员会 4.4 : Avoid range check on switch/case statement in gcc?