各.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スローOutOfMemoryOutOfMemoryなどに対応します。 同様に、すでにスタックオーバーフローが発生している場合StackOverflowExceptionことはできません。これは、このためにコンストラクタを呼び出す必要があるためです。これは、既にオーバーフローしたスタックでは不可能です。

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

Source: https://habr.com/ru/post/J132656/


All Articles