【问题标题】:C++ single step in debugger throws an exception调试器中的 C++ 单步引发异常
【发布时间】:2011-11-28 20:36:45
【问题描述】:

我有一个 C++ 应用程序,当我尝试从断点单步执行时会引发异常。例如:

1) 从 VS2010 启动应用程序 0 附加调试器。

2) 设置断点。在哪里似乎并不重要。

3) 在应用程序中执行某些操作以使其到达断点。

** VS2010 遇到断点

4) 单步调试器到下一行代码。

VS2010弹出消息框有这个异常:

“SimpleGraphSDI.exe 中 0x087df66f 处的未处理异常:0xC0000005:访问冲突。”

请注意,如果我在连续两行代码上设置断点,然后按运行从一行前进到另一行,则应用程序“运行”到下一行代码没有问题。只有当我使用 VS2010 中的单步命令时才会出现访问冲突。

应用程序中的一些代码自 VC6 以来就已经存在,甚至可能更早。但是不知道这是否相关。

更新:如果我启动应用程序,然后在应用程序启动后附加调试器,单步调试器确实不会发生异常。

【问题讨论】:

  • 您是否使用该 GFX 库来独占控制屏幕? IE。将您的应用切换到全屏模式?
  • 请发布重复问题的最小代码。
  • 这里没有足够的信息来帮助你。
  • 我没有答案,但可以尝试以下方法:重新启动 Visual Studio;对您的应用程序进行干净的构建;显示反汇编窗口并逐步执行说明以查看发生了什么。这是一个多线程应用程序吗?是否有可能其他线程在工作?当您遇到访问冲突时,堆栈跟踪会告诉您什么?
  • 尝试打破访问冲突并查看堆栈跟踪。找出哪个模块拥有 0x087df66f 以及执行是如何结束的。

标签: c++ visual-studio-2010 debugging


【解决方案1】:

我遇到了同样的问题。我可以通过从命令行启动 VS 来解决它,告诉它将 UI 重置为默认值 (/ResetSettings) 命令行参数的详细信息是 here

我重置VS后不需要重新启动,但是我在完成环境重置后对项目进行了完整的重建。

【讨论】:

  • 这对我也适用于类似的问题 - 对我来说,我不需要手动通过调试器。只需在调试模式下运行就足够了。 (在我的例子中,错误的访问冲突总是发生在 JNI 调用期间。)/ResetSettings(紧接着是重建)立即解决了这个问题。顺便说一句,对于任何可能不知道的人,它是相应文件夹中的“devenv.exe”,它是在命令行中使用 /ResetSettings 运行的 EXE。
【解决方案2】:

解决此问题的方法是禁用 RPC 调试。

在 Visual Studio 2010、Visual Studio 2010 SP1 工具栏中选择以下步骤 -

工具->选项->调试->本机并取消选择“启用RPC调试”

【讨论】:

    【解决方案3】:

    可能存在一个线程以某种方式检测到代码正在逐步调试,并且页面错误作为响应以阻止您进行调试。尝试通过一个一个挂起线程来定位该线程。

    另外,地址 0x087df66f 总是一样吗?如果是,那么您可以在那里设置一个断点,并在断点被击中时环顾四周。

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 2012-08-28
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2012-01-01
      相关资源
      最近更新 更多