Contoh PoolMon

Topik ini mencakup contoh penggunaan PoolMon berikut:

Contoh 1: Menampilkan dan Mengurutkan Output PoolMon

Contoh 2: Nama Pengandar Tampilan

Contoh 3: Mendeteksi Kebocoran Memori

Contoh 4: Memeriksa Kebocoran Memori Kumpulan

Contoh 5: Memantau Sesi Server Terminal

Contoh 1: Menampilkan dan Mengurutkan Output PoolMon

Contoh ini menjelaskan berbagai cara untuk mengonfigurasi tampilan PoolMon. Secara default, PoolMon menampilkan semua alokasi memori kernel dalam urutan alfanumerik menurut nilai tag. Anda dapat mengubah urutan pengurutan tampilan di baris perintah atau saat PoolMon sedang berjalan.

Perintah berikut memulai PoolMon:

poolmon

Perintah berikut memulai PoolMon dan mengurutkan tampilan menurut jumlah operasi gratis:

poolmon /f

Saat poolmon berjalan, Anda dapat menggunakan perintah run-time untuk mengubah tampilan. Misalnya, untuk mengurutkan tampilan menurut jumlah byte yang digunakan, tekan b. Untuk mengurutkan menurut byte per alokasi, tekan m.

Perintah berikut memulai PoolMon dan hanya menampilkan alokasi dari kumpulan non-paged:

poolmon /p

Saat PoolMon berjalan, tekan p untuk beralih antara alokasi dari kumpulan tersegmentasi, kumpulan tidak tersegmentasi, atau keduanya.

Untuk memulai PoolMon dan menampilkan data untuk alokasi dengan tag tertentu, gunakan parameter /i . Perintah berikut menampilkan alokasi dengan tag AfdB (tag yang digunakan oleh afd.sys untuk buffer data).

poolmon /iAfdB

Untuk mengecualikan alokasi dengan tag tertentu, gunakan parameter /x . Perintah berikut menampilkan semua alokasi yang tidak memiliki tag AfdB ;

poolmon /xAfdB

Anda dapat menggunakan tanda bintang (*) dan/atau tanda tanya (?) untuk menentukan sekumpulan tag dengan karakter yang sama. Perintah berikut menampilkan alokasi yang memiliki tag kumpulan yang dimulai dengan Afd, tag yang digunakan oleh afd.sys;

poolmon /iAfd*

Perintah startup PoolMon dapat menyertakan beberapa parameter /i dan /x . Perintah berikut menampilkan alokasi yang memiliki tag yang dimulai dengan Aud dan tag empat karakter yang dimulai dengan Cc, kecuali untuk alokasi dengan tag CcBc;

poolmon /iAud* /iCc?? /xCcBc

Anda juga dapat mengurutkan tampilan PoolMon berdasarkan perubahan nilai di antara pembaruan. Parameter /( menempatkan PoolMon dalam mode pengurutan berdasarkan perubahan.

Perintah berikut menampilkan alokasi dengan tag yang dimulai dengan Afd, dan mengurutkan berdasarkan perubahan alokasi. Ini menggunakan parameter /a untuk mengurutkan menurut jumlah alokasi dan parameter /) untuk mengurutkan menurut perubahan jumlah alokasi.

poolmon /iAfd* /( /a

Parameter /( dan kunci tanda kurung adalah sakelar pengalih. Saat PoolMon berada dalam mode urutkan demi perubahan, poolMon menginterpretasikan semua perintah pengurutan sebagai perintah untuk mengurutkan menurut perubahan nilai. Jika Anda menekan tombol tanda kurung lagi, itu akan mengurutkan menurut nilai.

Contoh 2: Nama Driver Tampilan

Anda dapat menggunakan parameter PoolMon /g untuk menampilkan nama komponen Windows dan driver yang umum digunakan yang menetapkan setiap tag kumpulan. Jika Anda menemukan masalah dalam alokasi dengan tag tertentu, fitur ini membantu Anda mengidentifikasi komponen atau driver yang menyinggung.

Komponen dan driver tercantum di kolom Mapped_Driver, kolom paling kanan dalam tampilan. Data untuk kolom Mapped_Driver berasal dari pooltag.txt, file yang diinstal dengan WDK.

Perintah berikut menampilkan memori yang dialokasikan dengan tag yang dimulai dengan NtF. (Ini menggunakan karakter tanda tanya (?) sebagai kartubebas.) Parameter /g menambahkan kolom Mapped_Driver.

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

Anda juga dapat menyalin file pooltag.txt ke lokasi yang sama dengan poolmon. Ini memungkinkan penggunaan ini.

poolmon /iNtF? /g

Tampilan yang dihasilkan mencantumkan alokasi dengan tag yang dimulai di NtF. Kolom paling kanan dalam tampilan, Mapped_Driver, menunjukkan bahwa memori dialokasikan oleh ntfs.sys, driver untuk sistem file NTFS. Dalam hal ini, tampilan bahkan lebih spesifik, karena pooltag.txt menyertakan file sumber untuk alokasi 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 ekstensif, tetapi bukan daftar lengkap semua tag yang digunakan di Windows. Saat tag yang muncul di tampilan tidak disertakan dalam pooltag.txt, PoolMon menampilkan "Driver yang tidak diketahui" di kolom Mapped_Driver untuk tag.

Contoh berikut menunjukkan metode ini pada sistem 32 bit.

Perintah berikut menggunakan parameter /i untuk mencantumkan alokasi dengan tag yang berakhiran MEM. Parameter /g menambahkan nama driver ke tampilan dari file pooltag.txt.

poolmon /i?MEM /g

Tampilan yang dihasilkan mencantumkan alokasi dengan tag yang berakhiran MEM. Namun, karena tag MEM tidak disertakan dalam pooltag.txt, "Driver Tidak Diketahui" muncul di kolom Mapped_Driver menggantikan nama driver.

 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

Perintah berikut memulai PoolMon. Ini menggunakan parameter /i untuk mencantumkan alokasi dengan tag yang berakhiran MEM.

poolmon /i?MEM 

Perintah berikut mencantumkan alokasi untuk tag yang dimulai dengan Ip. Ini menggunakan parameter /g , yang menggunakan konten file pooltag.txt di kolom Mapped_Driver.

poolmon /iIp* /g

Dalam tampilan yang dihasilkan, kolom Mapped_Driver berisi data dari file 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]

Contoh 3: Mendeteksi Kebocoran Memori

Contoh ini menyarankan prosedur untuk menggunakan PoolMon untuk mendeteksi kebocoran memori.

  1. Mulai PoolMon dengan parameter /p /p (tampilkan hanya alokasi dari kumpulan halaman) dan /b (urutkan menurut jumlah byte).

    poolmon /p /p /b
    
  2. Biarkan PoolMon berjalan selama beberapa jam. Karena memulai PoolMon mengubah data, PoolMon harus kembali ke kondisi stabil sebelum data dapat diandalkan.

  3. Simpan informasi yang dihasilkan oleh PoolMon, baik sebagai cuplikan layar, atau dengan menyalinnya dari jendela perintah dan menempelkannya ke Notepad.

  4. Kembali ke PoolMon, tekan tombol p dua kali untuk menampilkan hanya alokasi dari kumpulan yang tidak disebarkan.

  5. Ulangi langkah 3 dan 4 kira-kira setiap setengah jam setidaknya selama dua jam, beralih antara kumpulan halaman dan yang tidak dipagasi ditampilkan setiap kali.

  6. Ketika pengumpulan data selesai, periksa nilai Diff (operasi alokasi dikurangi operasi gratis) dan Byte (jumlah byte yang dialokasikan dikurangi jumlah byte yang dibebaskan) untuk setiap tag, dan perhatikan apa pun yang terus meningkat.

  7. Selanjutnya, hentikan PoolMon, tunggu beberapa jam, lalu mulai ulang PoolMon.

  8. Periksa alokasi yang meningkat, dan tentukan apakah byte sekarang telah dibebaskan. Kemungkinan penyebabnya adalah alokasi yang masih belum dibebaskan atau terus meningkat ukurannya.

Contoh 4: Memeriksa Kebocoran Memori Kumpulan

Contoh berikut menunjukkan penggunaan PoolMon untuk menyelidiki kebocoran memori kumpulan dari driver printer yang dicurigai. Dalam contoh ini, PoolMon menampilkan data yang dikumpulkan Windows tentang alokasi memori dengan tag Dsrd.

Beberapa pengandar printer menetapkan tag Drsd ketika mereka mengalokasikan objek Antarmuka Perangkat Grafis (GDI) dan memori terkait. Jika pengendali printer memiliki kebocoran objek, memori yang dialokasikan dengan tag Drsd juga akan bocor.

Nota Sebelum menjalankan langkah-langkah dalam contoh ini, pastikan printer yang Anda gunakan tidak akan terganggu hingga Anda selesai. Jika tidak, hasilnya mungkin tidak valid.

Pada baris perintah, ketik yang berikut ini:

poolmon /iDrsd

Perintah ini mengarahkan PoolMon untuk menampilkan informasi untuk alokasi dengan tag Drsd. (Tag kelompok peka terhadap huruf besar/kecil, jadi pastikan untuk mengetik perintah persis seperti yang ditunjukkan.)

Rekam nilai dalam kolom Diff dan Byte. Dalam tampilan sampel berikut, nilai Diff adalah 21 dan jumlah Byte adalah 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 

Kirim pekerjaan ke printer, tunggu sebentar agar Windows kembali normal, lalu rekam nilai untuk kolom Diff dan Byte.

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  

Ketika manajemen memori untuk pengandar printer bekerja dengan baik, nilai Diff harus kembali ke nilai aslinya 21 setelah pencetakan. Namun, seperti yang digambarkan output sebelumnya, nilai Diff naik menjadi 27, dan jumlah Byte naik menjadi 22464. Perbedaan antara output awal dan berikutnya berarti bahwa enam blok Drsd, dengan total 4992 byte, bocor selama pencetakan.

Untuk Informasi Selengkapnya

Jika Anda yakin telah mengidentifikasi driver yang bocor, buka situs web dukungan Microsoft dan cari artikel yang relevan di Pangkalan Pengetahuan, atau hubungi vendor jika ini adalah driver pihak ketiga.

Contoh 5: Memantau Sesi Server Terminal

Contoh ini menunjukkan beberapa cara untuk menampilkan alokasi dari kumpulan sesi Layanan Terminal. Ini menunjukkan penggunaan parameter baris perintah /s, dan parameter menjalankan s, TSSessionID, dan i.

Perintah berikut menampilkan alokasi dari semua kumpulan sesi Layanan Terminal. Dalam contoh ini, komputer lokal, yang dikonfigurasi sebagai Server Terminal, menghosting sesi, dan komputer klien menggunakan fitur Desktop Jauh untuk terhubung ke host.

poolmon /s

Sebagai respons, PoolMon menampilkan alokasi dari semua kumpulan sesi. Perhatikan judul "Semua informasi kumpulan sesi" di header.

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
 ...

Untuk melihat alokasi dari kumpulan sesi tertentu, ketik ID sesi segera setelah parameter /s , seperti yang ditunjukkan pada perintah berikut. Perintah ini menampilkan alokasi kumpulan sesi untuk sesi Layanan Terminal 0.

poolmon /s0

Sebagai respons, PoolMon menampilkan alokasi dari kumpulan sesi untuk sesi Layanan Terminal 0. Perhatikan judul "Informasi Kumpulan Sesi 0" di header.

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
 ...

Untuk membantu menentukan driver dan komponen mana yang mengalokasikan memori dari kumpulan sesi, tambahkan parameter /g , seperti yang ditunjukkan pada perintah berikut. Parameter /g menambahkan kolom Mapped_Driver yang mencantumkan komponen dan driver Windows yang menetapkan setiap 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]

Anda juga dapat mengonfigurasi tampilan kumpulan sesi Layanan Terminal saat PoolMon berjalan. Tabel berikut ini memperlihatkan serangkaian perintah yang sedang berjalan, dalam urutan pengetikannya, dan tampilan PoolMon yang dihasilkan.

Seri dimulai dengan perintah untuk memulai PoolMon. Semua parameter lain ditik saat PoolMon sedang berjalan.

poolmon
Kunci Hasil Deskripsi

s

Menampilkan semua kumpulan sesi.

s

Menampilkan kumpulan sistem.

Parameter s mengalihkan tampilan antara kumpulan sistem dan kumpulan sesi Layanan Terminal.

0

Menampilkan kumpulan sesi 0.

Anda dapat mengetik ID sesi saat menampilkan kumpulan sistem.

7

Menampilkan kumpulan sesi 7.

a

Menampilkan alokasi kumpulan untuk sesi 7, diurutkan menurut jumlah alokasi.

Semua parameter standar yang berjalan dapat digunakan untuk tampilan kumpulan sesi.

0

Menampilkan alokasi untuk sesi 0, diurutkan menurut jumlah alokasi.

Opsi sesi dan pengurutan dipertahankan hingga diubah.

s

Menampilkan kumpulan sistem.

s

Menampilkan alokasi untuk sesi 0, diurutkan menurut jumlah alokasi.

Opsi sesi tetap dipertahankan.

10ENTER

Menampilkan alokasi Sesi 1, lalu menampilkan alokasi Sesi 0.

Tanpa i, Anda hanya dapat memasukkan ID sesi 0 hingga 9.

i

Meminta ID sesi Terminal Server.

10

Menampilkan alokasi Sesi 10.

i

Meminta sebuah ID sesi Server Terminal.

Untuk menampilkan semua kumpulan sesi, tekan i lalu tekan ENTER.

ENTER

Menampilkan semua kumpulan sesi.

Hanya sistem yang dikonfigurasi sebagai Server Terminal yang mengalokasikan memori dari kumpulan sesi. Jika Anda menggunakan PoolMon untuk menampilkan kumpulan sesi di komputer yang bukan Server Terminal, atau jika Anda mengetik ID sesi yang tidak ada di Windows, PoolMon tidak menampilkan alokasi apa pun. Sebaliknya, hanya menampilkan tajuk dengan data memori umum.

Perintah berikut menampilkan alokasi dari semua kumpulan sesi Layanan Terminal:

poolmon /s

Gambar berikut menunjukkan tampilan PoolMon yang akan menghasilkan jika perintah /s dikirimkan ke komputer yang menjalankan Windows XP yang tidak dapat dikonfigurasi sebagai Server Terminal:

 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