我可以阻止StackOverflowException在Visual Studio中崩溃我的调试对象吗?

时间:2013-12-17 09:09:00

标签: c# visual-studio-debugging stack-overflow watch-window

我正在调试第三方库,其中充斥着偶尔抛出StackOverFlowException的属性。

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

我写了一个重现这个属性的例子(当试图在Watch窗口中评估它时):

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

有没有办法在Watch窗口中评估属性而不会因为Stackoverflow而导致我的应用崩溃?

1 个答案:

答案 0 :(得分:0)

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

由于这是第三方代码(因此我认为无法更改),您可以尝试:


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

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

来自MSDN StackOverflowException page

  

在.NET的早期版本中   框架,您的应用程序可以   捕获StackOverflowException对象   (例如,从中恢复   无限递归)。但是,那   目前不鼓励练习   因为重要的额外代码是   需要可靠地捕获堆栈   溢出异常并继续   程序执行。

     

从.NET Framework开始   版本2.0,StackOverflowException   try-catch无法捕获对象   块和相应的过程是   默认终止。所以,   建议用户编写代码   检测和防止堆栈   溢出。例如,如果你的   应用程序取决于递归,使用   反击或国家条件   终止递归循环。注意   托管的应用程序   公共语言运行库(CLR)可以   指定CLR卸载   应用程序域所在的堆栈   溢出异常发生并让   相应的过程继续。对于   更多信息,请参阅   ICLRPolicyManager接口和   托管公共语言运行时。