xref: /openbmc/qemu/docs/system/gdb.rst (revision ed5abf46)
1.. _gdb_005fusage:
2
3GDB usage
4---------
5
6QEMU has a primitive support to work with gdb, so that you can do
7'Ctrl-C' while the virtual machine is running and inspect its state.
8
9In order to use gdb, launch QEMU with the '-s' option. It will wait for
10a gdb connection:
11
12.. parsed-literal::
13
14   |qemu_system| -s -kernel bzImage -hda rootdisk.img -append "root=/dev/hda"
15   Connected to host network interface: tun0
16   Waiting gdb connection on port 1234
17
18Then launch gdb on the 'vmlinux' executable::
19
20   > gdb vmlinux
21
22In gdb, connect to QEMU::
23
24   (gdb) target remote localhost:1234
25
26Then you can use gdb normally. For example, type 'c' to launch the
27kernel::
28
29   (gdb) c
30
31Here are some useful tips in order to use gdb on system code:
32
331. Use ``info reg`` to display all the CPU registers.
34
352. Use ``x/10i $eip`` to display the code at the PC position.
36
373. Use ``set architecture i8086`` to dump 16 bit code. Then use
38   ``x/10i $cs*16+$eip`` to dump the code at the PC position.
39
40Advanced debugging options:
41
42The default single stepping behavior is step with the IRQs and timer
43service routines off. It is set this way because when gdb executes a
44single step it expects to advance beyond the current instruction. With
45the IRQs and timer service routines on, a single step might jump into
46the one of the interrupt or exception vectors instead of executing the
47current instruction. This means you may hit the same breakpoint a number
48of times before executing the instruction gdb wants to have executed.
49Because there are rare circumstances where you want to single step into
50an interrupt vector the behavior can be controlled from GDB. There are
51three commands you can query and set the single step behavior:
52
53``maintenance packet qqemu.sstepbits``
54   This will display the MASK bits used to control the single stepping
55   IE:
56
57   ::
58
59      (gdb) maintenance packet qqemu.sstepbits
60      sending: "qqemu.sstepbits"
61      received: "ENABLE=1,NOIRQ=2,NOTIMER=4"
62
63``maintenance packet qqemu.sstep``
64   This will display the current value of the mask used when single
65   stepping IE:
66
67   ::
68
69      (gdb) maintenance packet qqemu.sstep
70      sending: "qqemu.sstep"
71      received: "0x7"
72
73``maintenance packet Qqemu.sstep=HEX_VALUE``
74   This will change the single step mask, so if wanted to enable IRQs on
75   the single step, but not timers, you would use:
76
77   ::
78
79      (gdb) maintenance packet Qqemu.sstep=0x5
80      sending: "qemu.sstep=0x5"
81      received: "OK"
82