3

メモリリークを追跡するために、私はVisual StudioとSOS.dllを使用して、オブジェクトヒープのダンプを提供し、特定のオブジェクトのGCRootingが適切に行われていることを確認しています。

AutoItを使用してこのプロセスの自動化を開始し、マウスとキーボードを制御しました。これが私のスクリプトの最初の部分の概算です:

Visual Studioで、F5キーを押して実行を開始
しますプログラムを完全にロード
しますVisual Studioに切り替えて、実行を中断します

フォーカスをイミディエイトウィンドウに切り替えます
SOS.dllをロードします
呼び出し!dumpheap -stat
ダンプの結果をクリップボードにコピーします
メモ帳に貼り付けて、dump1.txtとして保存します

実行を再開する
リークアクションを何度も実行するVisualStudioに
切り替えて、実行を中断する

フォーカスをイミディエイトウィンドウに切り替えます
出力をクリアします
呼び出し!dumpheap -stat
ダンプの結果をクリップボードにコピーします
メモ帳に貼り付けてdump2.txtとして保存します

2つのダンプを比較してリークされたオブジェクトを見つけるPythonスクリプトを実行します

ただし、現在の方法にはいくつか懸念があります。Visual Studioのインストールに依存しているだけでなく、スクリプトの実行中は、自動化を順不同にしないとマウスやキーボードを使用できません。

Visual StudioではなくC#プログラム内でSOS.dllを使用する方法はありますか?理想的には、このソリューションは、!dumpheap -statVisual Studioを自動化する必要なしに、指定されたプロセスにアタッチし、その結果をテキストファイルに出力します。

4

1 に答える 1

9

以下に、リークを見つけるために使用できるいくつかの異なるアプローチを示します。

(DIYのアプローチに従わない場合は、市販の「リーク」検出器を利用できます)。

たくさんのデバッグツール/リソースを詳述している私の答えへのリンク

WinDBGにSOS.DLLをロードします

実際には、SOS.DLLを使用するためにVisual Studioは必要ありません。これはデバッガー拡張機能であるため、WinDBGでも使用できます。

WinDBGデバッガーは、Windows用のデバッグツールの一部として無料で入手できます。

次に、WinDBGスクリプトを記述して、「ダンプ」を自動化できます。

また、SOS.DLLの拡張バージョンが利用可能であることに注意してください... SOSEX、PSSCOR2(NET 2の場合)、およびPSSCOR4(NET 4の場合)を探してください。

CLRプロファイリングAPI

CLRプロファイリングAPIを使用できます。

それを利用する実際の.NETプロファイラーであるCLRProfilerと呼ばれるアプリケーションがあります....それがどのように使用されるかを確認するための良いコードです。

CLRプロファイラーが実行できることの1つは、ヒープダンプを作成し、異なる期間に作成されたダンプを比較して、違いを見つけることです...したがって、リークを見つけるのに役立ちます。

「テスト」モードの場合(アプリケーションに組み込まれている場合、またはアプリケーションを監視するためのコンパニオンユーティリティとして)、アプリケーションに同様の機能を提供できます。

プロセスダンプ

使用できるもう1つの手法は、プロセスの定期的な「ダンプ」を取得することです。これは、SOS / SOSEX(またはその他のWinDBGプラグイン)を使用してWinDBGを介してオフラインで分析できます。

DebugDiag(.dmpファイルが作成されるタイミングを制御するルールとアクションを設定できます)を使用して、.dmpファイルの作成を自動化できます...またはProcDump.exe(SysInternalsから)と呼ばれるツール。

ProcDumpは、「プロセスリフレクション」と呼ばれる手法を使用しているため、「プロセススナップショット」を非常に迅速に取得できるため、特に便利です。これにより、プロセスの中断を少なくすることができます。

(それぞれの間に5秒のギャップがある3つのダンプを作成します)

procdump -s 5 -n 3 notepad.exe notepad.dmp 

死後分析

一連の.dmpファイルを作成したら、それらを分析してリークを見つけたり、ハンドルの使用状況を監視したりできます。

WinDBGに.dmpファイルを手動でロードしてからデバッガーコマンドを発行するか、WinDBG拡張機能、またはダンプファイルのセットを取得して順番に処理するスクリプトを作成することができます(つまり、それらに対して!dumpheap statコマンドを実行します)。 。

Debug Analyzer .NET

これは、.dmpファイルの分析と事後分析を行うことを目的としたツールです。

.NETでスクリプトを記述できるため、WinDBGよりもアクセスしやすい可能性があります。

拡張したい場合は、プラグインモデルもあります。

また、ビジュアライザーを作成/使用して、独自の方法でデータを表示できます。

(現在、CLR2.0メモリダンプのみをサポートしています...CLR 4.0はサポートしていません)

于 2012-08-31T21:52:52.823 に答える