-1

下面是来自 .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()
  • 在 System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat)

是否意味着 CreateXMLDocument 中异常的堆栈跟踪如此庞大导致 OutOfMemory?我很想知道这将如何发生,因为 CreateXMLDocument 中绝对没有循环调用,这是我能想到的唯一可能导致巨大堆栈跟踪的事情。

有没有其他人遇到过类似的情况?

4

1 回答 1

3

我有点猜测:

1) CLR 引发 OutOfMemoryException。2) 你捕捉到这个异常并调用.ToString它 3)ToString()尝试为堆栈跟踪分配内存但是......没有内存并且另一个OutOfMemoryException被提升。

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

于 2012-08-23T16:12:03.537 回答