Prendere il controllo di Windbg

Come parecchi altri colleghi al CSS, mi capita di passare parecchio tempo lavorando con il debugger che nel mio caso è Windbg. A me piacciono particolarmente gli shortcut da tastiera, mi infastidisce dover staccare continuamente la mano dalla tastiera per un click, tornare alla tastiera, poi ancora al mouse ecc… (un collega di tanto in tanto si diverte a rubarmelo per vedere per quanto tempo riesco a lavorare senza) e per questo sono sempre alla ricerca di productivity tips per velocizzare e facilitare l’uso dei programmi più  comuni. Windbg ha alcuni di questi shortcut, ecco quelli che uso normalmente.

Automatizzare l’avvio di Windbg

Il primo passo è costituito da un file .reg attraverso il quale è possibile associare l’estensione .dmp (normalmente usata per i file di dump) a Windbg ed aggiungere alcune opzioni al menu del tasto destro del mouse; dal momento che sul mio pc ho sia la versione a 32 che 64 bit dei Debugging Tools for Windows, cliccando con il tasto destro del mouse su un file di dump posso scegliere di aprirlo direttamente nella versione di Windbg che m’interessa:

 Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.dmp]
@="Debugger.Dump"
[HKEY_CLASSES_ROOT\Debugger.Dump\DefaultIcon]
@="c:\\debuggers x86\\cdb.exe"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_1_1_x86]
@="Debug This Dump for .NET 1.1 x86"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_1_1_x86\Command]
@="\"C:\\debuggers x86\\windbg\" -z \"%1\" -c \"$<c:\\debuggers x86\\commands_1.txt\""

[HKEY_CLASSES_ROOT\.dmp]
@="Debugger.Dump"
[HKEY_CLASSES_ROOT\Debugger.Dump\DefaultIcon]
@="c:\\debuggers x86\\cdb.exe"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_2_0_x86]
@="Debug This Dump for .NET 2.0 x86"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_2_0_x86\Command]
@="\"C:\\debuggers x86\\windbg\" -z \"%1\" -c \"$<c:\\debuggers x86\\commands_2.txt\""

[HKEY_CLASSES_ROOT\.dmp]
@="Debugger.Dump"
[HKEY_CLASSES_ROOT\Debugger.Dump\DefaultIcon]
@="c:\\debuggers x64\\cdb.exe"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_2_0_x64]
@="Debug This Dump for .NET 2.0 x64"
[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_2_0_x64\Command]
@="\"C:\\debuggers x64\\windbg\" -z \"%1\" -c \"$<c:\\debuggers x64\\commands_2.txt\""

right click menu

In ogni “blocco” l’estensione .dmp viene associata all’icona di cdb.exe, viene creata una descrizione per aggiungere il nuovo comando al menu del tasto destro del mouse e lanciando Windbg vengono passati alcuni parametri alla riga di comando per indicare quale file aprire (-z) e lo script da eseguire all’avvio (-c).

Lo script che eseguo all’avvio di Windbg è in realtà un semplice file di testo che contiene alcuni comandi che normalmente eseguirei all’apertura di ogni dump ad esempio per impostare il symbol path, caricare alcune estensioni per Windbg che uso di frequente ed aprire un file di log nel quale salvare automaticamente tutti i comandi ed i loro output da tenere come riferimento successivo, così da poterlo riutilizzare in seguito se dovessi avere bisogno di rivedere qualcosa senza dover riaprire Windbg ed il dump:

 .sympath SRV*c:\symbols*\\internalshare\symbols*http://msdl.microsoft.com/download/symbols
.load extension1
.load extension2
.load extension3
.logopen /d /t
.reload

Le opzioni /d e /t passate al comando . logopen fanno si che il file di log generato rispecchi il nome del file di dump aggiungendo la data ed ora di apertura del dump stesso in Windbg, in questo modo aprendo più volte lo stesso dump si avrà un log per ogni sessione. A proposito dell’ordine con il quale vengono caricate le estensioni per Windbg, è possibile verificarlo usando il comando .chain: se dovete usare un comando contenuto in più estensioni, quello effettivamente eseguito sarà il comando contenuto nell’ultima estensione caricata.

Help online

Se vi serve aiuto riguardo una particolare estensione per Windbg è possibile usare il comando !<estensione>.help per visualizzare una lista dei comandi contenuti in quell’estensione, mentre se abbiamo bisogno di maggiori dettagli circa uno specifico comando possiamo usare la forma !<estensione>.help <comando> :

 0:000> !sos.help dumpobj
-------------------------------------------------------------------------------
!DumpObj [-v] [-short] [-r 2] <object address>

This command allows you to examine the fields of an object, as well as learn 
important properties of the object such as the EEClass, the MethodTable, and 
the size.

Digitare i comandi

Come ho già detto, a me infastidisce veramente parecchio dover continuamente spostare la mano dalla tastiera e viceversa e sono quindi sempre alla ricerca di nuove scorciatoie da tastiera. Da questo punto di vista ci sono un paio di dettagli di Windbg che mi piacciono: se abbiamo già selezionato del testo all’interno della finestra di output dei comandi, un semplice click con il tasto destro del mouse (ammesso che si abbia già la mano sul mouse! Sarcastic) lo copierà negli Appunti, mentre se non si ha selezionato alcun testo ma lo si è già copiato negli Appunti (magari da un’altra applicazione) un semplice click con il tasto destro lo incollerà direttamente nella casella di testo nella quale si digitano i comandi da eseguire. Inoltre, supponiamo di avere per qualche motivo posizionato il cursore nella parte riservata all’output dei comandi (magare per selezionare del testo con il mouse): è possibile cominciare a digitare il nuovo comando che vogliamo eseguire senza prima preoccuparci di riportare il cursore nella casella di testo relativa, Windbg lo fa automaticamente per noi e senza perdere una lettera di quello che stavamo digitando Smile). Lo so, sono tutte piccolezze, “ma è così che tutto ha sempre inizio, dall’infinitamente piccolo” (cit. Grosso guaio a Chinatown Wink).

Condividere o connettersi ad una sessione di debugging

Può capitare di avere bisogno di aiuto nell’analisi di un dump (o che qualcuno chieda il vostro aiuto), ma cosa potete fare se siete in ufficio distanti (o addirittura se fate parte di un team sparso per mezza Europa come nel mio caso)? Fortunatamente Windbg permette di condividere la propria sessione di debugging usando il comando .server:

 0:000> .server tcp:port=1234
Server started.  Client can connect with any of these command lines
0: <debugger> -remote tcp:Port=1234,Server=<computername> 

Il comando qui sopra condivide la sessione tramite protocollo TPC e sulla porta 1234: la stringa evidenziata in rosso è quella che potete spedire alla vostra controparte per permettergli di connettersi.

Nel “client” (ovviamente sempre un’altra istanza di Windbg) potete andare dal menu File > Connect to remote session (o più semplicemente premere la combinazione CTRL+R Nerd) ed usare il pulsante browse per trovare il “server” Windbg che v’interessa o digitare (incollare) la stringa di connessione evidenziata in rosso; l’aspetto interessante di questa modalità di connessione è che entrambi i componenti possono sia digitare comandi che vedere l’output dei comandi eseguiti dalla controparte, è un ottimo modo per lavorare insieme ad un dump ed imparare “sul campo” da colleghi più esperti.

connect to remote debugging session

Durante la connessione è possibile usare il comando .clients per avere una lista dei client connessi al server, o il comando .echo per inviare un messaggio agli altri Windbg connessi.

Migliorare la leggibilità dell’output

L’analisi di un dump più richiedere parecchio tempo e svariate decine di comandi con output più o meno lunghi e complessi: in questo caso può essere utile personalizzare il font ed i colori utilizzati nella finestra di output attraverso il menu Edit > Options

windbg workspace options

 

Carlo Cardella

Senior Support Engineer

EMEA IIS and Web Developer Support