VS2022 - 当异常抛出时无法查看变量值 - 局部变量和参数在 '[Exception]' 调用堆栈帧中不可用

32

我遇到了一个InvalidOperationException异常(应该很容易解决)。但是当异常被抛出时,我无法在本地调试窗口中查看任何当前值。它们都有相同的消息:

Local variables and arguments are not available in '[Exception]' call stack frames. To obtain these, configure the debugger to stop when the exception is thrown and rerun the scenario.

不确定为什么会发生这种情况(可能与异步有关?),但这是相对简单的代码,我应该能够看到这些变量的值。


那么,你尝试过配置调试器在异常抛出时停止并重新运行场景吗? - KompjoeFriek
也许您可以创建一个最小化、可重现的例子,以帮助我们重现该问题。 - Jingmiao Xu-MSFT
2
我还没有尝试配置调试器停止,因为我不知道如何做。我已将所有异常重置为默认值,但我猜这意味着其他事情... - Calanus
1
你尝试过前往“调试(Debug)> 窗口(Windows) > 异常设置(Exception Setting)”并选择“System.InvalidOperationException”吗? - Jingmiao Xu-MSFT
21
这是一个严重的退步。我不确定它是VS2022的问题还是.NET 6的问题,但它严重降低了调试器的可用性。配置调试器在异常抛出时停止并重新运行场景通常不可行。根据我的经验,那很少是可行的解决方案。(我在Github上看到了一个2019年的问题 - 显然这是另一个CoreClr的严重限制,他们选择不予解决。) - CarlDaniel
3
@JingmiaoXu-MSFT 只需使用默认安装的 VS2022 并运行任何会引发异常的代码,例如在 NullReference 上调用 Linq 方法的代码路径。遇到这种愚蠢的问题并不特别困难,这使得它非常令人恼火。 - Tom Lint
3个回答

19

您可以前往调试(Debug)>窗口(Windows)>异常设置(Exception Setting),并选择“System.InvalidOperationException”来解决此问题。 在此输入图片描述


3
我尝试在 .Net 7 应用程序中使用此方法,但仍然遇到相同的错误。我的 VS 版本是 17.4.2。 - Scott Salyer
感谢您的发布,但似乎在.net7和vs2022上无法正常工作。 - AlexVPerl
为什么这个不起作用?我还是收到相同的消息,完全没有配置调试器的指导。 - John Glen
@JohnGlen 你的异常是不是InvalidOperationException,就像原来的问题中一样?如果是不同类型的异常,那么你需要在该异常上启用“抛出时中断”选项。 - undefined

3

经过一段时间的搜索,我也偶然发现了你的问题。

是的,被接受的答案是你问题的一个解决方法 -> 你可以进入“调试>窗口>异常设置”,并选择“System.InvalidOperationException”,就像上面的答案描述的那样。

然而,这将会始终中断任何“System.InvalidOperationException”,即使异常在try和catch块中被处理。

或者,我建议你打开“调用堆栈窗口”(调试>窗口>调用堆栈)。

在这里(不确定这是否是Visual Studio 2022的新功能,因为在Visual Studio 2019中我没有这个问题),你将看到两个几乎相同的调用堆栈:

  • 一个以[Exception]开头,如“[Exception] ...调用堆栈数据...”
  • 另一个完全相同但没有[Exception],如“...调用堆栈数据...”

如果你双击第二个,你的本地变量将被填充 - 而在第一个带有[Exception]的调用堆栈中,你的本地变量不会被填充(这是在异常情况下的默认值)。

间接地,这种行为也在你的错误消息中描述:

本地变量和参数在“[Exception]”调用堆栈帧中不可用。

很遗憾,我不知道为什么Visual Studio 2022在异常情况下现在会创建两个类似的调用堆栈,而Visual Studio 2019则不会。


2
这是我唯一有效的方法,而且我确信以前从未出现过这种行为,因为我以前从未做过这件事... - Christopher King

0
在 Visual Studio 2022 上的 .NET 6 应用程序中,当调试器在异常重新抛出时停止执行时,我注意到了这种行为。
try
{
     // some code that throws an exception
}
catch (Exception e)
{
     // some custom exception handling
     throw; // *** This is where the debugger is stopped ***
}

我的解决方案,在某些情况下可能不实用,是使用预处理指令在调试期间不捕获和重新抛出异常。
#if DEBUG
#else
    try
    {
#end
         // some code that throws an exception
         // *** debugger now stops here, and locals/watch expressions work as expected ***
#if DEBUG
#else
    }
    catch (Exception e)
    {
        // some custom exception handling
        throw;
    }
#end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接