mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
181 lines
8.6 KiB
Markdown
181 lines
8.6 KiB
Markdown
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 |
|
|
| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
|
|
|
# GDBstub example
|
|
|
|
This example shows how to use gdbstub and it's functionality at runtime to debug an application with GDB.
|
|
With the gdbstub component it is possible to run GDB from IDF Monitor by pressing Ctrl+C and debug
|
|
the application using GDB. It is also possible to read/modify memory values, interrupt and continue
|
|
the application, set breakpoints, make steps and so on.
|
|
Upon exit from GDB, the application will continue to work in IDF Monitor as before.
|
|
|
|
## How to use example
|
|
### Hardware Required
|
|
|
|
The example can run on any commonly available ESP32 development board.
|
|
There are two possible ways to execute gdbstub with GDB: from IDF Monitor and as standalone application.
|
|
GDBStub is supported for all ESP chips.
|
|
|
|
NOTE: On chips with an integrated USB Serial/JTAG Controller, it is reasonable to use OpenOCD + GDB for debugging.
|
|
|
|
### Configure the project
|
|
|
|
By default, the example is already pre-configured, but the user can change configuration options with the following command:
|
|
```
|
|
idf.py menuconfig
|
|
```
|
|
Current example is pre-configured. The user can scroll through the system parameters and see the settings.
|
|
Most important one is:
|
|
-> Component Config -> GDB Stub -> GDBStub on runtime
|
|
This selection switches gdbstub to runtime mode.
|
|
Using another options in this menu, the user can also enable or disable task list handling and define a maximum amount of tasks.
|
|
|
|
### Build and Flash
|
|
|
|
Build the project and flash it to the board, then run IDF Monitor to view the serial output:
|
|
|
|
```
|
|
idf.py -p PORT flash monitor
|
|
```
|
|
Replace PORT with the name of the serial port to use, for example COM4 for Windows or /dev/ttyUSB0 for Linux.
|
|
To exit the serial monitor, type ``Ctrl-]``.
|
|
See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.
|
|
|
|
In addition, it is also possible to run GDB and connect to the Esp32 directly, without IDF Monitor.
|
|
```
|
|
xtensa-esp32-elf-gdb ./build/gdbstub.elf -ex "set serial baud 115200" -ex "target remote \\.\COM10"
|
|
```
|
|
This will execute GDB and GDB will connect to your Esp32 by serial port COM10 with baudrate 115200.
|
|
|
|
## Example Output
|
|
|
|
The example demonstrates how to switch to GDB, watch values, change values, continue to run, and exit from GDB to the application.
|
|
To switch to GDB, the user presses Ctrl+C. This will stop the application and run the GDB.
|
|
In GDB, the user can print values "print call_count" and "print update_log_level" and then
|
|
change them "set call_count 100" and "set update_log_level = ESP_LOG_WARN".
|
|
The user can continue running the application in GDB by entering "continue" and then interrupt the application by pressing Ctrl+C.
|
|
The user can check again that the application has worked by checking variable "print call_count".
|
|
The user can exit from GDB to continue seeing the trace from IDF Monitor by pressing "quit" and then "y".
|
|
The user will see in IDF Monitor that call_count and logging level have changed.
|
|
The user can add breakpoint to the label test_point2 by entering "break test_point2" and then enter "continue" or "c". The application will break at this line.
|
|
If user will continue again, the application will break at this line again.
|
|
Also, user can try to step application by entering "si".
|
|
A typical console output for such a scenario is shown below:
|
|
```
|
|
I (312) cpu_start: Starting scheduler on PRO CPU.
|
|
I (0) cpu_start: Starting scheduler on APP CPU.
|
|
Hello GDB example!
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
I (4317) gdbstub_example: INFO mode enabled. Task 0, Core ID 0, Call - 0.
|
|
W (4317) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 0.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
I (4327) gdbstub_example: INFO mode enabled. Task 1, Core ID 1, Call - 0.
|
|
W (4337) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 0.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
I (5137) gdbstub_example: INFO mode enabled. Task 0, Core ID 0, Call - 1.
|
|
W (5137) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 1.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
I (5157) gdbstub_example: INFO mode enabled. Task 1, Core ID 1, Call - 1.
|
|
W (5157) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 1.
|
|
To exit from IDF monitor please use "Ctrl+]"
|
|
$T02#b6GNU gdb (crosstool-NG esp-2020r3) 8.1.0.20180627-git
|
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
|
This is free software: you are free to change and redistribute it.
|
|
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
|
|
and "show warranty" for details.
|
|
This GDB was configured as "--host=x86_64-host_w64-mingw32 --target=xtensa-esp32-elf".
|
|
Type "show configuration" for configuration details.
|
|
For bug reporting instructions, please see:
|
|
<http://www.gnu.org/software/gdb/bugs/>.
|
|
Find the GDB manual and other documentation resources online at:
|
|
<http://www.gnu.org/software/gdb/documentation/>.
|
|
For help, type "help".
|
|
Type "apropos word" to search for commands related to "word"...
|
|
Reading symbols from c:\esp-idf\examples\system\gdbstub\build\gdbstub.elf...done.
|
|
Remote debugging using \\.\COM16
|
|
task4test (param=0x0) at ../main/gdbstub_main.c:41
|
|
41 asm(" nop;");
|
|
(gdb) print call_counts[0]
|
|
$1 = 2
|
|
(gdb) print call_counts[1]
|
|
$2 = 2
|
|
(gdb) set call_counts[0] = 100
|
|
(gdb) set call_counts[0] = 100(gdb) print call_counts[0]
|
|
$3 = 100
|
|
(gdb) print update_log_level
|
|
$4 = ESP_LOG_DEBUG
|
|
(gdb) set update_log_level = ESP_LOG_WARN
|
|
(gdb) print update_log_level
|
|
$5 = ESP_LOG_WARN
|
|
(gdb) c
|
|
Continuing.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 100.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 2.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 101.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 3.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 102.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
W (5927) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 4.
|
|
|
|
Thread 1 received signal SIGINT, Interrupt.
|
|
task4test (param=0x0) at ../main/gdbstub_main.c:38
|
|
38 for (int i=0 ; i< 10000000; i++)
|
|
(gdb) break test_point2
|
|
Breakpoint 1 at 0x400d511d: file ../main/gdbstub_main.c, line 40.
|
|
(gdb) c
|
|
Continuing.
|
|
|
|
Thread 1 hit Breakpoint 1, task4test (param=0x1) at ../main/gdbstub_main.c:40
|
|
40 asm("test_point2: nop;");
|
|
(gdb) si
|
|
41 asm(" nop;");
|
|
(gdb) si
|
|
42 asm(" nop;");
|
|
(gdb) c
|
|
Continuing.
|
|
|
|
Thread 1 hit Breakpoint 1, task4test (param=0x1) at ../main/gdbstub_main.c:40
|
|
40 asm("test_point2: nop;");
|
|
(gdb) delete 1
|
|
(gdb) c
|
|
Continuing.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
W (36077) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 103.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
W (36107) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 5.
|
|
CPU 0: To enter GDB please press "Ctrl+C"
|
|
W (36917) gdbstub_example: WARN mode enabled. Task 0, Core ID 0, Call - 104.
|
|
CPU 1: To enter GDB please press "Ctrl+C"
|
|
W (36947) gdbstub_example: WARN mode enabled. Task 1, Core ID 1, Call - 6.
|
|
|
|
Thread 1 received signal SIGINT, Interrupt.
|
|
task4test (param=0x0) at ../main/gdbstub_main.c:38
|
|
38 for (int i=0 ; i< 10000000; i++)
|
|
(gdb)
|
|
```
|
|
|
|
To reproduce this scenario run the application by: idf.py -P PORT flash monitor
|
|
Then:
|
|
1. Interrupt the application by pressing Ctrl+C
|
|
2. In GDB, print the application values by typing in GDB command line "print call_count" or "print update_log_level"
|
|
3. Modify the application values by typing in GDB command line "set call_count = 100" or "set update_log_level = ESP_LOG_WARN"
|
|
4. Continue the application by typing in GDB command line "continue"
|
|
5. Interrupt application by pressing Ctrl+C
|
|
6. Check the value by typing in GDB command line "print call_count" or "print update_log_level"
|
|
7. Continue the application by typing in GDB command line "continue"
|
|
8. Interrupt the application by pressing Ctrl+C
|
|
9. Add breakpoint by typing in GDB command line "break test_point2" or break 40 (break at line 40).
|
|
10. Continue the application by typing in GDB command line "continue"
|
|
11. After application stop at label "test_point2".
|
|
12. Make stepping by typing "si"
|
|
13. To exit from GDB to monitor type "exit" and press "y"
|
|
|
|
To exit from monitor please use Ctrl+]
|
|
|