ESP32 exception decoder
Paste the crash from the serial monitor, choose the ELF file of the same build, and get the function and line behind every address. It runs in your browser: nothing is uploaded.
Where the ELF is
- ESP-IDF:
build/<project>.elf - Arduino IDE 2: Sketch → Export Compiled Binary, then the sketch folder,
build/<board>/<sketch>.ino.elf - PlatformIO:
.pio/build/<env>/firmware.elf
It has to be the ELF of the exact build that crashed. After any change and rebuild the code moves, and the same addresses point somewhere else.
What it reads
- The
Backtrace:line of the Xtensa chips (ESP32, S2, S3): of eachPC:SPpair, the PC. - On the RISC-V chips (C2, C3, C5, C6, H2, P4) there is no ready backtrace: it unwinds the register dump and the
Stack memory:lines with the ELF's DWARF call frame information, asidf.py monitordoes with GDB, and gets the real call chain. Without the stack memory it falls back to the code addresses in the text. - Function names come from the ELF's symbol table, files and lines from its DWARF line table.
The same as xtensa-esp32-elf-addr2line -pfiaC -e app.elf ... or riscv32-esp-elf-addr2line, without installing a toolchain, and also for the crash that Arduino IDE 2 no longer decodes for you.
Each known reason is explained too: what a LoadProhibited or a Store access fault usually means, a NULL pointer behind EXCVADDR, stack overflows, watchdogs. For a whole log, use the log analyzer; for a core dump, the core dump decoder.
For devices that are not on your desk
This needs the crash text, and a crash in the field prints it to a serial port nobody is reading. Pinscope keeps it across the reboot, sends it on the next connection and decodes it with the ELF you upload, matched to the build that crashed, so the dashboard shows the lines without anyone at the device. How that works.
Try it
Three devices are free, and no card is needed. Create an account, or read the five-minute guide first.
More
- Remote access to an ESP32 without TLS: what it measured and what it costs
- Reaching an ESP32 web server from outside its network
- Updating ESP32 firmware over the internet, with rollback
- Guru Meditation Error: decoding the backtrace, and crashes from the field
- Remote logging: ESP_LOG without a serial cable
- Heap and stack monitoring in the field
- An ESP32 behind CGNAT, 4G or Starlink
- TLS memory usage on the ESP32, and how to reduce it
- Sharing an ESP32 sensor page with anyone, without port forwarding
- ArduinoOTA over the internet, with a rollback
- ESP32 remote access compared: port forwarding, ngrok, Cloudflare Tunnel, Tailscale
- esp_http_server slow? The 250 ms delay and the fix
- Before the first ESP32 ships: a field support checklist
- ESP32 log analyzer: reset reasons, crashes and error codes explained