0

我正在调试一个 3rd 方库,该库中充斥着偶尔抛出 StackOverFlowException 的属性。

每当我在 Watch 窗口中查看此库中的对象时,我最终都会收到错误消息“函数评估已中止”,并且我正在调试的应用程序崩溃。

我写了一个重现此属性的示例(尝试在 Watch 窗口中对其进行评估时):

    private static int CausesStackoverflow
    {
        get { return CausesStackoverflow; }
    }

有什么方法可以评估 Watch 窗口中的属性,而不会使我的应用程序因 Stackoverflow 而崩溃?

4

1 回答 1

0

您应该防止(使用计数器或其他技巧)而不是捕获StackOverflowExceptions。

由于这是第 3 方代码(所以我想它不能更改),您可以试试这个:


从 2.0 开始,只能在以下情况下捕获StackOverflow 异常。

  1. CLR 在托管环境中运行,其中主机专门允许处理 StackOverflow 异常
  2. stackoverflow 异常是由用户代码引发的,而不是由于实际的堆栈溢出情况(参考)

MSDN StackOverflowException 页面

在 .NET Framework 的早期版本中,您的应用程序可以捕获 StackOverflowException 对象(例如,从无界递归中恢复)。但是,目前不鼓励这种做法,因为需要大量额外的代码才能可靠地捕获堆栈溢出异常并继续执行程序。

从 .NET Framework 2.0 版开始,StackOverflowException 对象无法被 try-catch 块捕获,并且默认情况下会终止相应的进程。因此,建议用户编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。请注意,承载公共语言运行时(CLR)的应用程序可以指定CLR卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续进行。有关详细信息,请参阅 ICLRPolicyManager 接口和托管公共语言运行时。

于 2013-12-17T11:50:55.730 回答