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:
Starten Sie PoolMon.
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.
Wählen Sie B aus, um die Anzeige nach der maximalen Bytenutzung zu sortieren.
Starten Sie den Test. Kopieren Sie die Ausgabe vom Bildschirm, z. B. indem Sie einen Screenshot erstellen und speichern.
Erstellen Sie jede halbe Stunde einen neuen Screenshot. Wenn Sie Screenshots vergleichen, bestimmen Sie, welche Bytes des Tags zunimmt.
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.