MCU Debugging & Probes
Hardware probes and software debug tools — J-Link, Black Magic Probe, picoprobe, OpenOCD, GDB, probe-rs, defmt-rtt.
The hardware-and-software debug stack: physical probe + transport + on-host debugger + log streamer. For Rust-specific patterns see Embedded Rust; for ESP-specific debug see ESP-IDF; for sim-side debug see Wokwi & Embedded Simulators.
Debug probes — hardware
The thing you plug into the JTAG / SWD pins on your board.
Free / open source
- ★ Raspberry Pi Pico as picoprobe / debugprobe — official "use a $4 Pico to debug another Pico (or any ARM SWD target)" firmware. Hugely popular. Supported by OpenOCD upstream, probe-rs, Pico-SDK. The right answer for "what's the cheapest decent SWD probe?"
- ★ Raspberry Pi Debug Probe — Pi Foundation's officially-built picoprobe in a finished case ($12). Same firmware, no soldering.
- ★ Black Magic Probe — open-source (GPLv3) probe firmware that runs GDB server in the probe itself (no OpenOCD on the host). Supports SWD / JTAG, ARM Cortex-M, RISC-V (some chips). Sold as commercial "Black Magic Probe" hardware (1Bit Squared) or DIY-flash any STM32 Blue Pill / F4 Discovery into one.
- CMSIS-DAP probes — open-source ARM standard for USB-HID-class debug probes. Many cheap clones; works with OpenOCD, pyOCD, probe-rs. The "DAPLink" firmware on a Cortex-M can turn it into a probe.
- DAPLink — Arm's reference CMSIS-DAP firmware; preflashed on most Nordic / NXP / SiLabs dev kits' onboard debugger.
- WCH-LinkE — WCH's $5 USB probe; speaks both SWD/JTAG (Cortex-M) and WCH's own RISC-V debug protocol for CH32V. Works with OpenOCD.
- ESP-PROG / ESP-Prog-2 — Espressif's USB-to-JTAG/UART probe; needed for chips without native USB-JTAG (classic ESP32, S2). Free-ish (it's a $13 dev tool).
- ESP32-S3 / -C3 / -C6 / -P4 native USB-JTAG — these chips expose JTAG over the same USB-C as flashing; no separate probe needed.
Commercial (with free / edu tiers)
- ★ Segger J-Link EDU / J-Link EDU Mini — $20-$60 educational tier with the full J-Link software stack (JLink GDB Server, RTT Viewer, Ozone, SystemView). Restricted to non-commercial use — legal-license-wise, for your hobby / school projects. The best probe in the consumer-price range.
- Segger J-Link Plus / Pro / Ultra+ — commercial-license probes. Expensive but unmatched. Rock-solid, fast, supports thousands of MCU families.
- ST-LINK/V3 — STMicro's official probe; bundled on every ST Nucleo / Discovery board. Free. Works only with STM32 chips (officially); J-Link reflash converts older ST-LINKs into J-Link OB.
- MCU-Link / MCU-Link Pro (NXP) — bundled on NXP dev boards.
- Atmel-ICE / PICKit / Snap (Microchip) — vendor probes for AVR / SAM / PIC.
- Lauterbach TRACE32 — high-end industrial debug system; $$$.
- PE-Micro Multilink / Cyclone — high-end NXP flasher / debugger.
- Renesas E2 / E2 Lite — Renesas vendor probes.
On-chip debug interfaces
- SWD (Serial Wire Debug) — ARM Cortex-M's 2-pin debug protocol; the default for all modern ARM MCUs.
- JTAG (4-pin) — older / industrial; still used on FPGAs and most MCUs as alternative.
- SWO — ARM single-wire trace output; cheap printf-style channel.
- ETM / ITM / PTM — ARM trace ports; require a fancier probe.
- WCH-Link RISC-V protocol — proprietary 2-wire interface for CH32V chips.
- ESP USB-JTAG — ESP32-S3/C3/C6/H2/P4 expose JTAG over USB; no separate pins needed.
- ESP-IDF Crosscore Debug — debug both cores of dual-core ESP via OpenOCD-ESP.
Debug software
OpenOCD family
- ★ OpenOCD — open source (GPL-2); the universal "talk to a probe, expose GDB-server" daemon. Supports nearly every probe and every chip. The standard, but configuration is famously fiddly.
- ★ OpenOCD-ESP32 (Espressif fork) — adds ESP32 / ESP32-S3 / -C3 / -C6 / -H2 / -P4 + Xtensa support. Bundled with ESP-IDF.
- pyOCD — Python alternative to OpenOCD; CMSIS-Pack-driven; smoother config. Apache 2.0.
probe-rs (Rust ecosystem, but useful for any C/C++ workflow too)
- ★ probe-rs — Rust-native debug tool; replaces OpenOCD + much of GDB for many workflows.
probe-rs runflashes + streams RTT logs in one command.probe-rs gdbruns a GDB server. VS Code extension. MIT/Apache. - ★ probe-rs CLI commands —
probe-rs list / info / reset / read / write / download. - probe-rs VS Code extension — DAP-protocol-based debugger UI; works in VS Code, no GDB front-end needed.
GDB
- ★
arm-none-eabi-gdb— the Arm GDB; works with OpenOCD / J-Link GDB Server / Black Magic Probe / probe-rs. - ★
riscv32-unknown-elf-gdb/riscv64-unknown-elf-gdb— RISC-V flavors; for CH32V / RP2350 RISC-V mode / ESP32-Cx etc. xtensa-esp32-elf-gdb— Xtensa GDB for classic ESP32 / S2 / S3.- GDB Dashboard /
gef/pwndbg— TUI overlays. - gdb-multiarch — Linux package that handles many architectures.
- Cortex-Debug VS Code extension — popular GDB-frontend for Cortex-M debugging in VS Code; works with OpenOCD / J-Link / pyOCD / Black Magic.
IDE-integrated debug
- VS Code + Cortex-Debug — the de-facto Cortex-M debug UI.
- VS Code + ESP-IDF extension — IDF debug GUI.
- VS Code + probe-rs — Rust-friendly debug GUI.
- VS Code + PlatformIO — built-in debug UI; calls into OpenOCD / J-Link / probe-rs depending on
debug_tool. - STM32CubeIDE / CubeMonitor — ST's Eclipse-based IDE with deep STM32-aware debug, live variable plotting.
- MCUXpresso (NXP) — same idea for NXP chips.
- MPLAB X (Microchip) — for AVR / PIC / SAM.
- Segger Embedded Studio (SES) — free for non-commercial / Nordic users; very polished J-Link integration.
- Segger Ozone — free standalone debugger that pairs with any J-Link; serious live data viewing, code-coverage, instruction-trace UI.
Logging / live trace
RTT — Real-Time Transfer
- ★ Segger RTT — Segger's spec for streaming logs / data over a tiny shared-RAM buffer; ~100× faster than UART. Open spec, multiple implementations.
- ★
defmt+defmt-rtt(Rust) — see Embedded Rust; compresses log strings to indices. - ★ Segger RTT Viewer / J-Link RTT Logger /
JLinkRTTClient— host-side viewers if you have a J-Link. - ★
probe-rs rtt— probe-rs's host-side RTT consumer. rtt-target(Rust) — non-defmt RTT printer; pairs with RTT Viewer.- OpenOCD
rtt setup/rtt server— OpenOCD's built-in RTT server.
Other live channels
- ★ UART / Serial monitor — the timeless option. ESP-IDF Monitor, PlatformIO Serial Monitor,
pyserial,picocom,tio,minicom. Works on every chip; saturates fast at high log rates. - SWO / ITM trace — ARM-only, single-wire;
itmdumphost tool. - Telnet over Wi-Fi / Ethernet — when wires are inconvenient (deployed devices); ESP-IDF supports it.
IDF Monitor
idf.py monitor— Espressif's serial monitor with automatic stack-trace decoding (turns hex addresses into file:line) and core-dump parsing. Reason enough to use IDF directly.- PlatformIO
pio device monitor --filter esp32_exception_decoder— same trick from PlatformIO.
Crash / coredump tools
addr2line— turn raw addresses from a crash dump into file:line. Standard binutils.- ★ ESP-IDF Coredump — IDF can save a crash to flash;
esp-coredumpdecodes it. Excellent for field-deployed devices. panic-persist(Rust) — keep a panic message in a known RAM region across reboots.panic-probe+ RTT — panic message streams over RTT immediately on crash.- ★ Memfault — commercial fleet-side crash analytics; free tier exists. Auto-decodes coredumps from production devices. Paid for serious volume; see MCU OTA & Fleet Updates.
Logic analyzers / sniffers (briefly — adjacent)
- ★ sigrok / PulseView — open-source logic analyzer suite; works with $10 USB analyzers, Saleae Logic, DreamSourceLab, Kingst.
- Saleae Logic 2 — proprietary but free / cross-platform analyzer software for Saleae's hardware. Great UX.
- DSView (DreamSourceLab) — open source, ships with their hardware.
- Glasgow Interface Explorer — open-source FPGA-based protocol explorer; protocol-agnostic.
- Wireshark + nRF Sniffer — capture BLE traffic into Wireshark.
- Wireshark + ESP32 Wi-Fi sniffer firmware — capture 802.11 management frames.
Pick this if…
- Default cheap probe, hobbyist: Raspberry Pi Debug Probe (or DIY picoprobe).
- Default probe for serious work, non-commercial: Segger J-Link EDU.
- Default probe for paid work: Segger J-Link Plus, or stick with whatever's onboard the dev kit (ST-LINK / DAPLink / MCU-Link).
- Default debug runner, Rust: probe-rs (+ defmt + flip-link).
- Default debug runner, C/C++ multi-chip: OpenOCD + arm-none-eabi-gdb (+ Cortex-Debug in VS Code).
- Default for ESP32: native USB-JTAG (S3/C3/C6/H2/P4) + IDF Monitor + esp-coredump.
- Default log streamer beyond serial: Segger RTT (defmt-rtt for Rust,
rtt-targetfor non-defmt). - You're field-deploying and need crash reports back: ESP-IDF coredump + your own server, or Memfault for hosted.
- Cheap logic analyzer: any sigrok-compatible $10 USB analyzer + PulseView.