Обработчик паники ESP-IDF (panic handler)
Строка «Guru Meditation Error: Core 0 panic'ed (LoadProhibited)» и столбик адресов после неё — это не сам сбой, а отчёт обработчика паники ESP-IDF. Он перехватывает исключение процессора или фатальную проверку системы, печатает, что случилось, и решает, что делать дальше.
Обновлено Редакция GAW
Обработчик паники (panic handler) — код ESP-IDF, который получает управление, когда программа не может продолжаться: при исключении процессора или при срабатывании одной из системных защит. Он печатает в консоль причину в формате Guru Meditation Error: Core 0 panic'ed (IllegalInstruction), дамп регистров и backtrace, а затем — в зависимости от настройки — перезагружает чип, останавливает его или запускает отладочный сервер. Разбор самой частой причины — в вопросе «Guru Meditation Error LoadProhibited»; аналог для Cortex-M — HardFault.
Что приводит в обработчик
По руководству ESP-IDF Fatal Errors это:
- исключения процессора: Illegal Instruction, ошибки выравнивания и запрещённого доступа при чтении и записи (Load/Store), двойное исключение;
- системные проверки: таймаут Interrupt Watchdog; таймаут Task Watchdog — только при
CONFIG_ESP_TASK_WDT_PANIC; ошибка доступа к кешу; brownout; переполнение и повреждение стека; нарушение целостности кучи; проверки UBSAN; неудачныйassert.
Четыре варианта поведения
CONFIG_ESP_SYSTEM_PANIC | Что происходит |
|---|---|
| Print registers and reboot (по умолчанию) | печать регистров и backtrace, перезагрузка |
| Print registers and halt | то же, но чип остаётся остановленным до внешнего сброса |
| Silent reboot | немедленная перезагрузка без печати |
| Invoke GDB Stub | по UART поднимается сервер GDB; только чтение регистров, переменных и памяти, без точек останова и продолжения |
Три опции меняют это поведение. CONFIG_ESP_DEBUG_OCDAWARE (включена по умолчанию): если подключён отладчик по JTAG, управление передаётся ему, а регистры в консоль не печатаются. Если включён core dump, состояние задач сохраняется во флеш или выводится в UART. CONFIG_ESP_PANIC_HANDLER_IRAM (выключена по умолчанию) переносит код обработчика из флеш в IRAM — нужно, когда сбой происходит при отключённом кеше флеш, например во время записи во флеш. Есть и задержка перед перезагрузкой CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS (по умолчанию 0, до 99 с). На время работы обработчика RTC-сторож перенастраивается на 10 с: если обработчик сам завис, чип перезагрузится.
Дамп регистров и backtrace
Регистры печатаются из кадра исключения — такими, какими они были в момент сбоя. При таймауте Interrupt Watchdog добавляются EPC1–EPC4 и регистры другого ядра; при вызове abort() дамп не печатается. Строка Backtrace: — пары PC:SP на каждый кадр стека; IDF Monitor переводит адреса в функции и строки, и верхняя строка указывает место ошибки. Если сбой случился в обработчике прерывания, в backtrace попадут кадры и прерванной задачи, и самого обработчика.
Основные причины из списка Guru Meditation Errors:
| Причина | Типичный источник по ESP-IDF |
|---|---|
| IllegalInstruction | функция задачи FreeRTOS вернулась вместо vTaskDelete(); сбой чтения кода из флеш из-за перенастроенных выводов SPI; выход из non-void функции C++ без return |
| InstrFetchProhibited | вызов по неверному указателю на функцию; PC равен нулю или содержит мусор |
| LoadProhibited, StoreProhibited | чтение или запись по неверному адресу; адрес в EXCVADDR: ноль — NULL-указатель, около нуля — поле структуры по NULL, вне диапазона 0x3Fxxxxxx–0x6xxxxxxx — неинициализированный или испорченный указатель |
| LoadStoreAlignment | 32-битный доступ по адресу, не кратному 4, или 16-битный по нечётному |
| LoadStoreError | 8- или 16-битный доступ к памяти команд (IRAM, IROM) или запись в IROM/DROM |
| Cache error | обращение к флеш, когда кеш отключён (запись во флеш через spi_flash API): обработчики без ESP_INTR_FLAG_IRAM на это время выключаются, а обработчик с этим флагом обязан держать весь код и данные в IRAM/DRAM |
| Interrupt wdt timeout on CPU0/1 | заблокированные прерывания, см. Interrupt Watchdog |
Переполнение стека ESP-IDF умеет ловить watchpoint'ом на последних 32 байтах стека задачи с сообщением «Stack canary watchpoint triggered» — если включена опция CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK (по справочнику опций для ESP32 она по умолчанию выключена). При отладке через OpenOCD обработчик паники не перезагружает чип, а останавливает его на проблемной инструкции.
Частые вопросы
Что означает Guru Meditation Error на ESP32?
Так ESP-IDF начинает сообщение обработчика паники о фатальной ошибке; в скобках — причина. Для исключений процессора это, например, IllegalInstruction, LoadProhibited или StoreProhibited; для системных проверок — Interrupt wdt timeout или Cache error. Ниже печатаются регистры и backtrace, по которому IDF Monitor показывает функцию и строку, где произошёл сбой.
Как прочитать backtrace ESP32?
Строка Backtrace состоит из пар PC:SP — счётчик команд и указатель стека для каждого кадра стека задачи. Если запущен IDF Monitor, адреса автоматически переводятся в имена функций, файлы и строки: место ошибки — верхняя строка, ниже — цепочка вызовов. Если сбой случился в прерывании, в backtrace попадут кадры и прерванной задачи, и обработчика. Для LoadProhibited и StoreProhibited дополнительно смотрят регистр EXCVADDR: ноль означает разыменование NULL-указателя.
Можно ли не перезагружать чип после паники?
Да, через CONFIG_ESP_SYSTEM_PANIC. По умолчанию чип печатает регистры и перезагружается; вариант «Print registers and halt» оставляет его остановленным до внешнего сброса; «Invoke GDB Stub» запускает по UART сервер GDB, в котором можно читать регистры, переменные и память, но нельзя ставить точки останова и продолжать выполнение. Отдельно есть задержка перезагрузки CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS (до 99 с), чтобы успеть прочитать вывод в терминале, который не умеет останавливать прокрутку.
Источники
- Espressif. ESP-IDF Programming Guide v6.1, ESP32: Fatal Errors — Overview: исключения процессора (Illegal Instruction, Load/Store Alignment, Load/Store Prohibited, Double Exception) и системные проверки — таймаут Interrupt Watchdog, таймаут Task Watchdog (фатален только при CONFIG_ESP_TASK_WDT_PANIC), ошибка доступа к кешу, brownout, переполнение стека, защита стека, целостность кучи, UBSAN, assert; Panic Handler: печатает причину — «Guru Meditation Error: Core 0 panic'ed (IllegalInstruction). Exception was unhandled.»; CONFIG_ESP_SYSTEM_PANIC: печать регистров и перезагрузка (по умолчанию), печать и остановка (нужен внешний сброс), тихая перезагрузка, GDB stub (только компонент esp_gdbstub, отладка только чтение); CONFIG_ESP_DEBUG_OCDAWARE по умолчанию включён — при подключённом JTAG-отладчике выполнение останавливается и передаётся ему, регистры не печатаются; Core Dump — состояние во флеш или UART; CONFIG_ESP_PANIC_HANDLER_IRAM по умолчанию выключен — код обработчика во флеш, при сбое с выключенным кешем обработчик сам включает кеш; CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS — задержка перезагрузки; Register Dump and Backtrace: регистры из кадра исключения, при abort() дамп не печатается, при таймауте IWDT — дополнительно EPC1–EPC4 и регистры другого ядра; backtrace — пары PC:SP на каждый кадр стека, IDF Monitor переводит адреса в функции и строки, место ошибки — верхняя строка; GDB Stub: сервер GDB по UART, можно смотреть регистры и память, нельзя ставить точки останова и продолжать; RTC Watchdog Timeout: в обработчике паники RTC_WDT перенастраивается на 10 с; Guru Meditation Errors: IllegalInstruction (возврат из функции задачи FreeRTOS, сбой чтения флеш из-за перенастроенных выводов SPI, выход из non-void функции C++ без return), InstrFetchProhibited (вызов по неверному указателю на функцию, PC ноль или мусор), LoadProhibited/StoreProhibited (адрес в EXCVADDR, ноль — NULL-указатель, около нуля — поле структуры по NULL, вне 0x3fxxxxxx–0x6xxxxxxx — неинициализированный или испорченный указатель), IntegerDivideByZero, LoadStoreAlignment, LoadStoreError (8- и 16-битный доступ к IRAM/IROM, запись в IROM/DROM), Unhandled Debug Exception (BREAK), Interrupt Watchdog Timeout, Cache error (при работе spi_flash API кеш временно отключён, задачи приостановлены, обработчики без ESP_INTR_FLAG_IRAM выключены; обработчики с этим флагом должны держать код и данные в IRAM/DRAM); Brownout — «Brownout detector was triggered», затем сброс; Stack overflow — watchpoint на последних 32 байтах стека, «Stack canary watchpoint triggered»; Stack smashing; UBSAN
- Espressif. ESP-IDF Programming Guide v6.1, ESP32: Configuration Options Reference — CONFIG_ESP_SYSTEM_PANIC — варианты PRINT_HALT, PRINT_REBOOT, SILENT_REBOOT, GDBSTUB; CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS — 0–99 с, по умолчанию 0; CONFIG_ESP_DEBUG_OCDAWARE — по умолчанию включён; CONFIG_ESP_PANIC_HANDLER_IRAM — по умолчанию выключен; CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK — по умолчанию выключен
Нашли ошибку? ·
Смотрите также
- Core dump ESP-IDFСнимок стеков и регистров задач при панике: раздел coredump, формат ELF, разбор idf.py coredump-info
- Interrupt Watchdog Timer (IWDT)Сторож прерываний ESP-IDF: заблокированный тик FreeRTOS, долгие ISR и критические секции
- Task Watchdog Timer (TWDT)Сторож задач ESP-IDF: idle-задачи по умолчанию, 5 с, подписка и сброс из задачи
- Сторожевой таймерWatchdog: сброс МК при зависании программы
- JTAGПоследовательный интерфейс тестирования и отладки по IEEE 1149.1: TCK, TMS, TDI, TDO
- OpenOCDОткрытый сервер отладки: адаптеры, конфигурации, порты GDB и telnet, запись флеш
- HardFaultИсключение Cortex-M при необработанной ошибке
- Что значит Guru Meditation Error (LoadProhibited) на ESP32?EXCVADDR = 0 — NULL-указатель; место ошибки — первая строка Backtrace
- Можно ли отключить детектор просадки питания (brownout) на ESP32?Технически да, но порог 2,43 В уже ниже 3,0 В — после отключения сбои станут тише и хуже