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

Stack Unwind для ARM

Здравствуйте.

Появилась необходимость удалённой отладки устройства. Для чего хотелось бы сохранить Call Stack в энергонезависимую память по запросу ( HardFault, WD, внешний запрос)

Не очень понятно как правильно развернуть стэк в bare metal...

На сколько я понимаю это нетривиальная задача . Может есть готовые решения под С и GCC?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, MKdemiurg сказал:

На сколько я понимаю это нетривиальная задача . Может есть готовые решения под С и GCC?

Что именно в ней "нетривиального"? Стек - это просто область памяти. Берёте и сохраняете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой толк от полученной каши в виде каких-то там дампов памяти? В МК понятно, взял и сохранил сколько нужно.

Вот только получить такой же вид, как это делает IDE в момент отладки ПО, не так просто: IDE в отладочной сессии генерит себе кучу вспомогательной информации.

Размотать Call Stack удаленно работающего бинарника без этой инфы занятие такое себе.

В первую очередь надо определиться с тем, как полученные дампы рабочей области стека МК быстро и наглядно расшифровать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jcxz said:

Что именно в ней "нетривиального"? Стек - это просто область памяти. Берёте и сохраняете.

ну это понятно. Мне надо его раскрутить потому что сохранять 4кБ такое себе...

2 minutes ago, Arlleex said:

Размотать Call Stack удаленно работающего бинарника без этой инфы занятие такое себе.

Ну по большому счету мне нужно получить только Call Tree, чтобы c .map уже пройтись  и выяснить поведение устройства перед HF

4 minutes ago, Arlleex said:

В первую очередь надо определиться с тем, как полученные дампы рабочей области стека МК быстро и наглядно расшифровать.

Да, это наверно правильно заданный вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, MKdemiurg сказал:

Ну по большому счету мне нужно получить только Call Tree, чтобы c .map уже пройтись  и выяснить поведение устройства перед HF

Если вы хотите получить тот же вид, что в отладчике, то очевидно и нужно делать то, что делает отладчик: Используя сохранённый дамп и отладочный elf-образ, сделать визуализацию на их основе.

PS: Эпическая задача. Если совсем уж нечем на работе заниматься.... :mosking:

...и для "выяснения поведения перед HF" это конечно делать не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, jcxz сказал:

PS: Эпическая задача. Если совсем уж нечем на работе заниматься.... :mosking:

На самом деле вполне интересная, если подойти творчески и сделать нечто бОльшее, чем текстовая плевалка в какую-нибудь черную консоль:smile:
 

Цитата

Используя сохранённый дамп и отладочный elf-образ, сделать визуализацию на их основе.

Отладчику проще: ему не нужен полный дамп, он в каждом сохраненном frame stack-е знает положение указателя PC и LR, поэтому может проходиться "по верхушкам", не имея всего дампа.
 

15 минут назад, jcxz сказал:

...и для "выяснения поведения перед HF" это конечно делать не нужно.

Соглашусь:smile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Arlleex said:

На самом деле вполне интересная

Кстати, да! Но я ограничился обработчиком HF, который выводит содержимое регистров и расшифровку их битов по мотивам документации с arm.com. Также вывожу по 32 слова MSP/PSP, которые, к слову, за несколько лет ни разу не пригодились мне. Но, ИМХО, вся эта информация полезна под отладчиком. Когда прибор работает уже на подстанции в шкафу и вылетает HF - это печально. Хотя однажды такое было, и всё же помогло по содержимому PC установить причину. Не сразу, конечно: вот она - проблема! Нет, потребовалось несколько дней с анализом других данных, пржде, чем проблема была обнаружена и устранена.

 

@MKdemiurg, а какая архитектура ядра? На Cortex-M3 и выше HF довольно информативен. А вот на Cortex-M0 - это игра на сообразительность: там данных очень мало. Нужно действительно думать и усиленно думать🤣💗

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Arlleex сказал:

Отладчику проще: ему не нужен полный дамп, он в каждом сохраненном frame stack-е знает положение указателя PC и LR, поэтому может проходиться "по верхушкам", не имея всего дампа.

Так сохранятель в прошивке - тоже знает их положение. Единственное, чего у него нет: elf-образа. Чтобы разрисовать красиво. Но если ТС будет при каждой перепрошивке устройства сохранять в свою энергонезависимую память и elf - то у него будут все возможности отладчика.

PS: Другое дело, что это - нафик не нужный сизифов труд. Многие годы уже сохраняю в энергонезависимую память стеки критических ошибок. В разных проектах. И ни разу мне не приходило в голову эмулировать "Call stack" отладчика.  :mosking:

У меня уже лет 15 примерно так выглядит дамп ловушки критической ошибки:

image.thumb.png.5dbc2243971e354f7fa05b6113218fdb.png

И мне его хватает для "раскрутки".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, haker_fox said:

 

 

@MKdemiurg, а какая архитектура ядра? На Cortex-M3 и выше HF довольно информативен. А вот на Cortex-M0 - это игра на сообразительность: там данных очень мало. Нужно действительно думать и усиленно думать🤣💗

M4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, jcxz said:

Так сохранятель в прошивке - тоже знает их положение. Единственное, чего у него нет: elf-образа. Чтобы разрисовать красиво. Но если ТС будет при каждой перепрошивке устройства сохранять в свою энергонезависимую память и elf - то у него будут все возможности отладчика.

PS: Другое дело, что это - нафик не нужный сизифов труд. Многие годы уже сохраняю в энергонезависимую память стеки критических ошибок. В разных проектах. И ни разу мне не приходило в голову эмулировать "Call stack" отладчика.  :mosking:

У меня уже лет 15 примерно так выглядит дамп ловушки критической ошибки:

image.thumb.png.5dbc2243971e354f7fa05b6113218fdb.png

И мне его хватает для "раскрутки".

Мне нужен backtrace.

И что вы потом делаете с дампом стека? вручную его раскручиваете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, MKdemiurg сказал:

И что вы потом делаете с дампом стека? вручную его раскручиваете?

Открываю дамп + открываю листинг и...... глазами и головой. Там вроде всё проще некуда.

15 минут назад, MKdemiurg сказал:

Мне нужен backtrace.

Для этого вам нужно либо трэйсер покупать и подключать; либо - МК с ETB. Никакой Call Stack не поможет в backtrace-е. В общем случае...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

которые, к слову, за несколько лет ни разу не пригодились мне.

Мне и ловушки-трейсеры стека (и дампа регистров) пригождались, разве что, пару раз за всю практику...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

однако для удалённой отладки и скажем так, ретроспективной, трейсы с записью в порт или во внутреннюю память, пожалуй наиболее адекватный путь, во всякой случае вызов процедуры копирования стека это более инвазивный и тяжелый по объёму данных метод.

Было время когда пару раз приходилось через светодиодик отлаживать, пачка импульсов с TRACE(...); на осциллограф и бумажка с карандашиком.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После танцев с бубном и поиска нашёл то, что было нужно.

А именно бэктрейс по стеку для армов от друзей из Солнечного Бейджина.

https://github.com/armink/CmBacktrace

Оно даже работает и можно просто по листингу пробежаться до инструкции вызывающей ХФ.

Конечно, при условии что стэк целый.

И это проще чем переделывать  _Unwind_Backtrace.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...