2017-02-06 8 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のスタックフレームを配置するための3つの可能性について説明します。これを計算する(実行イメージに含まれていない)コンパイラが生成したデバッグ情報を使用して

  • を。
  • コンパイラが生成したスタックアンワインディング(例外処理)情報(実行可能イメージに含まれています)を使用して計算します。
  • コール・サイトをスキャンして、スタック・ポインタを調整するプロローグまたはエピローグ・コードを見つけ、そのスタック・フレーム・アドレスを推測します。

明らかに、非常にコンパイラオプションとコンパイラオプションに依存し、すべてのケースで動作することは保証されていません。

+0

スタックトレースを調べるために(gnu)ツールを使用しようとしていることについて、まさにCortex-mの質問が無数にあります。コードを見るだけで、スタックの巻き戻し方法(逆アセンブリと現在のpcとsp値)を知ることができます。 –

+0

@old_timer:3つ目の手法は、プログラムごとにOPごとに行われますが、手動による検査でも同じ原則が適用されます。 – Jeremy