Remote debugging using qemu + gdb for dummies…

28 08 2007

Debuggare un kernel fatto in casa e` un’operazione molto piu` semplice di quello che si possa immaginare.
Ovviamente e` impossibile effettuare un debug preciso – che non sia una serie di routine di verbosity o debug usando le #ifdef – senza l’ausilio di un emulatore, questo perche` non vi e` la presenza di un sistema operativo che permetta l’esecuzione del debugger stesso, quindi avremmo grosse difficolta` a vedere lo stato dei registri in un dato momento.
Un emulatore abbastanza usato per lo sviluppo di OS artigianali e` proprio Qemu, che ha il vantaggio di essere molto intuitivo con delle funzionalita` relativamente avanzate.
Fra le varie features ce n’e` una fondamentale per il nostro scopo, ovvero il listening su una determinata porta – che di default e` la 1234 – attivabile tramite lo switch -s.
Oltre l’attivazione dello switch -s in qemu, abbiamo la necessita` di compilare il nostro kernel con l’opzione -g
da man page di gcc:

-g  Produce debugging information ...

In questo caso non facciamo altro che attivare l’opzione con cui gcc produrra` le informazioni di debug all’interno della kernel image stessa (rendendola un tantino piu` grande).
Occhio quindi nel Makefile ad includere l’opzione -g
Qemu verra` quindi avviato cosi:

[init@underground]:~$ qemu -s -S <harddrive.img>

Dalla man page di qemu:

-s  Wait gdb connection to port 1234.

In questo modo non ci resta che lanciare gdb da remoto o da locale

[init@underground]:~$ gdb

(gdb) target remote localhost:1234

Come ultima operazione bisogna importare le informazioni di debug in questo modo dalla console di gdb:

(gdb) symbol-file kernel.elf

adesso sono disponibili anche i simboli di debug.
Dopo di che avete a disposizione tutta la potenza di gdb per effettuare i vostri debug.
That’s all folks…


Azioni

Informazione

Lascia un commento