mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 13:09:38 +00: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-C61 | 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+]
 | |
| 
 | 
