Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Windows Debug del kernel di windows

Debug del kernel di windows

E-mail Stampa PDF
Indice Articolo
Debug del kernel di windows
Uso del kernel debugger
Tutte le pagine

Installazione e prima configurazione del kernel debugger

Non sto qua a spiegarvi l'utilità per cui è importante eseguire un debug in modalità kernel, ma a molti sarà capitato di voler iniziare a esplorare questo mondo e imbattersi in alcuni problemi. Infatti molti siti, articoli fanno riferimento ad software sviluppati da terzi, come ad esempio Softice, che non sono stati più portati avanti e quindi risulta veramente difficile farli funzionare. D'altra parte la Microsoft ha un suo debbuger, magari non con una grafica accativante, magari un po complicato con centinaia di comandi, ma ben mantenuto e quindi sempre aggiornato.

Il pacchetto offerto dalla microsoft, scaricabile direttamente dal suo sito, comprende diversi tool, che comprendono sia applicazioni in modalità console, sia in modalità windows. Quello a cui, per brevità, faremo riferimento è il windows debugger (Windbg.exe) e nonostante vi siano tanti modi per eseguire lo stesso debug, esporremo solo alcuni di essi, perché altrimenti risulterebbe abbastanza dispersivo.

Quindi dopo aver scaricato la suite "Debugging Tools for Windows" nella versione a 32 o 64-bit , a seconda delle vostre esigenze, procedete con l'installazione. Vi ricordo che sia per installare che per usare il kernel debugger è necessario avere i privilegi di amministratore.

Il debugger installato, mi riferisco sempre a Windbg, può funzione in user mode che in kernel mode, ma per entrambi sarà necessario installare i simboli, a cui il debugger farà riferimento durante la sua esecuzione (vedi articolo sui symbol files). Potete provare a scaricarvi la versione esatta dei simboli che vi occorrono sempre dal sito della Microsoft, ma sinceramente molte persone hanno incontrato problemi nella configurazione del debugger, quindi il consiglio che vi do è quello di usare quelli disponibili online dal sito della microsoft.

Quindi andate nel menù File e clikkate su Symbol File Path:

Dopo di che inserite la seguente stringa:

SRV*C:\websymbols*http://msdl.microsoft.com/download/symbols

Questa frase indica la cartella nel vostro hard disk "C:\websymbols" come deposito locale dei symboli  recuperati dal sito della microsoft.

Ora se lanciate l'esecuzione di una applicazione sempre dal menù file, vedrete che i simboli verranno scaricati e utilizzati correttamente.

Ora passiamo alla modalità kernel, e tanto per essere chiari, vediamo di spiegare in poche parole di cosa si tratta. Un normale debugger funziona in user mode, il che limita il monitoraggio e la modifica della memoria virtuale del programma a quella assegnata dal sistema operativo. Per maggiori dettagli su cosa sia la memoria virtuale di un processo vi consigli di leggervi il relativo articolo presente su questo sito, cmomunque possiamo dire ache ad ogni processo viene assegnato uno spazio di memoria diviso in 2 parti; la prima di esse la può utilizzare come vuole, la seconda è usata dal sistema operativo (kernel). Ora nella prima parte il processo scrive e legge le sue variabili, ma gli è proibito l'uso della memoria usata dal kernel. Per poterci accedere avremo bisogno di un debugger, o una sua parte, lavori in kernel mode., ed è proprio questo che vorremo fare usando Windbg in modalità kernel.

Se dovessimo sintetizzare il concetto potremo affermare che mentre un debugger normale esegue il debug di un programma che è eseguito in un sistema operativo, un debugger in kernel mode esegue un debug del sitema operativo che sta ospitando il programma!

Ora ci sono tanti modi per usare questo tipo di debug:

  1. collegarsi in locale:
    sebbene sia il modo più banale ve lo sconsiglio perché molte delle funzionalità sono limitate, tipo breakpoint etc..
  2. collegarsi con un cavo usb,firewire, o più comunemente un cavo seriale al pc da debuggare:
    questa è la scelta più consigliata se volete fare un debug della macchina efficiente.
  3. collegarsi ad una macchina virtuale:
    questa non è la scelta più professionale e neanche più efficiente, ma non sarete costretti a procurarvi cavi o ad usare 2 pc.

Io in questo articolo vi consiglio per semplicità di usare il terzo metodo che è il più veloce e pratico.

Per prima cosa occorre creare una macchina virtuale, e per fare ciò vi sono diversi software come VirtualBox, VMwareVirtualPC e altri...

Ora non li ho testati tutti con il debugger, ma penso che siano equivalenti. Quindi per semplicità useremo quello della microsoft. Negli esempi successivi useremo un pc locale con Xp ed una macchina virtuale sempre con Xp. La macchina virtuale che userò è il Virtual PC 2007, ma credo sia già stato rimpiazzato dalla versione RC. Ad ogni modo qualsiasi cosa usiate i concetti rimangono validi.

Scaricate e installate la macchina virtuale, il suo sistema operativo e così via..

ora dobbiamo scegliere come collegarci ad essa, considerando che probabilemente nel pc locale manco ce la avete una porta seriale (COM):

  1. Usare delle porte COM virtuali
  2. Usare un "named pipe"

Connessione con delle porte COM virtuali

Per fare questo dovrete scaricarvi il software necessario ( io consiglio com0com che è gratuito e semplice da usare).
Una volta scaricato e installato vi ritroverete 2 porte COM collegate tra loro. Per verificarlo avviate 2 HyperTerminal e connettevi ad entrambe le porte; se tutto funziona bene vedrete che quello che scrivete in un terminale appare nell'altro e viceversa.

Se volete potrete anche cambiare nome alle porte dal Setup Command Prompt di com0com:

change CNCA0 portname=COM11
change CNCB0 portname=COM12

e alla fine avrete una configurazone del genere:

Ora il debug del kernel lo collego alla porta COM11 e rimarrà in attesa di dati su di essa

Ora passiamo alla macchina virtuale, essa dovrà avere una porta COM mappata sulla porta COM12 del pc che la ospita:

Il sistema operativo all'interno della macchina virtuale, al momento del boot iniziale, dovrà essere impostato in modalità debug e connettersi alla porta COM2, che altro non è che la porta COM12 del pc locale, la quale a sua volta è virtualmente collegata alla porta COM11 sulla quale è in attesa il debugger. A tal fine modifichiamo il boot.ini aggiungendo una riga al suo interno, così da introdurre una scelta multipla all'avvio:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP dbg COM2" /fastdetect /debug /debugport=com2 /baud=115000

Al boot vedrete più o meno questo:

Se tutto è andato per il verso giusto il debugger, la prima volta, impiegherà un po di tempo per scaricarsi i simboli per la macchina che sta debuggando e poi potrete iniziare ad usarlo.

Connessione con una named pipe

Il metodo esposto in precedenza dovrebbe essere valido per tutti i tipi di macchine virtuali, ma uno ancora più veloce perché non richiede l'uso di software esterni è quello di ricorrede a un così detto named pipe. La differenza è che nella finestra di collegamento del debugger dovrete inserire il nome del pipe scelto, nel mio caso "\\.\pipe\compipe":

Per informazione se volete usare il kernel debugger in versione console (kd.exe) compreso nei tools che avete scaricato la riga di comando da usare sarà:

kd -k com:port=\\.\pipe\pipe name,pipe,resets=0,reconnect

Continuando lo stesso nome, che avete inserito come porta seriale nel debugger, lo dovrete inserire anche nella configurazione della macchina virtuale:

In questo modo abbiamo collegato la porta COM1 del pc virtuale al pipe del pc locale su cui era in ascolto il debugger.

Come nel caso precedente ora dovremo modificare il boot e inviare l'output del debug verso la porta COM prescelta, in questo caso sarà la porta COM1, quinid inserendo una riga nel boot.ini avremo:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP dbg COM1" /fastdetect /debug /debugport=com1

Ora se abbiamo avviato il kernel debugger sul pipe, come spiegato prima, e riavviamo la macchina virtuale, selezionando al boot la modalità di debug, vedremo che sul windbg inizieranno a comparire dei dati sul debug del pc virtuale.



Ultimo aggiornamento ( Martedì 13 Ottobre 2009 09:23 )