| .. include:: /substitutions.rst |
| .. _qemugdb: |
| |
| ===================================== |
| How to debug NuttX using QEMU and GDB |
| ===================================== |
| |
| This guide explains the steps needed to use QEMU and GDB to debug |
| an ARM board (lm3s6965-ek), but it could be modified to work with other |
| board or architecture supported by QEMU. |
| |
| Start configuring and compiling the lm3s6965-ek board with qemu-flat profile. |
| |
| Compiling |
| ========= |
| |
| #. Configure the lm3s6965-ek |
| |
| There is a sample configuration to use lm3s6965-ek on QEMU. |
| |
| Just use ``lm3s6965-ek:qemu-flat`` board profile for this purpose. |
| |
| .. code-block:: console |
| |
| $ cd nuttx |
| $ ./tools/configure.sh lm3s6965-ek:qemu-flat |
| |
| #. Compile |
| |
| .. code-block:: console |
| |
| $ make -j |
| |
| Start QEMU |
| ========== |
| |
| #. You need to start QEMU using the nuttx ELF file just create above: |
| |
| .. code-block:: console |
| |
| $ qemu-system-arm -M lm3s6965evb -device loader,file=nuttx -serial mon:stdio -nographic -s |
| Timer with period zero, disabling |
| ABCDF |
| telnetd [4:100] |
| |
| NuttShell (NSH) NuttX-12.0.0 |
| nsh> |
| |
| Start GDB to connect to QEMU |
| ============================ |
| |
| These steps show how to connect GDB to QEMU running NuttX: |
| |
| .. code-block:: console |
| |
| $ gdb-multiarch nuttx -ex "source tools/gdb/__init__.py" -ex "target remote 127.0.0.1:1234" |
| Type "apropos word" to search for commands related to "word"... |
| Reading symbols from nuttx... |
| set pagination off |
| source tools/gdb/lists.py |
| source tools/gdb/utils.py |
| source tools/gdb/memdump.py |
| |
| if use thread command, please don't use 'continue', use 'c' instead !!! |
| source tools/gdb/thread.py |
| "handle SIGUSR1 "nostop" "pass" "noprint" |
| Remote debugging using 127.0.0.1:1234 |
| 0x0000a45a in up_idle () at chip/common/tiva_idle.c:62 |
| 62 } |
| (gdb) |
| |
| #. From (gdb) prompt you can run commands to inpect NuttX: |
| |
| .. code-block:: console |
| |
| (gdb) info threads |
| Id Thread Info Frame |
| *0 Thread 0x2000168c (Name: Idle_Task, State: Running, Priority: 0, Stack: 1008) 0xa45a up_idle() at chip/common/tiva_idle.c:62 |
| 1 Thread 0x20005270 (Name: hpwork, State: Waiting,Semaphore, Priority: 224, Stack: 1984) 0xa68c up_switch_context() at common/arm_switchcontext.c:95 |
| 2 Thread 0x20005e30 (Name: nsh_main, State: Waiting,Semaphore, Priority: 100, Stack: 2008) 0xa68c up_switch_context() at common/arm_switchcontext.c:95 |
| 3 Thread 0x20006d48 (Name: NTP_daemon, State: Waiting,Signal, Priority: 100, Stack: 1960) 0xa68c up_switch_context() at common/arm_switchcontext.c:95 |
| 4 Thread 0x20008b60 (Name: telnetd, State: Waiting,Semaphore, Priority: 100, Stack: 2016) 0xa68c up_switch_context() at common/arm_switchcontext.c:95 |
| (gdb) |
| |
| As you can see QEMU and GDB are powerful tools to debug NuttX without using external board or expensive debugging hardware. |
| |