2017-02-06 17 views
0

Когда я сталкиваюсь с обработчиком ошибок на своем ARM cortex-M4 (Thumb), я получаю снимок регистра CPU незадолго до возникновения ошибки. С помощью этой информации я могу найти указатель стека, где он был. Теперь, я хочу, чтобы возвращаться через все функции, которые он передал. Единственная проблема, которую я вижу здесь, это то, что у меня нет указателя на фрейм, поэтому я не могу увидеть, где определенная подпрограмма сохранила LR, бесконечность.Stacktrace on ARM cortex-M4

Как решить эту проблему, если указатель рамки недоступен в r7?

+0

разобрать код и посмотреть, что находится в стеке. –

+0

Какой отладчик вы используете? Я знаю, что стек вызовов доступен на Keil Uvision. Вы отключаете какую-то ловушку? –

+0

@KooroshHajiani Я не использую отладчик, моя цель работает бесплатно и имеет возможность ведения журнала (printf-style). – Evert

ответ

0

This blog post обсуждает этот вопрос со ссылкой на архитектуру MIPS - принципы могут быть легко адаптированы к архитектурам ARM.

Короче говоря, он описывает три возможности для размещения стека для данного SP и PC:

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

Очевидно, что это очень зависит от компилятора и компилятора, и не гарантируется работа во всех случаях.

+0

есть бесчисленные вопросы о корекс-м в SO о попытке использовать инструменты (gnu) для проверки трассировки стека, кажется, что это сломано. Просто посмотрите на код и где вы находитесь, чтобы знать, как разматывать стек (разборка и текущие значения pc и sp). –

+0

@old_timer: Третий метод делает именно это - программно, согласно OP, но ручная проверка применяет те же принципы. – Jeremy