各デバイス ドライバーが消費しているメモリ量を確認するにはどうすればよいですか? これは Win32 または .NET API を使用して実行できると想定していますが、どちらを決定することはできませんでした。
2 に答える
Windowsは、プールタグを使用してデバイスドライバーのメモリ使用量を追跡します。問題のドライバーが渡すプールタグがわかっている場合は、(Windows Driver Kitから)、PoolTag(OSRから)、WinDbg(またはKD)(のデバッグツールから)ExAllocatePoolWithTag
などのツールを使用して、そのメモリ使用量を追跡できます。ウィンドウズ)。poolmon
デバイスドライバは、メモリを間接的に割り当てるカーネルAPIを呼び出す場合があることに注意してください。たとえば、呼び出すIoAllocateMdl
と、Windows I / Oマネージャーは、Windows I / Oマネージャーによって割り当てられた別のプールタグを使用して、メモリ記述子リストにメモリを割り当てます。このため、複数のデバイスドライバーに代わって実行される割り当ては、すべて同じプールタグを使用する場合があります。
どのドライバがメモリをリークしているかを特定しようとしている場合は、poolmon / PoolTag / WinDbg / KDを使用して、リークされているプールタグを特定します。次に、カーネルデバッガー(WinDbgまたはKD)をシステムに接続し、変数nt!poolhittag
をリーキープールタグに設定します。次回ExAllocatePoolWithTag
、そのプールタグを使用してメモリを割り当てるために呼び出されると、システムはカーネルデバッガーに侵入します。次に、呼び出しスタックを調べて、割り当てを実行しているドライバーを特定できます。このプロセスについては、カーネルデバッガを使用したカーネルモードのメモリリークの検出で詳しく説明しています。
私はこれが自明ではないことを知っています。密接に関連する質問の出発点を次に示します。
VirtualQueryExを使用して、PE ファイル、ヒープなどで使用されるメモリを特定することにより、(おそらく不十分な) 開始を得ることができます。仮想メモリ マップビューを提供する 1 つのプログラムを次に示します。これは、デバイス ドライバーのイメージ サイズに対応するはずです。
より大きな困難は、メモリを割り当てるコードによって動的に割り当てられるメモリにタグを付ける方法を決定することです。最良の方法は、回り道のようなものを使用して動的メモリ割り当てを追跡し、スタックを調べて発信者を特定することです。最後に、デバイス ドライバーに対してこれを実行したいという事実は、さらに一歩進んだものです。回り道がデバイスドライバーに使用できるとは思えません (確かなことはわかりませんが)。デバイス ドライバーからスタックをウォークすることは非常に簡単ではありません。
SysInternals スイートの ProcExp から必要なデータを取得できる場合もあります。実行 「システム」に移動し、下部ペインの表示/表示に移動し、Dll を有効にします。次に、列ヘッダーを右クリックして、ワーキング セットのヘッダーを追加します (例: 'WS Total')。これがメモリに適切にラベルを付けるために何をするのかわかりません。私のボックスでは、デバイス ドライバーのマップされたイメージ サイズが表示されますが、ワーキング セットの列には 0K しかありません。procexp からの回答がないことは、この問題を簡単に解決できないという合理的な証拠と考えています。
幸運を。