捕获OutOfMemoryException使调试变得困难

时间:2014-09-19 18:25:51

标签: c# visual-studio debugging out-of-memory

当我调试我的程序并尝试在即时窗口中执行某些操作时,它有时会在即时窗口中显示错误消息:

  

由于内存不足,功能评估被禁用   异常。

它还显示了通过将对象悬停在对象上来查看对象的属性时。

在尝试找到问题的原因之后,我将其缩小到这个小代码示例:

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //outofmemoryexception can be thrown by Image.FromFile("path/that/does/not/exist.png")
                //if the path points to a file that is not an image
                throw new OutOfMemoryException();
            }
            catch (OutOfMemoryException ex)
            {
                //caught the exception
                //so no problem, right?
            }

            //Random object to use in immediate window
            Random rand = new Random();

            //Also, try hovering over this regex and take a look at its properties.
            var test = new Regex("");

            //put a breakpoint here (at the next closing curly brace) and try calling rand.Next() in the immediate window
        }
    }
}

看起来调试器在发生OutOfMemoryException时会发生异常,即使它被抓住了......

我可以想象,没有人认为可以调试具有OutOfMemoryException的程序。但遗憾的是,当文件不是图像时,Image.FromFile会抛出该错误...

问题:

  1. 以上代码示例是否会给其他人带来问题?
  2. 有人可以澄清一下吗?为什么会发生这种情况?
  3. 最后,我怎么能阻止这个?

1 个答案:

答案 0 :(得分:0)

是的,这是预期的行为。

您需要让调试器运行(跳过或在下一行放置断点并单击F5)才能从此状态恢复。即使有时候它没有帮助和运行,直到你在堆栈上更高的其他功能通常使调试器再次合作。

请注意,OOM不是唯一的情况 - 即立即窗口中长时间运行的代码会使调试器进入相同的状态。

更多信息 - MSDN Function evaluation is disabled...,SO - Function evaluation disabled because a previous function evaluation timed out