Public Access
Every build now records at boot which version runs and, after a crash restart, which one crashed (even across a Rollback). The core dump summary (task, PC, reason, backtrace) is printed and raised as a Notification; `crash` shows it later. After 3 crash restarts in a row the firmware starts in Safe Mode: clock, Wi-Fi, Update Service and Debug Console only (SafeMode, 2 host tests). A normal restart or a minute up resets the count. The main loop is now on the task watchdog (enableLoopWDT): Arduino only watched core 0's idle task, so a stuck loop hung the device for good. The Update Service restarts into an installed update by itself if the main loop hasn't after 90 s. Debug Builds: `coredump get` and `reset` are answered by the console's own task; rdbg.py crash decodes the backtrace and rdbg.py coredump runs esp-coredump, against ELFs archived by version and digest in .pio/elves. The StorageService mutex is now made in the constructor: Safe Mode never starts that Service, and `info` crashed on the null mutex, 29 times in a row before the fix was pushed into Safe Mode over Wi-Fi. Verified on the device: crash report and full core dump decoded over Wi-Fi; Safe Mode at exactly 3 crashes, left by `reboot`; a hung loop caught by the watchdog in 5 s; `reset` from the console task. ADR 0005. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
16 lines
908 B
Bash
Executable File
16 lines
908 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# Full post-mortem of a core dump fetched with `scripts/rdbg.py coredump`: every task's backtrace,
|
|
# registers and the crashed task's stack, via esp-coredump and GDB in the container.
|
|
# Usage: scripts/decode_coredump.sh <core.bin> <version or ELF sha256 prefix>
|
|
set -euo pipefail
|
|
source "$(dirname "$0")/_docker.sh"
|
|
[ $# -eq 2 ] || { echo "Usage: scripts/decode_coredump.sh <core.bin> <version|sha>" >&2; exit 1; }
|
|
CORE="$(realpath "$1")"
|
|
ELF="$(ls -t "$ROOT"/.pio/elves/*"$2"*.elf 2>/dev/null | head -1 || true)"
|
|
[ -n "$ELF" ] || { echo "No archived ELF matches '$2' in .pio/elves/" >&2; exit 1; }
|
|
echo "using ${ELF#$ROOT/}" >&2
|
|
DOCKER_EXTRA=(-v "$(dirname "$CORE"):/core:ro")
|
|
run_in_container /pio/penv/bin/esp-coredump --chip esp32s3 info_corefile -t raw \
|
|
-g /pio/tools/tool-xtensa-esp-elf-gdb/bin/xtensa-esp32s3-elf-gdb \
|
|
-c "/core/$(basename "$CORE")" "/work/${ELF#$ROOT/}"
|