Standalone Python GUI application for decoding ESP8266 and ESP32 exception logs from pasted serial output.
If you add the UI screenshot file to docs/winespexceptiondecoder-ui.png, the README will render it here.
- Original project: me-no-dev/EspExceptionDecoder
- Original Arduino IDE plugin by Hristo Gochkov
- Python standalone version by
Andre Lorbach <alorbach@adiscon.com>
- Paste raw debug logs into a desktop GUI
- Select a specific firmware
.elf - Optionally define a base path that is scanned recursively for
.elffiles - Auto-detect common Arduino ESP
gdbtoolchains, with manual override - Decode exception causes, registers, backtraces, and failed allocations
- Show structured analysis and warnings instead of raw command output
- Persist the last-used paths, pasted log, and window geometry
- Run from a local
.venvwith helper scripts for Windows and Unix-like shells
- Windows is the primary target platform for the current version
- Python 3.13 or newer
- Arduino IDE installed locally
- Matching ESP8266 or ESP32 Arduino core/toolchain installed through Arduino IDE
- Access to the compiled firmware
.elffile for the crash you want to decode
This tool does not replace Arduino IDE. It depends on the toolchain that Arduino IDE installs.
- Arduino IDE is needed so the correct ESP toolchain and
gdbexecutable exist on the machine. - The decoder auto-detects common Arduino IDE package paths such as
Arduino15\packages\.... - The selected
.elfmust come from the same firmware build that produced the crash log. - If Arduino IDE or the board package is missing, decoding can still parse addresses, but symbol and source-file resolution will be incomplete.
.\setup.bat
.\start.bat./setup.sh
./start.sh- Build your Arduino sketch in Arduino IDE so the matching
.elfexists. - Start
WinEspExceptionDecoder. - Paste the exception log from the serial monitor into
Pasted Debug Log. - Set
ELF filedirectly if you know the exact.elf. - Or set
ELF base pathand let the application scan recursively for the newest.elf. - Confirm the
GDB path. In most Arduino IDE setups the auto-detected value is correct. - Click
Decode, or leaveAuto refreshenabled. - Read the
Analysis Reportto identify the failing function, likely fault cause, and unresolved addresses.
ELF file: explicit path to the exact firmware ELF used for symbol lookup. This always wins over the scan path.ELF base path: fallback search root for recursive.elfdiscovery. The newest.elffound is used.GDB path: debugger executable from the Arduino ESP toolchain. This is what resolves addresses to functions and source lines.Pasted Debug Log: raw crash output copied from the Arduino serial monitor or other debug console.
- If
ELF fileis set, that exact file is used. - If
ELF fileis empty andELF base pathis set, the app scans recursively for*.elf. - When multiple
.elffiles are found under the base path, the newest file is used automatically. - Once an
.elfis found for a given base path, that result is cached and reused until the base path changes. - The report warns when no
.elfis available or when multiple candidates were found.
Detected issue: the decoded exception class. For ESP32 Guru Meditation logs this is derived from the panic reason.Debug reason: additional reason text when the log provides it, for example stack canary or watchpoint faults.Frames decoded: how many addresses were extracted from stack and backtrace data.ELF source: the actual ELF file used for symbol resolution.ELF base path: shown when scan-based ELF selection is active.GDB: the debugger path used for decoding.
PC: program counter. This is usually the most important first location to inspect.EXCVADDR: exception address. This often tells you what memory address caused the fault.- If a register resolves to a function and source line, the report shows that directly.
- This is the decoded call path preview.
- The first few entries are the most relevant stack/backtrace addresses.
- If more frames exist, the report shortens the list and tells you how many were omitted from preview.
unresolvedmeans the address was found in the log, but it could not be mapped cleanly from the selected ELF.
- This section appears when the log includes a failed allocation marker.
- It helps identify memory pressure or heap fragmentation issues.
- These are heuristic hints generated from the log.
- Example:
EXCVADDRnear0x00000000usually points to a null-pointer access. - These hints are guidance, not proof. The decoded top frames still matter most.
- This section explains what was missing or ambiguous.
- Common examples:
- no ELF selected
- no
gdbdetected - no ESP exception code found in the pasted log
- addresses that could not be resolved from the selected ELF
EXCVADDR = 0x00000000: strong signal for null-pointer access.LoadProhibitedorStoreProhibited: usually an invalid pointer or corrupted object access.Stack canary watchpoint triggered: likely stack overflow or out-of-bounds writes on the current task stack.- Many unresolved frames: often means the wrong
.elfwas selected, or the ELF does not match the running firmware build. - Correct function names but strange source lines: verify the exact build artifacts and ensure the firmware was rebuilt before capture.
Run tests from the virtual environment:
.\.venv\Scripts\python -m unittest discover -s tests -t . -v- The app does not bundle
gdb; it relies on an installed Arduino-compatible toolchain. - Settings are stored per-user in the platform config directory under
WinEspExceptionDecoder. - The current implementation is Windows-first, but the setup and start scripts also cover Unix-like shells.
