Udostępnij przez


Przykłady PoolMon

Ten temat zawiera następujące przykłady użycia PoolMon:

Przykład 1: Wyświetlanie i sortowanie danych wyjściowych PoolMon

Przykład 2. Wyświetlanie nazw sterowników

Przykład 3. Wykrywanie wycieku pamięci

Przykład 4. Analiza przecieku pamięci z puli

Przykład 5. Monitorowanie sesji serwera terminali

Przykład 1: Wyświetlanie i sortowanie danych wyjściowych PoolMon

W tym przykładzie opisano różne sposoby konfigurowania wyświetlania PoolMon. Domyślnie funkcja PoolMon wyświetla wszystkie alokacje pamięci jądra w kolejności alfanumerycznej według wartości tagu. Można zmodyfikować kolejność sortowania widoku w wierszu polecenia lub podczas działania PoolMon.

Następujące polecenie uruchamia PoolMon:

poolmon

Następujące polecenie uruchamia PoolMon i sortuje wyświetlanie według liczby wolnych operacji.

poolmon /f

Gdy program poolmon jest uruchomiony, możesz użyć poleceń w czasie działania, aby zmienić wyświetlanie. Aby na przykład posortować wyświetlanie według liczby użytych bajtów, naciśnij b. Aby posortować bajty na alokację, naciśnij m.

Następujące polecenie uruchamia program PoolMon i wyświetla tylko alokacje z puli niestronicowanej:

poolmon /p

Podczas działania programu PoolMon naciśnij p, aby przełączać się między alokacjami z puli stronicowanej, niestronicowanej lub obu naraz.

Aby uruchomić poolMon i wyświetlić dane alokacji z określonym tagiem, użyj /i parametru. Następujące polecenie wyświetla alokacje z tagiem AfdB zastosowanym przez afd.sys dla buforów danych.

poolmon /iAfdB

Aby wykluczyć alokacje z określonym tagiem, użyj /x parametru. Następujące polecenie wyświetla wszystkie alokacje, które nie mają tagu AfdB ;

poolmon /xAfdB

Możesz użyć gwiazdki (*) i/lub znaku zapytania (?), aby określić zestaw tagów o tych samych znakach. Następujące polecenie wyświetla alokacje z tagami puli zaczynającymi się od Afd, czyli tagu używanego przez afd.sys.

poolmon /iAfd*

Polecenie uruchamiania PoolMon może zawierać wiele parametrów /i i /x . Następujące polecenie wyświetla alokacje, które mają tagi rozpoczynające się od Aud i czteroznakowe tagi rozpoczynające się od Cc, z wyjątkiem alokacji z tagiem CcBc.

poolmon /iAud* /iCc?? /xCcBc

Możesz również posortować ekran PoolMon według zmiany wartości między aktualizacjami. /( parametr umieszcza PoolMon w trybie sortowania według zmian.

Następujące polecenie wyświetla alokacje z tagami rozpoczynającymi się od afd i sortuje według zmiany alokacji. Używa /a parametru do sortowania według liczby alokacji i /) parametru do sortowania według zmiany liczby alokacji.

poolmon /iAfd* /( /a

/( parametr i klawisze nawiasów są przełącznikami wyboru. Gdy PoolMon jest w trybie sortowania według zmiany, interpretuje wszystkie polecenia sortowania jako polecenia sortowania według zmiany wartości. Jeśli ponownie naciśniesz klawisz nawiasu, posortuje według wartości.

Przykład 2. Wyświetlanie nazw sterowników

Można użyć parametru PoolMon /g , aby wyświetlić nazwy składników systemu Windows i często używane sterowniki, które przypisują każdy tag puli. Jeśli znajdziesz problem w alokacjach z konkretnym tagiem, ta funkcja pomoże zidentyfikować problematyczny komponent lub sterownik.

Składniki i sterowniki są wymienione w kolumnie Mapped_Driver, czyli najbardziej prawej kolumnie na wyświetlaczu. Dane kolumny Mapped_Driver pochodzą z pooltag.txt, pliku zainstalowanego z zestawem WDK.

Następujące polecenie wyświetla pamięć przydzieloną przy użyciu tagów rozpoczynających się od NtF. (Używa znaku zapytania (?) jako znaku wieloznacznego.) /g parametr dodaje kolumnę Mapped_Driver.

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

Możesz również skopiować plik pooltag.txt do tej samej lokalizacji co poolmon. Umożliwia to użycie.

poolmon /iNtF? /g

Wynikowy wyświetlacz pokazuje listę alokacji z tagami rozpoczynającymi się od NtF. Najbardziej zewnętrzna kolumna w wyświetlaczu, Mapped_Driver, pokazuje, że pamięć została przydzielona przez ntfs.sys, sterownik systemu plików NTFS. W tym przypadku ekran jest jeszcze bardziej szczegółowy, ponieważ pooltag.txt zawiera pliki źródłowe dla alokacji NTFS.

 Memory:  260620K Avail:   65152K  PageFlts:    85   InRam Krnl: 2116K P:19560K
 Commit: 237688K Limit: 640916K Peak: 260632K            Pool N: 8500K P:33024K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 NtFA Nonp       9112 (   0)      9112 (   0)     0       0 (     0)      0 [ntfs.sys  -  AttrSup.c]
 NtFB Paged      3996 (   0)      3986 (   0)    10  252088 (     0)  25208 [ntfs.sys  -  BitmpSup.c]
 NtFC Paged   1579279 (   0)   1579269 (   0)    10     640 (     0)     64 [ntfs.sys  -  Create.c]
 NtFD Nonp         13 (   0)        13 (   0)     0       0 (     0)      0 [ntfs.sys  -  DevioSup.c]
 NtFF Paged      1128 (   0)      1128 (   0)     0       0 (     0)      0 [ntfs.sys  -  FileInfo.c]
 NtFI Nonp        152 (   0)       152 (   0)     0       0 (     0)      0 [ntfs.sys  -  IndexSup.c]
 NtFL Nonp      68398 (   0)     68390 (   0)     8   27280 (     0)   3410 [ntfs.sys  -  LogSup.c]
 NtFS Paged      2915 (   0)      2614 (   0)   301   80192 (     0)    266 [ntfs.sys  -  SecurSup.c]
 NtFa Paged       838 (   0)       829 (   0)     9     288 (     0)     32 [ntfs.sys  -  AllocSup.c]
 NtFd Paged    137696 (   0)    137688 (   0)     8     720 (     0)     90 [ntfs.sys  -  DirCtrl.c]
 NtFf Nonp          2 (   0)         1 (   0)     1      40 (     0)     40 [ntfs.sys  -  FsCtrl.c]
 NtFs Nonp      48825 (   0)     47226 (   0)  1599   64536 (     0)     40 [ntfs.sys  -  StrucSup.c]
 NtFv Paged       551 (   0)       551 (   0)     0       0 (     0)      0 [ntfs.sys  -  ViewSup.c]

Pooltag.txt jest obszerna, ale nie jest to pełna lista wszystkich tagów używanych w systemie Windows. Kiedy tag wyświetlany na ekranie nie jest uwzględniony w pooltag.txt, w kolumnie Mapped_Driver dla tagu pojawi się komunikat "Nieznany sterownik".

W poniższych przykładach pokazano tę metodę w systemie 32-bitowym.

Następujące polecenie używa /i parametru do wyświetlania listy alokacji z tagami, które kończą się na MEM. /g parametr dodaje nazwę sterownika na wyświetlaczu z pliku pooltag.txt.

poolmon /i?MEM /g

Wynikowy ekran zawiera listę alokacji z tagami kończącymi się na MEM. Jednak ze względu na to, że tagi MEM nie są uwzględnione w pooltag.txt, "Nieznany sterownik" pojawia się w kolumnie Mapped_Driver zamiast nazwy sterownika.

 Tag  Type        Allocs          Frees      Diff   Bytes      Per Alloc    Mapped_Driver

 1MEM Nonp       1 (   0)         0 (   0)     1    3344 (     0)   3344   Unknown Driver
 2MEM Nonp       1 (   0)         0 (   0)     1    3944 (     0)   3944   Unknown Driver
 3MEM Nonp       3 (   0)         0 (   0)     3     248 (     0)     82   Unknown Driver

Następujące polecenie uruchamia PoolMon. Używa /i parametru do wyświetlania listy alokacji z tagami kończącymi się na MEM.

poolmon /i?MEM 

Następujące polecenie wyświetla listę alokacji tagów rozpoczynających się od adresu IP. Używa /g parametru, który używa zawartości pliku pooltag.txt w kolumnie Mapped_Driver.

poolmon /iIp* /g

Na wyświetlonym ekranie kolumna Mapped_Driver zawiera dane z plików pooltag.txt.

 Memory:  130616K Avail:   23692K  PageFlts:   146   InRam Krnl: 2108K P: 9532K
 Commit: 187940K Limit: 318628K Peak: 192000K            Pool N: 8372K P:13384K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 IpEQ Nonp          1 (   0)         0 (   0)        1    1808 (     0)   1808 [ipsec][ipsec.sys    -  event queue]
 IpFI Nonp         26 (   0)         0 (   0)       26    7408 (     0)    284 [ipsec][ipsec.sys    -  Filter blocks]
 IpHP Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpIO Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec]
 IpLA Nonp          1 (   0)         0 (   0)        1     248 (     0)    248 [ipsec][ipsec.sys    -  lookaside lists]
 IpSH Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpSI Nonp       1027 (   0)         0 (   0)     1027   53272 (     0)     51 [ipsec][ipsec.sys    - initial allcoations]
 IpTI Nonp          3 (   0)         0 (   0)        3    5400 (     0)   1800 [ipsec][ipsec.sys    -  timers]

Przykład 3. Wykrywanie wycieku pamięci

W tym przykładzie przedstawiono procedurę używania PoolMon do wykrywania wycieku pamięci.

  1. Uruchom PoolMon z parametrami /p /p (wyświetlaj tylko alokacje ze stronicowanej puli) i /b (sortuj według liczby bajtów).

    poolmon /p /p /b
    
  2. Niech PoolMon pracuje przez kilka godzin. Ponieważ uruchomienie PoolMon zmienia dane, musi osiągnąć stabilny stan, aby dane były wiarygodne.

  3. Zapisz informacje wygenerowane przez program PoolMon jako zrzut ekranu lub skopiuj je z okna polecenia i wklejając je do Notatnika.

  4. Powracając do aplikacji PoolMon, naciśnij dwukrotnie p, aby wyświetlić tylko alokacje z puli niestronicowanej.

  5. Powtórz kroki 3 i 4 co około pół godziny przez co najmniej dwie godziny, przełączaj się między wyświetleniami puli stronicowanej i niestronicowanej za każdym razem.

  6. Po zakończeniu zbierania danych sprawdź wartości Różnice (operacje alokacji pomniejszone o wolne operacje) i Bajty (liczba bajtów przydzielonych minus liczba wolnych bajtów) dla każdego tagu i zwróć uwagę na to, że stale rosną.

  7. Następnie zatrzymaj PoolMon, zaczekaj kilka godzin, a następnie uruchom ponownie PoolMon.

  8. Sprawdź przydzielone zasoby, które rosły, i ustal, czy bajty zostały teraz zwolnione. Prawdopodobną przyczyną są alokacje, które nadal nie zostały zwolnione lub wciąż się powiększają.

Przykład 4. Badanie przecieku pamięci puli

W poniższym przykładzie przedstawiono użycie PoolMon do zbadania wycieku pamięci puli z podejrzanego sterownika drukarki. W tym przykładzie PoolMon wyświetla dane zbierane przez system Windows dotyczące alokacji pamięci za pomocą tagu Dsrd.

Niektóre sterowniki drukarek przypisują tag Drsd podczas przydzielania obiektów interfejsu graficznego (GDI) i skojarzonej pamięci. Jeśli sterownik drukarki ma wyciek obiektu, pamięć przydzielona za pomocą tagu Drsd również wycieknie.

Uwaga Przed wykonaniem kroków opisanych w tym przykładzie upewnij się, że drukarka, którą używasz, nie zostanie przerywana do momentu zakończenia. W przeciwnym razie wyniki mogą być nieprawidłowe.

W wierszu polecenia wpisz następujące polecenie:

poolmon /iDrsd

To polecenie kieruje PoolMon do wyświetlania informacji dotyczących alokacji za pomocą tagu Drsd. (Tagi puli są wrażliwe na wielkość liter, więc pamiętaj, aby wpisać dokładnie tak, jak pokazano).

Zapisz wartości w kolumnach Różnice i Bajty. Na poniższym ekranie próbki wartość różnicy wynosi 21, a liczba bajtów to 17472.

Memory:  130480K Avail:   91856K  PageFlts:  1220   InRam Krnl: 2484K P: 7988K
Commit:  30104K Limit: 248432K Peak:  34028K            Pool N: 2224K P: 8004K
Tag  Type        Allocs           Frees           Diff  Bytes           Per Alloc

Drsd Paged       560 ( 177)       539 ( 171)       21   17472 (  4992)    832 

Wyślij zadanie do drukarki, poczekaj na krótki czas, aż system Windows powróci do normy, a następnie zapisz wartości kolumn Różnice i Bajty.

Memory:  130480K Avail:   91808K  PageFlts:  1240   InRam Krnl: 2488K P: 7996K
Commit:  30152K Limit: 248432K Peak:  34052K            Pool N: 2224K P: 8012K
Tag  Type        Allocs           Frees           Diff  Bytes          Per Alloc

Drsd Paged       737 (   0)       710 (   0)       27   22464 (     0)    832  

Gdy zarządzanie pamięcią sterownika drukarki działa prawidłowo, wartość Diff powinna powrócić do oryginalnej wartości 21 po wydrukowaniu. Jednak jak pokazano w poprzednich danych wyjściowych, wartość Diff wzrosła do 27, a liczba bajtów wzrosła do 22464. Różnica między początkowymi i kolejnymi danymi wyjściowymi oznacza, że podczas drukowania wyciekło sześć bloków Drsd z łącznie 4992 bajtami.

Aby uzyskać więcej informacji

Jeśli uważasz, że zidentyfikowano wyciekujący sterownik, przejdź do witryny internetowej pomocy technicznej firmy Microsoft i wyszukaj bazę wiedzy w poszukiwaniu odpowiednich artykułów lub skontaktuj się z dostawcą, jeśli jest to sterownik innej firmy.

Przykład 5. Monitorowanie sesji serwera terminali

W tym przykładzie pokazano kilka sposobów wyświetlania alokacji z pul sesji usług terminalowych. Demonstruje użycie parametru wiersza polecenia /s oraz parametrów s, TSSessionID i uruchomieniowych.

Następujące polecenie wyświetla alokacje ze wszystkich pul sesji usług terminalowych. W tym przykładzie komputer lokalny skonfigurowany jako serwer terminalowy hostuje sesje, a komputery klienckie używają funkcji pulpitu zdalnego w celu nawiązania połączenia z hostem.

poolmon /s

W odpowiedzi PoolMon wyświetla alokacje ze wszystkich pul sesji. Zwróć uwagę na tytuł "Wszystkie informacje o puli sesji" w nagłówku.

Memory:  523572K Avail:  233036K  PageFlts:   344   InRam Krnl: 1828K P:18380K
Commit: 193632K Limit:1279764K Peak: 987356K            Pool N:14332K P:18644K
All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     88876 (   1)     88876 (   1)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9829 (   0)      9801 (   0)       28   19712 (     0)    704
 Gcac Paged      3761 (   0)      3706 (   0)       55  288968 (     0)   5253
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6277 (   0)      6271 (   0)        6    1872 (     0)    312
 ...

Aby wyświetlić alokacje z określonej puli sesji, wpisz identyfikator sesji bezpośrednio po /s parametru, jak pokazano w poniższym poleceniu. To polecenie wyświetla alokacje puli sesji dla sesji usług terminalowych 0.

poolmon /s0

W odpowiedzi PoolMon wyświetla alokacje z puli sesji dla sesji 0. Zwróć uwagę na tytuł "Informacje o puli 'Sesja 0'" w nagłówku.

Memory:  523572K Avail:  233024K  PageFlts:   525   InRam Krnl: 1828K P:18384K
 Commit: 193760K Limit:1279764K Peak: 987356K            Pool N:14340K P:18644K
 Session 0 pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     89079 (  99)     89079 (  99)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9830 (   0)      9802 (   0)       28   19712 (     0)    704
 Gcac Paged      3762 (   0)      3707 (   0)       55  283632 (     0)   5156
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6280 (   0)      6274 (   0)        6    1872 (     0)    312
 ...

Aby ułatwić określenie, które sterowniki i składniki przydzielają pamięć z puli sesji, dodaj parametr /g, jak pokazano w poniższym poleceniu. /g parametr dodaje kolumnę Mapped_Driver zawierającą listę składników i sterowników systemu Windows, które przypisują każdy tag.

poolmon /s0 /g

Memory:  523572K Avail:  235876K  PageFlts:    43   InRam Krnl: 1900K P:18860K
Commit: 185040K Limit:1279764K Peak: 987356K            Pool N:14684K P:19124K
Session 0 pool information
Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

Bmfd Paged       421 (   0)       396 (   0)       25   57832 (     0)   2313 [Font related stuff]
DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60 Unknown Driver
Dddp Paged        11 (   0)         6 (   0)        5     392 (     0)     78 Unknown Driver
Dh 1 Paged        37 (   0)        35 (   0)        2     224 (     0)    112 Unknown Driver
Dh 2 Paged       367 (   0)       364 (   0)        3     912 (     0)    304 Unknown Driver
Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [vga for risc video driver]
GDev Paged       119 (   0)       113 (   0)        6   20272 (     0)   3378 [Gdi pdev]
GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80 [Gdi engine descriptor list]
GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272 [Gdi Objects]
GTmp Paged     98626 (   1)     98626 (   1)        0       0 (     0)      0 [Gdi Objects]
GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [Gdi Objects]
Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0 [Gdi Objects]
Gbaf Paged     10331 (   0)     10305 (   0)       26   18304 (     0)    704 [Gdi Objects]
Gcac Paged      4722 (   0)      4666 (   0)       56  305400 (     0)   5453 [Gdi glyph cache]
Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488 [Gdi string resource script names]
Gdbr Paged      6972 (   0)      6965 (   0)        7    2184 (     0)    312 [Gdi driver brush realization]

Można również skonfigurować wyświetlanie puli sesji Usług terminalowych, gdy PoolMon jest uruchomiony. W poniższej tabeli przedstawiono serię uruchomionych poleceń, w kolejności, w której są wpisywane, oraz wynikowy ekran PoolMon.

Seria rozpoczyna się od polecenia , aby uruchomić PoolMon. Wszystkie inne parametry są wpisywane, gdy program PoolMon jest uruchomiony.

poolmon
Klawisz Wynik Opis

s

Wyświetla wszystkie pule sesji.

s

Wyświetla pule systemowe.

Parametr s przełącza wyświetlanie między pulami systemu a pulami sesji usług terminalowych.

0

Wyświetla pulę sesji 0.

Identyfikator sesji można wpisać podczas wyświetlania pul systemowych.

7

Wyświetla pulę dla sesji 7.

a

Przedstawia alokacje puli dla sesji 7 posortowane według liczby alokacji.

Wszystkie standardowe parametry uruchamiania są ważne dla wyświetlania puli sesji.

0

Wyświetla alokacje dla sesji 0 posortowane według liczby alokacji.

Opcje sesji i sortowania są zachowywane do czasu zmiany.

s

Wyświetla pule systemowe.

s

Wyświetla alokacje dla sesji 0 posortowane według liczby alokacji.

Opcja sesji jest zachowywana.

10ENTER

Wyświetla alokacje sesji 1, a następnie wyświetla alokacje sesji 0.

Bez elementu i można wprowadzić tylko identyfikatory sesji od 0 do 9.

i

Prosi o identyfikator sesji serwera terminali.

10

Wyświetla alokacje sesji 10.

i

Zachęca do podania identyfikatora sesji serwera terminali.

Aby wyświetlić wszystkie pule sesji, naciśnij i , a następnie naciśnij ENTER.

ENTER

Wyświetla wszystkie pule sesji.

Tylko systemy skonfigurowane jako serwer terminali przydzielają pamięć z puli sesji. Jeśli używasz narzędzia PoolMon do wyświetlania puli sesji na komputerze, który nie jest Serwerem Terminali, lub jeśli wpiszesz identyfikator sesji, który nie istnieje w systemie Windows, PoolMon nie wyświetla żadnych alokacji. Zamiast tego wyświetla tylko nagłówki z ogólnymi danymi pamięci.

Następujące polecenie wyświetla alokacje ze wszystkich pul sesji usług terminalowych:

poolmon /s

Na poniższej ilustracji przedstawiono ekran PoolMon, który mógłby spowodować, że polecenie /s zostało przesłane do komputera z systemem Windows XP, którego nie można skonfigurować jako serwera terminali:

 Memory:  260620K Avail:   44956K  PageFlts:   308   InRam Krnl: 2744K P:20444K
 Commit: 185452K Limit: 640872K Peak: 192472K            Pool N: 8112K P:20648K
 All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc