我正在调试第三方库,其中充斥着偶尔抛出StackOverFlowException的属性。
每当我在Watch窗口中查看此库中的对象时,我最终会收到错误消息“函数评估已中止”,而我正在调试的应用程序崩溃。
我写了一个重现这个属性的例子(当试图在Watch窗口中评估它时):
private static int CausesStackoverflow
{
get { return CausesStackoverflow; }
}
有没有办法在Watch窗口中评估属性而不会因为Stackoverflow而导致我的应用崩溃?
答案 0 :(得分:0)
您应该阻止(使用计数器或其他技巧)而不是捕获 StackOverflowExceptions。
由于这是第三方代码(因此我认为无法更改),您可以尝试:
从2.0开始,StackOverflow异常只能在以下情况下被捕获。
- CLR正在托管环境中运行,其中主机特别允许处理StackOverflow异常
- 用户代码抛出stackoverflow异常,而不是由于实际的堆栈溢出情况(参考)
醇>
来自MSDN StackOverflowException page:
在.NET的早期版本中 框架,您的应用程序可以 捕获StackOverflowException对象 (例如,从中恢复 无限递归)。但是,那 目前不鼓励练习 因为重要的额外代码是 需要可靠地捕获堆栈 溢出异常并继续 程序执行。
从.NET Framework开始 版本2.0,StackOverflowException try-catch无法捕获对象 块和相应的过程是 默认终止。所以, 建议用户编写代码 检测和防止堆栈 溢出。例如,如果你的 应用程序取决于递归,使用 反击或国家条件 终止递归循环。注意 托管的应用程序 公共语言运行库(CLR)可以 指定CLR卸载 应用程序域所在的堆栈 溢出异常发生并让 相应的过程继续。对于 更多信息,请参阅 ICLRPolicyManager接口和 托管公共语言运行时。