Skip to content

Парсинг исключений

Egor edited this page May 12, 2017 · 2 revisions

Парсинг исключений

После того, как Embox упал, вы увидите длинное сообщение.
Разберем его по порядку:

Тип исключения

***** Fatal exception 0

Тут важна циферка. Она указывает на тип ошибки.
Сопоставить циферку с типом можно посмотрев файл src/arch/xtensa/include/hal/exception.h

Регистры

pc=0x40258d5d sp=0x3ffffe70 excvaddr=0x00000000

ps=0x00000030 sar=0x00000000 vpri=0x00000001

С текущим уровнем развития наших технологий, информация не несет практического приминения.
При желании узнать про эти регистры можно тут (раздел 3.3 Registers)

r*: 0x* = *

В таком виде печатаются a0 - a15 регистры. Практического приминения так же не очень много.

Stack trace

Самое интересное идет в конце. Это вывод стека.
Он достаточно большой, чтобы полностью копировать его в документацию. Да и это не особо нужно.
Сейчас я расскажу, как им пользоваться.

  1. Нужно скопировать все, что находится между знаками равно (=).
  2. Затем, запускаем скрипт .decode-stacktrace.sh

    $ ./scripts/esp8266/decode-stacktrace.sh

  3. Вставляем туда то, что у нас скопировано
  4. ???
  5. Профит

Теперь мы видим непонятные упоминания некоторых функций.
Полезно обратить внимание на первую строку, в которой есть 0x*
Там будет упоминание о функции и файле, в которой выпало исключение


Известные баги:

  • Вместо циферок, которые указывают на строку/символ, стоят знаки вопроса
    Решение: добавить флаг компилятора -g

Ветка разработки: xtensa-esp8266-exceptions
Issue для обсуждения: Обработка исключений