-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) この例外をキャッチして呼び出します.ToString3)ToString()スタック トレースにメモリをOutOfMemoryException割り当てようとしますが、メモリがなく、別のメモリが発生します。

コメントで、XML ドキュメントには数百キロバイトあると述べましたが、サーバーが 32 ビットで実行されている場合、LOH の断片化が原因で、これが問題になる可能性があります。

于 2012-08-23T16:12:03.537 に答える