各.netアプリケーションは、3つの例外のためにメモリを予約します

週末、友人new_sに会いに行って、彼は面白いことを見せてくれました。 彼は.netアプリケーションのメモリダンプを分析する必要があり、そこでメモリリークやその他の異常な動作を探し、.netアプリケーションを起動すると、環境が3つの例外のためにメモリを予約することを示しました。



そして、これは正常な動作です。 なんで?



実験を行うことにし、Visual Studioをダウンロードして、最も単純なコンソールアプリケーションHello worldを作成しました。



 using System; namespace HelloWorld { class Program { static void Main() { Console.Write("Hello world!"); Console.ReadKey(); } } }
      
      







このケースもコンパイルしますこちらからダウンロードできます。



Debuggin Tools For WindowsをダウンロードしますWinDbg



ユーティリティが必要です。



それを開いて、シンボル(pdbファイル)を追加します: ファイル->シンボルファイルパスと.pdbファイルHelloWorld.pdb



を指定します。 また、他のアセンブリのシンボルをダウンロードする必要があるため、テンポディレクトリを作成し、 Symbol File Path



ウィンドウで次のようなものを指定します。



D:\WORK\Projects\Own\HelloWorld\HelloWorld\bin\Debug; SRV*D:\Temp\Symbols*http://msdl.microsoft.com/download/symbols







次に、アプリケーションを実行し(Visual Studioからの場合、デバッグモードではない場合)、WinDbgでプロセスに参加します。File-> Attach to a Process



画像



コマンドを実行します:



 .loadby sos mscorwks
      
      







sos.dll



拡張機能をダウンロードし、マネージコードのデバッグを許可するため。



メモリをダンプして、次のコマンドを実行します。



 .dump /ma D:\Temp\HelloWorld.dmp
      
      







デバッグを停止できます: デバッグ->デバッグの停止



そして、メモリダンプを開きます。 ファイル->クラッシュダンプ開きHelloWorld.dmp



を選択します。



次のコマンドを使用して、ダンプをフィルタリングして例外を確認します。



 !dumpheap -type Exception
      
      







そして、私たちは何を見ますか? 例外は次のとおりです。



 7093fd68 1 84 System.ExecutionEngineException 7093fd1c 1 84 System.StackOverflowException 7093fcd0 1 84 System.OutOfMemoryException
      
      







画像



結論


これらの3つの例外( ExecutionEngineException, StackOverflowException OutOfMemoryException



)は、アプリケーションの起動時に特別に作成されたもので、メモリ不足に陥り、 OutOfMemory



例外OutOfMemory



スローOutOfMemory



OutOfMemory



などに対応します。 同様に、すでにスタックオーバーフローが発生している場合StackOverflowException



ことはできません。これは、このためにコンストラクタを呼び出す必要があるためです。これは、既にオーバーフローしたスタックでは不可能です。



したがって、.netアプリケーションのメモリダンプを使用する必要がある場合、これらの例外を恐れないでください。.net環境は、十分なメモリがないか、バッファがいっぱいのときにそれらを転送します。



All Articles