[esp32] Preserve crash data across OTA rollback reboots

Don't clear the crash data magic marker at boot time. Previously,
crash_handler_read_and_clear() would clear the magic immediately,
so if OTA rollback triggered a reboot before an API client connected,
the crash trace was lost.

Now the magic is only cleared after crash_handler_log() delivers the
data to an API client via crash_handler_clear().
This commit is contained in:
J. Nick Koston
2026-04-08 09:31:30 -10:00
parent 9bf53e0ab8
commit 2ab7f032a8
3 changed files with 15 additions and 3 deletions
+1
View File
@@ -276,6 +276,7 @@ class APIConnection final : public APIServerConnectionBase {
App.schedule_dump_config();
#ifdef USE_ESP32_CRASH_HANDLER
esp32::crash_handler_log();
esp32::crash_handler_clear();
#endif
#ifdef USE_RP2040_CRASH_HANDLER
rp2040::crash_handler_log();
+7 -2
View File
@@ -101,12 +101,17 @@ void crash_handler_read_and_clear() {
if (s_raw_crash_data.pseudo_excause > 1)
s_raw_crash_data.pseudo_excause = 0;
}
// Clear magic regardless so we don't re-report on next normal reboot
s_raw_crash_data.magic = 0;
// Don't clear magic here — crash data must survive OTA rollback reboots.
// Magic is cleared by crash_handler_clear() after an API client receives the data.
}
bool crash_handler_has_data() { return s_crash_data_valid; }
void crash_handler_clear() {
s_raw_crash_data.magic = 0;
s_crash_data_valid = false;
}
// Look up the exception cause as a human-readable string.
// Tables mirror ESP-IDF's panic_arch_fill_info() which uses local static arrays
// not exposed via any public API.
+7 -1
View File
@@ -4,12 +4,18 @@
namespace esphome::esp32 {
/// Read crash data from NOINIT memory and clear the magic marker.
/// Read and validate crash data from NOINIT memory.
/// Does not clear the magic marker — call crash_handler_clear() after
/// the data has been delivered to an API client so it survives OTA rollback reboots.
void crash_handler_read_and_clear();
/// Log crash data if a crash was detected on previous boot.
void crash_handler_log();
/// Clear the magic marker and mark crash data as consumed.
/// Call after the data has been delivered to an API client.
void crash_handler_clear();
/// Returns true if crash data was found this boot.
bool crash_handler_has_data();