Windows Server 2008 R2 & Windows 7 - Monitoring Desktop Heap

DheapMon, il tool per monitorare il desktop Heap in Windows, funziona fino a Windows Vista.
In Windows 7 dovremo ricorrere ad una sessione di Live Debugging, usando LiveKD della SysInternals.

Tool Necessari

Programma

Download link

LiveKD.Exe http://technet.microsoft.com/en-us/sysinternals/bb897415
Windbg x86 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi
Windbg x64 http://msdl.microsoft.com/download/symbols/debuggers/dbg_amd64_6.11.1.404.msi

Installiamo Windbg in “c:\debuggers”, e poi estraiamo livekd nella stessa cartella.

Simboli di debug

Come per il tool servono i simboli di Win32k.sys, e in più, i simboli del Kernel, nt*.exe, che potrebbe essere ntoskrnl.exe o Ntkrnlpa.exe, a seconda del kernel presente. Trovate i file sotto “C:\Windows\System32”. Dobbiamo scaricare i simboli per quei due file.
Procediamo così:

Creiamo una cartella temporanea dove copiare i file, “c:\temp\dheap” ad esempio.

Creiamo una cartella dove andranno a finire i simboli una volta scaricati, “c:\symbols” ad esempio.

Apriamo un Command Prompt e ci portiamo in ”c:\debuggers” o dove abbiamo installato Windbg.

Usiamo il tool Symchk per scaricare i simboli. Se le assunzioni sono corrette, questa sarà la linea di comando da usare:

Symchk "C:\TEMP\Dheap" /s “SRV*c:\symbols*http://msdl.microsoft.com/download/symbols”

Dovremmo trovare I simboli nella cartella “c:\symbols” dopo il completamento dell’operazione che può richiedere qualche minuto via internet.

NOTA: l’operazione potrebbe non funzionare se abbiamo installato qualche hotfix particolare per la quale non sono disponibili i simboli pubblici. In questo caso occorre aprire un caso col Supporto Tecnico e noi vi forniremo i simboli corretti, se possibile.

Variabili d’ambiente e LiveKd

LiveKd ha bisogno di utilizzare i simboli di debug, e per farlo sfrutta il metodo tradizionale della variabile d’ambiente _NT_SYMBOL_PATH.

Siccome le variabili d’ambiente impostate con li comando SET sono locali al Command Prompt nel quale vengono impostate, a questo punto andremo ad aprire un Command Prompt “as Administrator” e d’ora in avanti useremo sempre questo per le nostre operazioni.

Da questo punto in poi, in tre passi avremo le informazioni che ci interessano

1. Impostiamo la variabile d’ambiente

Apriamo un Command Prompt “as Administrator” e digitiamo il seguente comando:

set _NT_SYMBOL_PATH=e:\symbols;srv*e:\symbols*http://msdl.microsoft.com/download/symbols;

2. Avviamo LiveKD
Sempre al prompt dei comandi digitiamo:
Livekd
Se tutto è andato bene, arriveremo al prompt dei comandi del KD (Kernel Debugger):

C:\debuggers64>livekd
LiveKd v5.0 - Execute kd/windbg on a live system
Sysinternals - www.sysinternals.com
Copyright (C) 2000-2010 Mark Russinovich and Ken Johnson
Launching C:\debuggers64\kd.exe:
Microsoft (R) Windows Debugger Version 6.13.0007.1090 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
***** WARNING: Your debugger is probably out-of-date.
***** Check http://dbg for updates.
Loading Dump File [C:\Windows\livekd.dmp]
Kernel Complete Dump File: Full address space is available
Comment: 'LiveKD live system view'
Symbol search path is: e:\symbols;srv*e:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 7 Kernel Version 7601 (Service Pack 1) MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 7601.17592.amd64fre.win7sp1_gdr.110408-1631
Machine Name:
Kernel base = 0xfffff800`02855000 PsLoadedModuleList = 0xfffff800`02a9a650
Debug session time: Sun Feb 13 04:34:57.897 17420 (UTC + 2:00)
System Uptime: 10 days 20:34:41.309
Loading Kernel Symbols
...............................................................
...............................................................
.......................
Loading User Symbols
Loading unloaded module list
...........
0: kd>

3. Usiamo il comando !dskheap

Per ottenere le informazioni che ci servono, digitiamo !dskheap con i parametri –v se ci interessa un output “verbose” molto detttagliato, o –sn per il contenuto del desktop heap della sessione n.

Di solito ci interessa la sessione 0, per cui digitiamo li comando: !dskheap -s0

0: kd> !dskheap –s0

  Winstation\Desktop Heap Size(KB) Used Rate(%)

------------------------------------------------------------

  WinSta0\Default 20480 0%

  WinSta0\Disconnect 96 4%

  WinSta0\Winlogon 192 2%

  Service-0x0-3e7$\Default 768 3%

  Service-0x0-3e4$\Default 768 1%

  Service-0x0-3e5$\Default 768 0%

  msswindowstation\mssrestricteddesk 768 0%

------------------------------------------------------------

                Total Desktop: ( 23840 KB - 7 desktops)

                Session ID: 0

============================================================

0: kd> !dskheap –s1

  Winstation\Desktop Heap Size(KB) Used Rate(%)

------------------------------------------------------------

  WinSta0\Default 20480 0%

  WinSta0\Disconnect 96 4%

  WinSta0\Winlogon 192 8%

------------------------------------------------------------

                Total Desktop: ( 20768 KB - 3 desktops)

                Session ID: 1

============================================================

0: kd> !dskheap –s2

  Winstation\Desktop Heap Size(KB) Used Rate(%)

------------------------------------------------------------

  WinSta0\Default 20480 3%

  WinSta0\Disconnect 96 4%

  WinSta0\Winlogon 192 3%

------------------------------------------------------------

                Total Desktop: ( 20768 KB - 3 desktops)

                Session ID: 2

============================================================

In modalità Verbose

0: kd> !dskheap -v -s0

  Winstation @fffffa800610bf60: (WinSta0) SessionID: 0

  Desktop @fffffa8006100990: (Default)

 

  Desktop Heap Size: 20971520 (0x 1400000) Bytes

  Committed: 16384 (0x 4000) Bytes

  UnCommitted: 20955136 (0x 13fc000) Bytes

  Allocated: 8736 (0x 2220) Bytes

  Total Freed 7648 (0x 1de0) Bytes

  Unused: 20962784 (0x 13fdde0) Bytes

  Used Rate: ( 0)%

------------------------------------------------------

 

  Winstation @fffffa800610bf60: (WinSta0) SessionID: 0

  Desktop @fffffa8005d40f20: (Disconnect)

 

  Desktop Heap Size: 98304 (0x 18000) Bytes

  Committed: 8192 (0x 2000) Bytes

  UnCommitted: 90112 (0x 16000) Bytes

  Allocated: 4576 (0x 11e0) Bytes

  Total Freed 3616 (0x e20) Bytes

  Unused: 93728 (0x 16e20) Bytes

  Used Rate: ( 4)%

------------------------------------------------------

 

  Winstation @fffffa800610bf60: (WinSta0) SessionID: 0

  Desktop @fffffa80060edf20: (Winlogon)

 

  Desktop Heap Size: 196608 (0x 30000) Bytes

  Committed: 28672 (0x 7000) Bytes

  UnCommitted: 167936 (0x 29000) Bytes

  Allocated: 4576 (0x 11e0) Bytes

  Total Freed 24096 (0x 5e20) Bytes

  Unused: 192032 (0x 2ee20) Bytes

  Used Rate: ( 2)%

------------------------------------------------------

 

  Winstation @fffffa80060b7560: (Service-0x0-3e7$) SessionID: 0

  Desktop @fffffa8005d3e400: (Default)

 

  Desktop Heap Size: 786432 (0x c0000) Bytes

  Committed: 53248 (0x d000) Bytes

  UnCommitted: 733184 (0x b3000) Bytes

  Allocated: 26144 (0x 6620) Bytes

  Total Freed 27104 (0x 69e0) Bytes

  Unused: 760288 (0x b99e0) Bytes

  Used Rate: ( 3)%

------------------------------------------------------

  Winstation @fffffa8006581ad0: (Service-0x0-3e4$) SessionID: 0

  Desktop @fffffa8006581960: (Default)

 

  Desktop Heap Size: 786432 (0x c0000) Bytes

  Committed: 20480 (0x 5000) Bytes

  UnCommitted: 765952 (0x bb000) Bytes

  Allocated: 11424 (0x 2ca0) Bytes

  Total Freed 9056 (0x 2360) Bytes

  Unused: 775008 (0x bd360) Bytes

  Used Rate: ( 1)%

------------------------------------------------------

 

  Winstation @fffffa8006719090: (Service-0x0-3e5$) SessionID: 0

  Desktop @fffffa80067193f0: (Default)

 

  Desktop Heap Size: 786432 (0x c0000) Bytes

  Committed: 20480 (0x 5000) Bytes

  UnCommitted: 765952 (0x bb000) Bytes

  Allocated: 6800 (0x 1a90) Bytes

  Total Freed 13680 (0x 3570) Bytes

  Unused: 779632 (0x be570) Bytes

  Used Rate: ( 0)%

------------------------------------------------------

 

  Winstation @fffffa800754a760: (msswindowstation) SessionID: 0

  Desktop @fffffa80070cab70: (mssrestricteddesk)

 

  Desktop Heap Size: 786432 (0x c0000) Bytes

  Committed: 8192 (0x 2000) Bytes

  UnCommitted: 778240 (0x be000) Bytes

  Allocated: 4256 (0x 10a0) Bytes

  Total Freed 3936 (0x f60) Bytes

  Unused: 782176 (0x bef60) Bytes

  Used Rate: ( 0)%

------------------------------------------------------

============================================================

Per terminare, digitiamo “q” nel KD e “n” alla successiva richiesta di riavvio :

0: kd> q
quit:

Execute Kd again? (y/n) n
Exiting LiveKd.

C:\debuggers64>

E questo è tutto.

Non è detto che verrà mai rilasciato il DHEAPMON per Windows 7 e 2008 R2, in quanto questi sistemi hanno limiti molto più elevati dei precedenti, ed effettivamente non mi è ancora capitato un caso di problemi di desktop heap su questa versione del kernel.

Nel caso foste i primi, in questo modo potete controllare il Desktop Heap.

Buona giornata, alla prossima!

Mario Raccagni
Senior Support Engineer
Microsoft Enterprise Platform Support