First I was running QEMU from Ubuntu 7.10 to try it out, but it crashed the whole QEMU when my problemous code was executed so it wasn't so nice :). Next I went to get newest QEMU from their SVN, compiled it and tested it out. This newest version doesn't crash anymore so I continued my trek.
As there didn't seem to be any good front ends matching my requirements for this case I turned to last resort; gdb text console itself.
I have never liked the gdb text console interface so it took a bit time to remember (and google) how it works.
To start QEMU I used following command:
qemu -cdrom grub2.iso -s -S
And then in GDB:
target remote localhost:1234
; as we start in 16bit real mode
set arch i8086
; set breakpoint in entry point, at begining of GRUB2's CD-ROM boot sector code.
break *0x7c00
Then I just entered 'c' to start execution until it hit the break point.
After that it said:
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000 in ?? ()
This message was a bit confusing and QEMU manual provide a bit advice in here.
To see where I really was I had to use following command:
x/10i $cs*16+$eip
And there was the boot sector code.
Now in order to step one instruction forward there is stepi command in gdb. However it seems that I first have to delete previous breakpoint:
; to see list of breakpoints
info b
; and to delete one I just set
delete 1
After this stepi worked fine.
Now I just need to figure out a bit more user friendlier way to debug :|