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

    Comments (1)

    Skip to main content