Перейти к содержанию

Обработчик паники 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 — неинициализированный или испорченный указатель
LoadStoreAlignment32-битный доступ по адресу, не кратному 4, или 16-битный по нечётному
LoadStoreError8- или 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 с), чтобы успеть прочитать вывод в терминале, который не умеет останавливать прокрутку.

Источники

  1. 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
  2. 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 — по умолчанию выключен
Страница помогла?

Нашли ошибку? ·