【问题标题】:Is it possible to continue debugging past an unhandled exception in Visual Studio?是否可以继续调试 Visual Studio 中未处理的异常?
【发布时间】:2020-12-03 21:09:00
【问题描述】:

各种其他问题暗示可以继续调试通过“异常未处理”弹出窗口,如下所示:

这是来自 Visual Studio 2019 的弹出窗口,但 VS 2015 提供了类似的行为。在这两种情况下,对于我尝试过的所有 Win32/x64 和 Debug/Release 组合,调试器都拒绝越过引发未处理异常的点——每次尝试继续时都会再次弹出相同的弹出窗口。我想超越这一点,继续我通过SetUnhandledExceptionFilter() 设置的代码。这可能吗?

This strongly upvoted answer 建议通过 Tools -> Options 下的选项然后 Debugging -> General 关于展开堆栈...但评论答案表明该选项可能已从 VS2017 中消失。我在 VS 2015 中找到了该选项,但它没有达到预期的效果。因此,尽管投票数较少,该问题的公认答案是否正确 - 设计上不可能继续调试未处理的异常?

【问题讨论】:

  • 您是否希望您的程序忽略异常并继续运行(通常很难),或者您可以在调试器中做些什么来修复/忽略问题并继续运行?
  • 我明白你的意思。您想调试未处理的异常过滤器。这实际上感觉像是一个 VS 错误。在“异常设置”下有一个标有“中断此异常”的框,但取消选中它似乎没有任何效果。
  • 正如我所说,我想推过去异常,因为我想测试未处理的异常处理。我继承了这个代码;我不明白。如果可能的话,能够在调试器中单步执行它会很有帮助。
  • 所以关于前三个 cmets:我想故意导致未处理的异常并调试以下内容。因为在现实世界中,未处理的异常处理随之而来。在 Visual Studio 中,我似乎遇到了一堵石墙 :-(
  • @omatai 如果您在“异常设置”下检查了异常un,但它仍然会闯入调试器,那么这就是second chance exception,意思是un处理。如果您认为代码应该捕获它,则显示异常上下文和代码。

标签: c++ visual-studio debugging exception unhandled-exception


【解决方案1】:

是的 - 这是可能的。如果您反复出现该弹出窗口,并且异常设置使得异常不会被调试器拦截(因此传递给应用程序自己的异常处理),那么可能是您的“未处理”异常处理已经运行,或不以您认为的形式存在。仔细检查您设置断点的位置,并确保它们是可以命中的。

另请注意,如果您有类似的东西来捕获 SEH 异常(例如整数除以零):

__try
{
    // set up and run the application
}
__except( RecordUnhandledException( GetExceptionInfo() ) )
{
}

...那么调试器可以对您隐藏RecordUnhandledException()。也就是说,如果您在(故意)抛出异常的行上设置断点,并尝试单步执行,调试器可能会通过在单个步骤中执行处理代码来直接退回到该点,从而使其不可见你。但是,如果它产生其他输出,您应该能够看到该输出。如果不是,它可能需要在RecordUnhandledException() 内设置一个显式断点来显示它的存在并逐步执行其逻辑。

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
  • 我还不能标记为答案 - 这是我的问题,我的答案 - 我需要等待。而且我可能在这里只描述了一个更大的冰山一角......
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多