Tooling

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 run flashes + streams RTT logs in one command. probe-rs gdb runs a GDB server. VS Code extension. MIT/Apache.
  • probe-rs CLI commandsprobe-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; itmdump host 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-coredump decodes 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-target for 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.