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…