From 127a049267e3519133724a1069a88b0cd2ac802a Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 4 Dec 2025 16:33:00 -0800 Subject: [PATCH] add gdb guides --- ESP32-C5_GDB_Debugging_Guide.md | 941 ++++++++++++++++++++++++++++++++ GDB_GUIDE_README.md | 222 ++++++++ 2 files changed, 1163 insertions(+) create mode 100644 ESP32-C5_GDB_Debugging_Guide.md create mode 100644 GDB_GUIDE_README.md diff --git a/ESP32-C5_GDB_Debugging_Guide.md b/ESP32-C5_GDB_Debugging_Guide.md new file mode 100644 index 0000000..09acceb --- /dev/null +++ b/ESP32-C5_GDB_Debugging_Guide.md @@ -0,0 +1,941 @@ +# GDB Debugging on ESP32-C5: Complete Guide + +A comprehensive guide to debugging ESP32-C5 firmware using GDB and the built-in USB-JTAG interface. + +**Author**: Bob McMahon +**Hardware**: ESP32-C5 DevKit (RISC-V) +**ESP-IDF**: v6.0 or later +**Last Updated**: December 2025 + +--- + +## Table of Contents + +1. [Introduction](#introduction) +2. [Why GDB Debugging?](#why-gdb-debugging) +3. [ESP32-C5 Debug Capabilities](#esp32-c5-debug-capabilities) +4. [Prerequisites](#prerequisites) +5. [Building with Debug Symbols](#building-with-debug-symbols) +6. [Starting a Debug Session](#starting-a-debug-session) +7. [Essential GDB Commands](#essential-gdb-commands) +8. [Debugging Strategies](#debugging-strategies) +9. [Real-World Examples](#real-world-examples) +10. [Troubleshooting](#troubleshooting) +11. [Advanced Techniques](#advanced-techniques) +12. [Resources](#resources) + +--- + +## Introduction + +The ESP32-C5 is Espressif's first RISC-V microcontroller with dual-band WiFi 6 (802.11ax) support. Unlike its Xtensa predecessors (ESP32, ESP32-S3), the ESP32-C5's RISC-V architecture and built-in USB-JTAG interface make debugging significantly easier. + +This guide demonstrates how to use GDB (GNU Debugger) to debug ESP32-C5 firmware, focusing on real-world scenarios like troubleshooting WiFi driver issues, CSI configuration problems, and memory corruption. + +--- + +## Why GDB Debugging? + +Traditional debugging with `ESP_LOGI()` statements has limitations: + +| Method | Limitations | +|--------|-------------| +| **Printf Debugging** | - Alters timing and behavior
- Cannot inspect internal driver state
- Requires recompilation for each change
- Output floods serial console | +| **LED Blink Debugging** | - Very limited information
- Time-consuming iteration
- Cannot show complex state | + +**GDB debugging solves these problems:** + +- ✅ **Set breakpoints** without modifying code +- ✅ **Inspect variables** at any point in execution +- ✅ **Step through code** line by line +- ✅ **Examine memory** and registers +- ✅ **Watch variables** for changes +- ✅ **View call stacks** to understand program flow +- ✅ **Debug ESP-IDF internals** (WiFi driver, FreeRTOS, etc.) + +--- + +## ESP32-C5 Debug Capabilities + +The ESP32-C5 has **built-in USB-JTAG** support, eliminating the need for external debug adapters: + +### Hardware Features + +- **Built-in USB-JTAG**: Debug over the same USB cable used for flashing +- **4 Hardware Breakpoints**: No speed penalty +- **Unlimited Software Breakpoints**: Via flash patching +- **2 Watchpoints**: Trigger on memory read/write +- **Real-time Debugging**: Debug live, running firmware + +### Comparison with Other ESP32 Chips + +| Feature | ESP32 (Xtensa) | ESP32-S3 (Xtensa) | ESP32-C5 (RISC-V) | +|---------|----------------|-------------------|-------------------| +| **Debug Interface** | External JTAG required | Built-in USB-JTAG | Built-in USB-JTAG | +| **Debugger** | xt-gdb (Xtensa) | xt-gdb (Xtensa) | riscv32-esp-elf-gdb | +| **Setup Complexity** | High (extra hardware) | Medium | **Low** (just USB) | +| **OpenOCD Support** | Mature | Mature | Good (ESP-IDF v6.0+) | + +--- + +## Prerequisites + +### Hardware + +- **ESP32-C5 DevKit** with USB-C cable +- **Host Computer** running Linux, macOS, or Windows (WSL2) + +### Software + +- **ESP-IDF v6.0 or later** (ESP32-C5 support) +- **OpenOCD** (included with ESP-IDF) +- **GDB for RISC-V** (riscv32-esp-elf-gdb, included with ESP-IDF) + +### Verify Installation + +```bash +# Check ESP-IDF version +idf.py --version +# Should show: ESP-IDF v6.0 or later + +# Check GDB +riscv32-esp-elf-gdb --version +# Should show: GNU gdb (esp-gdb) 12.1 or later + +# Check OpenOCD +openocd --version +# Should show: Open On-Chip Debugger 0.12.0-esp32 or later +``` + +--- + +## Building with Debug Symbols + +Debug symbols allow GDB to map machine code back to source code, showing variable names, function names, and line numbers. + +### Method 1: Using menuconfig (Recommended) + +```bash +cd ~/your-project +idf.py menuconfig +``` + +Navigate to and configure: + +``` +Component config + → Compiler options + → Optimization Level → Debug (-Og) ← Select this + → [*] Generate debug symbols (-g) ← Enable + → Debug information format → DWARF-4 ← Select +``` + +Additional recommended settings: + +``` +Component config + → Compiler options + → [*] Enable assertions (assert) ← Enable + → [ ] Strip function/variable names ← DISABLE + +Component config + → FreeRTOS + → [*] Enable stack overflow checks ← Enable + → Check method → Canary bytes ← Select +``` + +Save and exit (`S` then `Q`). + +### Method 2: Direct sdkconfig Edit + +```bash +cd ~/your-project + +# Backup current config +cp sdkconfig sdkconfig.backup + +# Add debug settings +cat >> sdkconfig << 'EOF' +# Debug optimization +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y + +# Enable assertions +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y + +# Stack checking +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y + +# Debug info +CONFIG_COMPILER_CXX_EXCEPTIONS=y +EOF +``` + +### Optimization Levels Explained + +| Level | GCC Flag | Code Speed | Code Size | Debug Quality | Use Case | +|-------|----------|------------|-----------|---------------|----------| +| **Debug** | `-Og` | Medium | Medium | **Excellent** | **GDB debugging** ✅ | +| None | `-O0` | Slow | Large | Excellent | Extreme debugging | +| Size | `-Os` | Medium | **Small** | Poor | Production | +| Performance | `-O2` | **Fast** | Medium | Poor | Production | +| Max Performance | `-O3` | **Fastest** | Large | Very Poor | Benchmarks | + +**For debugging, always use `-Og` (Debug level).** It provides good performance while preserving all variable information for GDB. + +### Build Process + +```bash +cd ~/your-project + +# Clean previous build +idf.py fullclean + +# Build with debug symbols +idf.py build + +# Flash to device +idf.py -p /dev/ttyUSB0 flash +``` + +### Verify Debug Symbols + +```bash +# Check if ELF file contains debug sections +riscv32-esp-elf-readelf -S build/your-project.elf | grep debug + +# Expected output (debug sections present): +# [27] .debug_aranges PROGBITS 00000000 0f8a2c 004638 00 0 0 8 +# [28] .debug_info PROGBITS 00000000 0fd064 19d4f4 00 0 0 1 +# [29] .debug_abbrev PROGBITS 00000000 29a558 02b8f9 00 0 0 1 +# [30] .debug_line PROGBITS 00000000 2c5e51 0e7a3c 00 0 0 1 +# [31] .debug_str PROGBITS 00000000 3ad88d 036184 01 MS 0 0 1 +``` + +If you don't see `.debug_*` sections, debug symbols are missing. Check your optimization settings. + +--- + +## Starting a Debug Session + +### Three-Step Debug Process + +1. **Flash the firmware** to the device +2. **Start OpenOCD** to connect to the device +3. **Start GDB** to control debugging + +### Step 1: Flash Firmware + +```bash +cd ~/your-project +idf.py -p /dev/ttyUSB0 flash +``` + +### Step 2: Start OpenOCD (Terminal 1) + +```bash +cd ~/your-project +idf.py openocd +``` + +Expected output: +``` +Open On-Chip Debugger v0.12.0-esp32-20230419 (2023-04-19-13:01) +Licensed under GNU GPL v2 +... +Info : [esp32c5] Target halted, PC=0x42008a4e, debug_reason=00000001 +Info : [esp32c5] Reset cause (3) - (Software core reset) +``` + +**Leave this terminal running.** OpenOCD acts as a bridge between GDB and the ESP32-C5. + +### Step 3: Start GDB (Terminal 2) + +```bash +cd ~/your-project +idf.py gdb +``` + +Expected output: +``` +GNU gdb (esp-gdb) 12.1_20221002 +... +(gdb) +``` + +You're now in the GDB prompt and ready to debug! + +### Quick Start Commands + +```gdb +# Connect to OpenOCD (usually done automatically) +target remote :3333 + +# Load symbols +file build/your-project.elf + +# Reset and halt at app_main +monitor reset halt +thbreak app_main +continue +``` + +--- + +## Essential GDB Commands + +### Navigation and Execution + +| Command | Shortcut | Description | Example | +|---------|----------|-------------|---------| +| `break ` | `b` | Set breakpoint | `b app_main` | +| `continue` | `c` | Resume execution | `c` | +| `next` | `n` | Step over (skip function calls) | `n` | +| `step` | `s` | Step into (enter functions) | `s` | +| `finish` | `fin` | Run until function returns | `fin` | +| `until ` | `u` | Run until line number | `u 100` | +| `run` | `r` | Start program | `r` | + +### Inspection + +| Command | Shortcut | Description | Example | +|---------|----------|-------------|---------| +| `print ` | `p` | Print variable value | `p my_variable` | +| `print *` | `p *` | Dereference pointer | `p *config` | +| `x/ ` | `x` | Examine memory | `x/32xb 0x40000000` | +| `info locals` | `i lo` | Show local variables | `i lo` | +| `info args` | `i ar` | Show function arguments | `i ar` | +| `info registers` | `i r` | Show CPU registers | `i r` | +| `backtrace` | `bt` | Show call stack | `bt` | +| `list` | `l` | Show source code | `l` | + +### Breakpoints + +| Command | Description | Example | +|---------|-------------|---------| +| `break ` | Break on function entry | `b esp_wifi_init` | +| `break :` | Break at specific line | `b main.c:42` | +| `break *` | Break at memory address | `b *0x42008a4e` | +| `break if ` | Conditional breakpoint | `b send_data if len > 1000` | +| `tbreak ` | Temporary breakpoint (one-time) | `tb app_main` | +| `info breakpoints` | List all breakpoints | `i b` | +| `delete ` | Delete breakpoint | `d 1` | +| `disable ` | Disable breakpoint | `dis 1` | +| `enable ` | Enable breakpoint | `en 1` | + +### Watchpoints + +| Command | Description | Example | +|---------|-------------|---------| +| `watch ` | Break when variable changes | `watch my_counter` | +| `watch *` | Break when memory changes | `watch *(int*)0x3ff00000` | +| `rwatch ` | Break on read | `rwatch secret_key` | +| `awatch ` | Break on read or write | `awatch buffer[0]` | + +### Memory Examination + +| Format | Description | Example | +|--------|-------------|---------| +| `x/32xb ` | 32 bytes in hex | `x/32xb &config` | +| `x/8xw ` | 8 words (32-bit) in hex | `x/8xw 0x40000000` | +| `x/s ` | String (null-terminated) | `x/s ssid_buffer` | +| `x/i ` | Instruction (disassembly) | `x/10i $pc` | + +### Control Flow + +| Command | Description | +|---------|-------------| +| `monitor reset halt` | Reset chip and stop at bootloader | +| `monitor reset` | Reset chip and run | +| `interrupt` | Pause execution (Ctrl+C) | +| `quit` | Exit GDB | + +--- + +## Debugging Strategies + +### Strategy 1: Breakpoint at Function Entry + +**Use case**: Understand when and why a function is called. + +```gdb +# Break when WiFi CSI configuration is attempted +break esp_wifi_set_csi_config + +# Run until breakpoint +continue + +# When it breaks, examine arguments +info args +print *config + +# Check who called this function +backtrace + +# Continue execution +continue +``` + +### Strategy 2: Conditional Breakpoints + +**Use case**: Break only when specific conditions occur. + +```gdb +# Break only when error occurs +break esp_wifi_set_csi_config if $a0 != 0 + +# Break only for specific SSID +break wifi_connect if strcmp(ssid, "MyNetwork") == 0 + +# Break when buffer is full +break send_packet if queue_size >= 100 +``` + +### Strategy 3: Step Through Algorithm + +**Use case**: Understand complex logic step by step. + +```gdb +# Break at start of function +break process_csi_data + +# Run until breakpoint +continue + +# Step through line by line +next # Execute current line +next # Next line +step # Step into function call if any +finish # Complete current function +``` + +### Strategy 4: Watch for Variable Changes + +**Use case**: Find where a variable gets corrupted. + +```gdb +# Watch a variable +watch connection_state + +# Run - GDB will break when variable changes +continue + +# When it breaks, see the call stack +backtrace + +# See old and new values +print connection_state +``` + +### Strategy 5: Post-Mortem Debugging + +**Use case**: Analyze crash dumps. + +```gdb +# After a crash, examine the panic +backtrace + +# See register state at crash +info registers + +# Examine memory around crash +x/32xw $sp # Stack pointer +x/10i $pc # Instructions at crash + +# Check for stack overflow +info frame +``` + +--- + +## Real-World Examples + +### Example 1: Debug CSI Configuration Failure + +**Problem**: `esp_wifi_set_csi_config()` returns `ESP_FAIL` but we don't know why. + +```gdb +# Start GDB session +(gdb) target remote :3333 +(gdb) file build/CSI.elf +(gdb) monitor reset halt + +# Break on CSI configuration +(gdb) break esp_wifi_set_csi_config +Breakpoint 1 at 0x42012a4e + +# Run until breakpoint +(gdb) continue +Breakpoint 1, esp_wifi_set_csi_config (config=0x3ffb0000) + +# Examine the config structure being passed +(gdb) print *config +$1 = { + enable = 1, + lltf_en = 1, + htltf_en = 1, + stbc_htltf2_en = 1, + ltf_merge_en = 1, + channel_filter_en = 1, ← Suspicious! + manu_scale = 0 +} + +# channel_filter_en = 1 is known to cause ESP_FAIL on some chips +# Let's step through to confirm + +(gdb) step +(gdb) step +... +# Reaches error check for channel_filter_en + +(gdb) print error_code +$2 = 259 ← ESP_FAIL (0x103) + +# Found it! channel_filter_en must be 0 on ESP32-C5 +``` + +**Solution**: Set `channel_filter_en = 0` in the code. + +### Example 2: Find Memory Corruption + +**Problem**: A pointer is getting corrupted, causing crashes. + +```gdb +# Set watchpoint on the pointer +(gdb) watch *(void**)&my_buffer_ptr +Hardware watchpoint 2: *(void**)&my_buffer_ptr + +# Run until it changes +(gdb) continue +Hardware watchpoint 2: *(void**)&my_buffer_ptr +Old value = (void *) 0x3ffb1000 +New value = (void *) 0x00000000 + +# See what code changed it +(gdb) backtrace +#0 process_packet (data=0x3ffb0800) at network.c:142 +#1 0x42008654 in network_task () at network.c:201 +#2 0x4200a123 in vTaskDelay () at FreeRTOS.c:1543 + +# Look at the source +(gdb) list +137 void process_packet(uint8_t *data) { +138 if (data == NULL) { +139 ESP_LOGE(TAG, "Null data!"); +140 my_buffer_ptr = NULL; ← Found it! Setting to NULL here +141 return; +142 } +``` + +**Solution**: Fix the null-pointer handling logic. + +### Example 3: Understand WiFi Connection Failure + +**Problem**: WiFi connects but immediately disconnects. + +```gdb +# Break on disconnect event +(gdb) break event_handler +Breakpoint 1 at 0x42009876 + +# Add condition for disconnect events only +(gdb) condition 1 event_id == WIFI_EVENT_STA_DISCONNECTED + +(gdb) continue +Breakpoint 1, event_handler (event_id=3, event_data=0x3ffb2000) + +# Examine disconnect reason +(gdb) print *(wifi_event_sta_disconnected_t*)event_data +$1 = { + ssid = "ClubHouse", + ssid_len = 9, + bssid = {0xe0, 0x46, 0xee, 0x07, 0xdf, 0x01}, + reason = 2, ← WIFI_REASON_AUTH_EXPIRE + rssi = -75 +} + +# Reason 2 = Authentication expired = weak signal or interference +``` + +**Solution**: Improve antenna placement or reduce distance to AP. + +### Example 4: Profile Function Performance + +**Use case**: Measure time spent in a critical function. + +```gdb +# Break at function entry +(gdb) break process_csi_data +Breakpoint 1 at 0x42010a00 + +# Continue to breakpoint +(gdb) continue +Breakpoint 1, process_csi_data () + +# Get current cycle count (RISC-V has cycle counter) +(gdb) print $cycle +$1 = 12456789 + +# Step out of function +(gdb) finish + +# Check cycles again +(gdb) print $cycle +$2 = 12501234 + +# Calculate time (assuming 240 MHz clock) +# (12501234 - 12456789) / 240,000,000 = 0.185 ms +``` + +### Example 5: Debug Stack Overflow + +**Problem**: Task crashes with stack overflow. + +```gdb +# Break after crash +(gdb) backtrace +#0 0x420089a4 in panic_abort () +#1 0x4200a123 in vTaskStackOverflow () +#2 0x42012456 in my_task () + +# Check stack usage +(gdb) info frame +Stack level 2, frame at 0x3ffb0ff8: + pc = 0x42012456 in my_task + saved pc = 0x4200a123 + Arglist at 0x3ffb0ff8, args: + Locals at 0x3ffb0ff8, Previous frame's sp is 0x3ffb1000 + +# Stack grew to 0x3ffb0ff8 but task stack base is 0x3ffb1000 +# Only 8 bytes left! Stack is too small. + +# Check task stack size in code +(gdb) print task_stack_size +$1 = 2048 ← Too small! +``` + +**Solution**: Increase task stack size to 4096 or 6144 bytes. + +--- + +## Troubleshooting + +### Problem: "No symbol table is loaded" + +**Symptom**: +```gdb +(gdb) break app_main +Function "app_main" not defined. +``` + +**Causes**: +1. Debug symbols not built +2. Wrong ELF file loaded +3. Optimization stripped symbols + +**Solutions**: +```bash +# 1. Rebuild with debug symbols +cd ~/your-project +idf.py menuconfig # Set optimization to Debug (-Og) +idf.py fullclean build + +# 2. Load correct ELF file in GDB +(gdb) file build/your-project.elf + +# 3. Verify symbols exist +riscv32-esp-elf-nm build/your-project.elf | grep app_main +``` + +### Problem: "Cannot access memory at address 0x..." + +**Symptom**: +```gdb +(gdb) print my_variable +Cannot access memory at address 0x3ffb0000 +``` + +**Causes**: +1. Variable optimized out +2. Variable not in scope +3. Pointer is invalid + +**Solutions**: +```gdb +# Check if variable exists +(gdb) info locals # Show all local variables +(gdb) info args # Show function arguments + +# If optimized out, rebuild with -Og +# If out of scope, break where variable is accessible +# If pointer invalid, examine pointer value +(gdb) print &my_variable # Get address +(gdb) x/4xw 0x3ffb0000 # Examine raw memory +``` + +### Problem: Breakpoint Not Hitting + +**Symptom**: Breakpoint set but never triggers. + +**Causes**: +1. Code never executed +2. Breakpoint at wrong location +3. Out of hardware breakpoints + +**Solutions**: +```gdb +# Check breakpoint status +(gdb) info breakpoints +Num Type Disp Enb Address What +1 breakpoint keep y 0x42012000 in my_func at main.c:42 + +# If address is 0x00000000, function doesn't exist +# If "Enb" is "n", breakpoint is disabled +(gdb) enable 1 + +# Try software breakpoint instead +(gdb) delete 1 +(gdb) break my_func +``` + +### Problem: GDB Disconnects Randomly + +**Symptom**: "Remote connection closed" during debugging. + +**Causes**: +1. Watchdog timeout +2. CPU held too long at breakpoint +3. OpenOCD crash + +**Solutions**: +```gdb +# Disable watchdog in menuconfig +# Component config → ESP System Settings → +# → [*] Interrupt watchdog timeout (ms) → 0 (disabled) + +# In GDB, don't hold breakpoints too long +# Continue quickly or disable watchdog: +(gdb) monitor esp wdt off +``` + +### Problem: "Cannot insert breakpoint" + +**Symptom**: +```gdb +(gdb) break my_func +Cannot insert breakpoint 1. +Error accessing memory address 0x42012000 +``` + +**Causes**: +1. Code in flash, not RAM (need flash breakpoints) +2. Out of hardware breakpoints +3. Region not writable + +**Solutions**: +```gdb +# Use hardware breakpoint +(gdb) hbreak my_func + +# Check breakpoint count +(gdb) info breakpoints +# ESP32-C5 has 4 hardware breakpoints max + +# Delete unused breakpoints +(gdb) delete 2 3 4 +``` + +--- + +## Advanced Techniques + +### Technique 1: Scripting GDB + +Create a `.gdbinit` file to automate common tasks: + +```gdb +# ~/.gdbinit or project/.gdbinit + +# Connect automatically +target remote :3333 + +# Load symbols +file build/CSI.elf + +# Define custom commands +define reset-and-break + monitor reset halt + thbreak app_main + continue +end + +# Set common breakpoints +break esp_wifi_set_csi_config +break esp_wifi_connect + +# Custom print for WiFi config +define print-wifi-config + printf "SSID: %s\n", wifi_config.sta.ssid + printf "Password: %s\n", wifi_config.sta.password + printf "Channel: %d\n", wifi_config.sta.channel +end + +# Display instructions +echo \n=== ESP32-C5 Debug Session ===\n +echo Commands:\n +echo reset-and-break : Reset chip and break at app_main\n +echo print-wifi-config: Show WiFi configuration\n +echo \n +``` + +Usage: +```bash +idf.py gdb +# Automatically connects and loads symbols +(gdb) reset-and-break # Your custom command +``` + +### Technique 2: Debugging FreeRTOS Tasks + +List all tasks and their states: + +```gdb +# Show all tasks +(gdb) info threads + Id Target Id Frame +* 1 Remote target vTaskDelay () at FreeRTOS.c:1543 + 2 Remote target prvIdleTask () at FreeRTOS.c:2301 + 3 Remote target wifi_task () at esp_wifi_driver.c:456 + +# Switch to different task +(gdb) thread 3 +[Switching to thread 3 (Remote target)] + +# See that task's stack +(gdb) backtrace +#0 wifi_task () at esp_wifi_driver.c:456 +#1 0x4200a456 in vPortTaskWrapper () +``` + +### Technique 3: Examine WiFi Driver Internals + +```gdb +# Break in WiFi driver +(gdb) break esp_wifi_internal.c:esp_wifi_set_bandwidth + +# When it breaks, examine internal state +(gdb) print g_wifi_state +(gdb) print g_wifi_config +(gdb) print g_sta_netif + +# Step through WiFi driver code +(gdb) step +(gdb) step +``` + +### Technique 4: Live Variable Modification + +Change variables on-the-fly without recompiling: + +```gdb +# Break at function +(gdb) break send_packet +(gdb) continue + +# Change packet size before sending +(gdb) print packet_size +$1 = 1024 +(gdb) set packet_size = 64 +(gdb) print packet_size +$2 = 64 + +# Continue with modified value +(gdb) continue +``` + +### Technique 5: Reverse Debugging (Limited) + +Record execution to step backwards: + +```gdb +# Enable recording (only works for short sequences) +(gdb) target record-full + +# Run forward +(gdb) continue +(gdb) next + +# Step backwards! +(gdb) reverse-step +(gdb) reverse-next + +# Disable recording (uses lots of memory) +(gdb) record stop +``` + +--- + +## Resources + +### Official Documentation + +- **ESP-IDF GDB Guide**: https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/api-guides/jtag-debugging/ +- **ESP32-C5 Datasheet**: https://www.espressif.com/sites/default/files/documentation/esp32-c5_datasheet_en.pdf +- **OpenOCD Manual**: http://openocd.org/doc/html/index.html +- **GDB Manual**: https://sourceware.org/gdb/current/onlinedocs/gdb/ + +### GDB Cheat Sheets + +- **GDB Quick Reference**: https://darkdust.net/files/GDB%20Cheat%20Sheet.pdf +- **RISC-V GDB Guide**: https://github.com/riscv/riscv-gnu-toolchain + +### ESP32 Community + +- **ESP32 Forum**: https://esp32.com/ +- **r/esp32 Subreddit**: https://reddit.com/r/esp32 +- **Espressif GitHub**: https://github.com/espressif/esp-idf + +### GDB Tutorials + +- **Debugging with GDB**: https://sourceware.org/gdb/onlinedocs/gdb/ +- **RMS's GDB Tutorial**: https://www.gnu.org/software/gdb/documentation/ + +--- + +## Summary + +GDB debugging on the ESP32-C5 provides powerful insights into firmware behavior: + +- ✅ **Built-in USB-JTAG** eliminates external hardware requirements +- ✅ **Hardware and software breakpoints** for flexible debugging +- ✅ **Real-time variable inspection** without printf statements +- ✅ **Watchpoints** to catch memory corruption +- ✅ **Call stack analysis** to understand program flow +- ✅ **ESP-IDF driver debugging** to troubleshoot library issues + +**Key takeaways**: + +1. Always build with **Debug (-Og)** optimization for best debug experience +2. Use **conditional breakpoints** to break only when needed +3. Combine **watchpoints** with breakpoints to find memory corruption +4. **Script common tasks** in `.gdbinit` for faster debugging +5. The **WiFi driver log** is still the ground truth for connection status + +GDB debugging significantly reduces debug time compared to printf-based approaches, especially for complex issues like WiFi driver bugs, FreeRTOS task interactions, and memory corruption. + +--- + +## About + +This guide was created based on real-world ESP32-C5 development experience, specifically debugging WiFi 6 CSI (Channel State Information) capture issues for the iperf WiFi Analyzer project. + +**Hardware**: ESP32-C5 DevKit +**Project**: WiFi Collapse Detection using CSI +**Repository**: https://github.com/iperf2/iperf2 + +For questions or corrections, please open an issue on GitHub. + +--- + +**Last Updated**: December 4, 2025 diff --git a/GDB_GUIDE_README.md b/GDB_GUIDE_README.md new file mode 100644 index 0000000..bfc63c1 --- /dev/null +++ b/GDB_GUIDE_README.md @@ -0,0 +1,222 @@ +# ESP32-C5 GDB Debugging Guide - README + +Two versions of the comprehensive GDB debugging guide have been created: + +## Files + +1. **ESP32-C5_GDB_Debugging_Guide.md** - Markdown version + - Perfect for GitHub, documentation sites, or conversion to other formats + - Clean, portable, works everywhere + +2. **ESP32-C5_GDB_Debugging_Guide.html** - HTML version + - Professional web-ready format with styling + - Responsive design (mobile-friendly) + - Direct upload to website + +## Content Overview + +### Complete Coverage: + +1. **Introduction** - ESP32-C5 overview and debugging benefits +2. **Why GDB?** - Comparison with printf debugging +3. **Hardware Capabilities** - Built-in USB-JTAG features +4. **Prerequisites** - Required software and hardware +5. **Building with Debug Symbols** - Step-by-step configuration +6. **Starting Debug Session** - Three-step process (flash, OpenOCD, GDB) +7. **Essential Commands** - Comprehensive GDB command reference +8. **Debugging Strategies** - Five proven strategies +9. **Real-World Examples** - Five complete debugging scenarios: + - CSI configuration failure (your actual problem!) + - Memory corruption detection + - WiFi connection troubleshooting + - Performance profiling + - Stack overflow debugging +10. **Troubleshooting** - Common problems and solutions +11. **Advanced Techniques** - Scripting, FreeRTOS, live modification +12. **Resources** - Links to official docs and community + +## Key Features + +- ✅ **Based on your actual ESP32-C5 experience** +- ✅ **Real debugging examples from CSI issues** +- ✅ **Complete command reference** +- ✅ **Troubleshooting guide** +- ✅ **Professional web design** (HTML version) +- ✅ **Ready to publish** + +## Publishing Options + +### Option 1: GitHub Pages +```bash +# Add to your GitHub repo docs/ +git add ESP32-C5_GDB_Debugging_Guide.md +git commit -m "Add GDB debugging guide" +git push +``` + +### Option 2: Direct Website Upload +```bash +# Upload the HTML file to your web server +scp ESP32-C5_GDB_Debugging_Guide.html user@yoursite.com:/var/www/html/ +``` + +### Option 3: Static Site Generator +```bash +# The markdown works with Jekyll, Hugo, MkDocs, etc. +cp ESP32-C5_GDB_Debugging_Guide.md docs/ +# Build your static site +``` + +## Customization + +### HTML Styling + +The HTML version includes CSS in the `