6 QEMU supports working with gdb via gdb's remote-connection facility
7 (the "gdbstub"). This allows you to debug guest code in the same
8 way that you might with a low-level debug facility like JTAG
9 on real hardware. You can stop and start the virtual machine,
10 examine state like registers and memory, and set breakpoints and
13 In order to use gdb, launch QEMU with the ``-s`` and ``-S`` options.
14 The ``-s`` option will make QEMU listen for an incoming connection
15 from gdb on TCP port 1234, and ``-S`` will make QEMU not start the
16 guest until you tell it to from gdb. (If you want to specify which
17 TCP port to use or to use something other than TCP for the gdbstub
18 connection, use the ``-gdb dev`` option instead of ``-s``. See
19 `Using unix sockets`_ for an example.)
23 |qemu_system| -s -S -kernel bzImage -hda rootdisk.img -append "root=/dev/hda"
25 QEMU will launch but will silently wait for gdb to connect.
27 Then launch gdb on the 'vmlinux' executable::
31 In gdb, connect to QEMU::
33 (gdb) target remote localhost:1234
35 Then you can use gdb normally. For example, type 'c' to launch the
40 Here are some useful tips in order to use gdb on system code:
42 1. Use ``info reg`` to display all the CPU registers.
44 2. Use ``x/10i $eip`` to display the code at the PC position.
46 3. Use ``set architecture i8086`` to dump 16 bit code. Then use
47 ``x/10i $cs*16+$eip`` to dump the code at the PC position.
49 Breakpoint and Watchpoint support
50 =================================
52 While GDB can always fall back to inserting breakpoints into memory
53 (if writable) other features are very much dependent on support of the
54 accelerator. For TCG system emulation we advertise an infinite number
55 of hardware assisted breakpoints and watchpoints. For other
56 accelerators it will depend on if support has been added (see
57 supports_guest_debug and related hooks in AccelOpsClass).
59 As TCG cannot track all memory accesses in user-mode there is no
60 support for watchpoints.
65 On modern kernels confusion can be caused by code being relocated by
66 features such as address space layout randomisation. To avoid
67 confusion when debugging such things you either need to update gdb's
68 view of where things are in memory or perhaps more trivially disable
69 ASLR when booting the system.
71 Debugging multicore machines
72 ============================
74 GDB's abstraction for debugging targets with multiple possible
75 parallel flows of execution is a two layer one: it supports multiple
76 "inferiors", each of which can have multiple "threads". When the QEMU
77 machine has more than one CPU, QEMU exposes each CPU cluster as a
78 separate "inferior", where each CPU within the cluster is a separate
79 "thread". Most QEMU machine types have identical CPUs, so there is a
80 single cluster which has all the CPUs in it. A few machine types are
81 heterogeneous and have multiple clusters: for example the ``sifive_u``
82 machine has a cluster with one E51 core and a second cluster with four
83 U54 cores. Here the E51 is the only thread in the first inferior, and
84 the U54 cores are all threads in the second inferior.
86 When you connect gdb to the gdbstub, it will automatically
87 connect to the first inferior; you can display the CPUs in this
88 cluster using the gdb ``info thread`` command, and switch between
89 them using gdb's usual thread-management commands.
91 For multi-cluster machines, unfortunately gdb does not by default
92 handle multiple inferiors, and so you have to explicitly connect
93 to them. First, you must connect with the ``extended-remote``
94 protocol, not ``remote``::
96 (gdb) target extended-remote localhost:1234
98 Once connected, gdb will have a single inferior, for the
99 first cluster. You need to create inferiors for the other
100 clusters and attach to them, like this::
105 [Switching to inferior 2 [<null>] (<noexec>)]
107 Attaching to process 2
108 warning: No executable has been specified and target does not support
109 determining executable automatically. Try using the "file" command.
112 Once you've done this, ``info threads`` will show CPUs in
113 all the clusters you have attached to::
117 1.1 Thread 1.1 (cortex-m33-arm-cpu cpu [running]) 0x00000000 in ?? ()
118 * 2.1 Thread 2.2 (cortex-m33-arm-cpu cpu [halted ]) 0x00000000 in ?? ()
120 You probably also want to set gdb to ``schedule-multiple`` mode,
121 so that when you tell gdb to ``continue`` it resumes all CPUs,
122 not just those in the cluster you are currently working on::
124 (gdb) set schedule-multiple on
129 An alternate method for connecting gdb to the QEMU gdbstub is to use
130 a unix socket (if supported by your operating system). This is useful when
131 running several tests in parallel, or if you do not have a known free TCP
132 port (e.g. when running automated tests).
134 First create a chardev with the appropriate options, then
135 instruct the gdbserver to use that device:
139 |qemu_system| -chardev socket,path=/tmp/gdb-socket,server=on,wait=off,id=gdb0 -gdb chardev:gdb0 -S ...
141 Start gdb as before, but this time connect using the path to
144 (gdb) target remote /tmp/gdb-socket
146 Note that to use a unix socket for the connection you will need
147 gdb version 9.0 or newer.
149 Advanced debugging options
150 ==========================
152 Changing single-stepping behaviour
153 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
155 The default single stepping behavior is step with the IRQs and timer
156 service routines off. It is set this way because when gdb executes a
157 single step it expects to advance beyond the current instruction. With
158 the IRQs and timer service routines on, a single step might jump into
159 the one of the interrupt or exception vectors instead of executing the
160 current instruction. This means you may hit the same breakpoint a number
161 of times before executing the instruction gdb wants to have executed.
162 Because there are rare circumstances where you want to single step into
163 an interrupt vector the behavior can be controlled from GDB. There are
164 three commands you can query and set the single step behavior:
166 ``maintenance packet qqemu.sstepbits``
167 This will display the MASK bits used to control the single stepping
172 (gdb) maintenance packet qqemu.sstepbits
173 sending: "qqemu.sstepbits"
174 received: "ENABLE=1,NOIRQ=2,NOTIMER=4"
176 ``maintenance packet qqemu.sstep``
177 This will display the current value of the mask used when single
182 (gdb) maintenance packet qqemu.sstep
183 sending: "qqemu.sstep"
186 ``maintenance packet Qqemu.sstep=HEX_VALUE``
187 This will change the single step mask, so if wanted to enable IRQs on
188 the single step, but not timers, you would use:
192 (gdb) maintenance packet Qqemu.sstep=0x5
193 sending: "qemu.sstep=0x5"
196 Examining physical memory
197 ^^^^^^^^^^^^^^^^^^^^^^^^^
199 Another feature that QEMU gdbstub provides is to toggle the memory GDB
200 works with, by default GDB will show the current process memory respecting
201 the virtual address translation.
203 If you want to examine/change the physical memory you can set the gdbstub
204 to work with the physical memory rather with the virtual one.
206 The memory mode can be checked by sending the following command:
208 ``maintenance packet qqemu.PhyMemMode``
209 This will return either 0 or 1, 1 indicates you are currently in the
210 physical memory mode.
212 ``maintenance packet Qqemu.PhyMemMode:1``
213 This will change the memory mode to physical memory.
215 ``maintenance packet Qqemu.PhyMemMode:0``
216 This will change it back to normal memory mode.
218 Security considerations
219 =======================
221 Connecting to the GDB socket allows running arbitrary code inside the guest;
222 in case of the TCG emulation, which is not considered a security boundary, this
223 also means running arbitrary code on the host. Additionally, when debugging
224 qemu-user, it allows directly downloading any file readable by QEMU from the
227 The GDB socket is not protected by authentication, authorization or encryption.
228 It is therefore a responsibility of the user to make sure that only authorized
229 clients can connect to it, e.g., by using a unix socket with proper
230 permissions, or by opening a TCP socket only on interfaces that are not
231 reachable by potential attackers.