System.Diagnotics.StackTrace()上发生StackOverflowException

时间:2013-10-21 07:03:00

标签: .net iis-7.5 cassini stack-overflow asp.net-development-serv

我一直在使用Visual Studio 2013编写一个针对.NET framework v3.5的Web应用程序。

其中的间接递归会导致StackOverflowException,所以我写了一个方法来检查堆栈是否溢出。

public static void CheckStackOverflow() {
    StackTrace stackTrace = new StackTrace();
    StackDepth = stackTrace.GetFrames().Length;
    if(StackDepth > MAXIMUM_STACK_DEPTH) {
        throw new StackOverflowException("StackOverflow detected.");
    }
}

问题是StackOverflowException发生在第一行,即new StackTrace(),所以我无法处理它。

我知道调用StackTrace()也会使堆栈加深几个级别,所以我知道这可能会发生。然而,有一些值得思考的东西:

  1. 在Visual Studio 2012中选择 Visual Studio(ASP.NET)开发服务器(以下简称Cassini)没有问题,因此我的IIS设置或其他类似内容是可疑的。
  2. 在发生异常时,堆栈不够深入。
  3. 这只在调试时发生。无论配置如何(即调试/发布)。

  4. 编辑:我尝试changed IIS Express settings,但没有任何区别。此外,尝试本地IIS 选项也没有运气。所以,

    if(RunningWithVisualStudio) { // Start Debugging or Without Debugging
        if(UsingCassini) {
            throw new StackOrverflowException("A catchable exception."); // expected
        } else {
            throw new StackOverflowException("I cannot catch this dang exception.");
        }
    } else { // publish on the identical ApplicationPool.
        throw new StackOrverflowException("A catchable exception."); // expected
    }
    

    我以为我在配置 IIS Express 时遇到了错误,但现在我完全迷失了。

1 个答案:

答案 0 :(得分:1)

以下是我的解决方法:

  1. 我在下面添加了.csproj文件来定义当前版本的IDE。 image
  2. Defined DEBUG constant
  3. 使用预处理程序指令添加条件。

    public static void CheckStackOverflow() {
        StackTrace stackTrace = new StackTrace();
        StackDepth = stackTrace.GetFrames().Length;
        int threashold;
    #if (VISUAL_STUDIO_12 && DEBUG)
        threshold = MAXIMUM_STACK_DEPTH_FOR_VS12; // set to be a "safe" integer
    #else
        threshold = MAXIMUM_STACK_DEPTH; // the one in common use
    #endif
        if(StackDepth > threashold) {
            throw new StackOverflowException("StackOverflow detected.");
        }
    }
    

    const98 MAXIMUM_STACK_DEPTH_FOR_VS12是手动找到的最大数字,不会造成任何问题。

    现在,我可以在不改变任何内容的情况下调试和发布应用程序,但仍然希望听到您的意见。