Freigeben über


Verwenden von PoolMon, um einen Speicherverlust im Kernelmodus zu finden

Wenn Sie vermuten, dass ein Speicherverlust im Kernelmodus vorliegt, können Sie das PoolMon-Tool verwenden, um zu bestimmen, welches Pooltag dem Leck zugeordnet ist.

PoolMon (Poolmon.exe) überwacht die Speicherauslastung des Pools nach Pooltagname. Dieses Tool ist im Windows Driver Kit (WDK) enthalten. Weitere Informationen finden Sie unter PoolMon.

GFlags-Pooleinstellungen

Einige GFlags-Einstellungen, z. B. Special Pool, wirken sich auf die Verwendung von Arbeitsspeicherpools aus. Weitere Informationen finden Sie unter GFlags und Konfigurieren eines speziellen Pools.

Verwenden von PoolMon

Der PoolMon-Header zeigt die Gesamtzahl der ausgelagerten und nicht ausgelagerten Poolbytes an. Die Spalten zeigen, dass der Pool für jedes Pooltag verwendet wird. Die Anzeige wird alle paar Sekunden automatisch aktualisiert. Beispiel:

Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K
Commit: 24140K Limit: 24952K Peak: 24932K Pool N: 744K P: 2180K

## Tag   Type  Allocs       Frees        Diff    Bytes       Per Alloc


CM    Paged   1283  ( 0)  1002  ( 0)   281  1377312   ( 0)  4901
Strg  Paged  10385 ( 10)  6658  ( 4)  3727   317952 ( 512)    85
Fat   Paged   6662  ( 8)  4971  ( 6)  1691   174560 ( 128)   103
MmSt  Paged    614  ( 0)   441  ( 0)   173    83456   ( 0)   482 

PoolMon verfügt über Befehlstasten, die die Ausgabe nach verschiedenen Kriterien sortieren. Wählen Sie den Buchstaben aus, der den einzelnen Befehlen zugeordnet ist, um die Daten zu verwenden. Es dauert einige Sekunden, bis jeder Befehl funktioniert.

Zu den Sortierbefehlen gehören:

Befehlstaste Vorgang
P Schränkt die angezeigten Tags auf nicht ausgelagerte Poolbytes, ausgelagerte Poolbytes oder beides ein. Wiederholtes Drücken von P-Zyklen durch jede dieser Optionen in dieser Reihenfolge.
B Sortiert Tags nach maximaler Bytenutzung.
M Sortiert Tags nach maximalen Bytezuordnungen.
T Sortiert Tags alphabetisch nach Tagname.
E Bewirkt, dass die Anzeige die ausgelagerten und nicht ausgelagerten Gesamtsummen im unteren Bereich enthält.
A Sortiert Tags nach Zuordnungsgröße.
F Sortiert Tags nach freien Vorgängen.
S Sortiert Tags nach dem Unterschied zwischen Zuordnungen und Freizeichen.
Q Beendet PoolMon.

Anzeigen von Treibernamen in PoolMon

Sie können den Parameter PoolMon /g verwenden, um die Namen von Windows-Komponenten und häufig verwendeten Treibern anzuzeigen, die jedem Pooltag zuweisen. Wenn Sie ein Problem bei Zuordnungen mit einem bestimmten Tag finden, hilft Ihnen dieses Feature, die beleidigende Komponente oder den fehlerhaften Treiber zu identifizieren.

Die Komponenten und Treiber werden in der Spalte Mapped_Driver aufgeführt, der Spalte ganz rechts in der Anzeige. Die Daten für die Spalte Mapped_Driver stammen aus pooltag.txt, einer Datei, die mit dem WDK installiert ist.

Der folgende Befehl zeigt die Verwendung des Parameters /g zum Hinzufügen der Mapped_Driver Spalte.

poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

Anzeigen bestimmter Pools

Verwenden Sie den Parameter /i, um Pooltags anzuzeigen, die mit einer bestimmten Zeichenfolge beginnen, z. B. Hid.

poolmon /iHid? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

 Memory:33473120K Avail:20055132K  PageFlts:     5   InRam Krnl:10444K P:1843072K
 Commit:15035764K Limit:67027552K Peak:16677444K            Pool N:1023400K P:1955448K
 System pool information
 Tag  Type     Allocs            Frees            Diff       Bytes                 Per Alloc Mapped_Driver

 HidC Paged      1667 (   0)      1659 (   0)        8         896 (          0)         112 [hidclass.sys - HID Class d 
 HidC Nonp      17375 (   0)     17256 (   0)      119       19808 (          0)         166 [hidclass.sys - HID Class d 
 HidP Nonp       1014 (   0)       998 (   0)       16        6704 (          0)         419 [hidparse.sys - HID Parser]

Verwenden Sie das PoolMon-Hilfsprogramm, um einen Speicherverlust zu finden

Hier finden Sie einen Ansatz, um einen Speicherverlust mit dem PoolMon-Hilfsprogramm zu finden:

  1. Starten Sie PoolMon.

  2. Wenn Sie festgestellt haben, dass das Leck in einem nicht ausgelagerten Pool auftritt, wählen Sie einmal P aus. Wenn Sie festgestellt haben, dass dies in einem ausgelagerten Pool auftritt, wählen Sie zweimal P aus. Wenn Sie nicht wissen, wählen Sie nicht P aus, sodass beide Arten von Pool enthalten sind.

  3. Wählen Sie B aus, um die Anzeige nach der maximalen Bytenutzung zu sortieren.

  4. Starten Sie den Test. Kopieren Sie die Ausgabe vom Bildschirm, z. B. indem Sie einen Screenshot erstellen und speichern.

  5. Erstellen Sie jede halbe Stunde einen neuen Screenshot. Wenn Sie Screenshots vergleichen, bestimmen Sie, welche Bytes des Tags zunimmt.

  6. Beenden Sie den Test, und warten Sie einige Stunden. Bestimmen Sie, wie viel des Tags in dieser Zeit freigegeben wurde.

Wenn eine Anwendung einen stabilen Ausführungszustand erreicht hat, werden In der Regel Arbeitsspeicher und freier Arbeitsspeicher mit der gleichen Rate zugewiesen. Wenn arbeitsspeicher schneller zugewiesen als freigegeben wird, wächst die Arbeitsspeichernutzung im Laufe der Zeit. Dies weist häufig auf einen Speicherverlust hin.

Beheben des Lecks

Nachdem Sie ermittelt haben, welches Pooltag dem Leck zugeordnet ist, haben Sie möglicherweise alles, was Sie über das Leck wissen müssen. Wenn Sie ermitteln müssen, welcher bestimmte instance der Zuordnungsroutine das Leck verursacht, lesen Sie Verwenden des Kerneldebuggers zum Ermitteln von Speicherlecks im Kernelmodus.