Exception.ToString()上的OutOfMemory异常

时间:2012-08-23 15:12:36

标签: c# .net exception exception-handling error-handling

以下是.NET应用程序的一些日志输出。

Error in MainFunction.
Message: Exception of type 'System.OutOfMemoryException' was thrown.
InnerException: 
StackTrace:    at System.Text.StringBuilder.ToString()
   at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat)
   at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   at System.Exception.GetStackTrace(Boolean needFileInfo)
   at System.Exception.ToString(Boolean needFileLineInfo)
   at System.Exception.ToString()
   [the rest of the trace is removed]

这对应于以下应用程序代码行。以下是catch块,并将字符串返回到实际抛出的方法:

private void MainFunction()
{
   ...

   try
   {
      string doc = CreateXMLDocument(); // <- Out of Memory throws here
   }
   catch (Exception ex)
   {
      CoreLogging("Error in MainFunction.", ex);
   }
}

private string CreateXMLDocument()
{
   try
   {
      //Some basic and well constrained XML document creation:
      ...
   }
   catch (Exception ex)
   {
      return "Exception message: " + ex.ToString();  // <- This is the last line of the trace
   }
}

我该怎么做?显然应该使用Exception.Message代替Exception.ToString(),但我仍然希望了解这一点。确实

  • 在System.Text.StringBuilder.ToString()
  • at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat)

意味着CreateXMLDocument中异常的堆栈跟踪是如此庞大造成OutOfMemory?我很想知道如何发生这种情况,因为在CreateXMLDocument中肯定没有循环调用,这是我能想到的唯一可能导致巨大堆栈跟踪的东西。

还有其他人遇到类似的情况吗?

1 个答案:

答案 0 :(得分:3)

我有点猜测:

1)CLR引发OutOfMemoryException。 2)您捕获此异常并在其上调用.ToString 3)ToString()尝试将内存分配给堆栈跟踪但是...没有内存而另一个OutOfMemoryException已经升级。

在评论中,您说XML文档有几百KB,如果您的服务器运行在32位上,这个可能是一个问题,因为LOH碎片化。