ハードウェアトレース

Note

SOLID 2.2.0 以降で使用できます。

概要

ARMプロセッサの ETB または ETR ユニットの機能を使用し、命令トレースを取得・表示します。

ETBトレース

CPU内蔵のトレース専用メモリにトレース情報を保存します。ターゲットの動作パフォーマンスに影響を与えませんが、保存可能なサイズが少ないというデメリットがあります。 利用可能な内蔵メモリのサイズはターゲットに依存しますが、一般的に8KBから64KB程度です。

ETRトレース

ターゲットのRAM上にトレース情報を保存します。使用するサイズを指定可能で、ETBトレースと比べて大きなサイズのメモリを確保できます。 ただし、メモリバスを占有し、システムのパフォーマンスに大きな影響を与える可能性があります。また、メモリ帯域の問題でトレースデータのオーバーフローが多発する可能性があります。


利用可能なターゲット

  • ETBトレースを使用するには、SoCにETB(ETF)ユニットが搭載されている必要があります。

  • ETRトレースを使用するには、SoCにETRユニットが搭載されている必要があります。


準備

  • デバッガコンフィグ (jetarm.cfg) のROMテーブル設定 (CS_ROM_TBL) に、必要なCoreSightコンポーネントのアドレスが正しく記述してください。

    • ETBを使用する場合は、ETM/ETB(ETF)/Funnel の設定が必要です。

    • ETRを使用する場合は、ETM/ETR/Funnelの設定が必要です。

ETBの設定

  1. プロジェクトのプロパティを開き 構成プロパティ ‣ デバッグ ‣ ハードウェアトレース を編集します。

../_images/hwtrace-select-etb.png
  1. ハードウェアトレースの設定ダイアログで、 トレースタイプETB に設定し、取得したいコアにチェックを入れます。

Note

ETBはトレースメモリが小さいため、複数コアを同時に選択すると目的の範囲のトレースを取得できない可能性が高くなります。

../_images/hwtrace-settings-etb.png

ETRの設定

ETRを使用する場合は、トレースデータをターゲット上のRAMに保存するため、その物理アドレスを指定する必要があります。 ここでは、メモリマップデザイナと連携する方法について解説します。

  1. ハードウェアトレースの設定ダイアログで、 トレースタイプETR に設定し、 SMMのシンボルからアドレスとサイズを取得 にチェックを入れます。

../_images/hwtrace-settings-etr.png

メモリマップデザイナと連携しない場合には、直接物理アドレスとサイズを指定してください。この場合、プログラムが使用するメモリ領域と重ならないように注意してください。

  1. メモリマップデザイナに ETR という名前でメモリ領域を作成し、Attributeも ETR に設定します。 このとき、物理メモリを必ず指定してください。仮想アドレスは NO_ADDRESS で問題ありません。

../_images/hwtrace-etr-smm.png

トレースデータの参照

デバッグを開始し、ブレーク後にメニューの デバッグ(D) ‣ ウィンドウ(W) ‣ ハードウェアトレース からトレースウィンドウを開くと、 実行を開始してからブレークするまでの実行履歴(トレースパケット)のダンプ結果が表示されます。

../_images/hwtrace-dump.png

コンテキストメニューから、逆アセンブルや関数表示などを選択すると、表示を切り替えられます。

../_images/hwtrace-options.png

逆アセンブル表示

実行履歴を逆アセンブルで表示します。

../_images/hwtrace-disas1.png

関数表示

関数の呼び出し履歴を表示します。

../_images/hwtrace-functions.png

表示コアの切り替え

他のCPUコアのトレースを表示したい場合は、ハードウェアトレースウィンドウ左上のドロップダウンリストからコア番号を選択してください。

../_images/hwtrace-core-select.png

トレース設定

設定を行うには、ハードウェアトレースウィンドウの左上の設定アイコンをクリックしてください。

../_images/hwtrace-window-setting.png

実行時のトレースの設定ダイアログが開きます。

../_images/hwtrace-trace-settings.png

サイクルカウンタ

この設定を有効にすると、逆アセンブル表示内に、Cycle count: に続いてサイクル数が表示されるようになります。 しきい値 を指定すると、サイクルカウントがこの値に達するまで出力されなくなります。

Note

しきい値を小さい値にした場合、より細かい範囲で実行に要したサイクル数を知ることができますが、サイクルカウンタのデータが頻繁に出力されトレースデータが増加するため、オーバーフローに繋がる可能性があります。

以下の画像は、サイクル数の表示例です。ある区間にかかったサイクル数を確認できます。 オーバーフローなど、何らかの原因でサイクルカウント出力が抑制される事があり、その場合には Unknown が表示されます。

../_images/hwtrace-cycle-count.png

ストールモード(オーバーフロー抑制)

Note

実装依存の機能のため、ターゲットによっては利用できない場合があります。

この設定を有効にすると、トレースユニットのFIFO内のデータがある一定のレベルに達した時に、CPUを停止させてオーバーフローを防ぎます。 ただし、頻繁にオーバーフローする環境で有効にすると、実行パフォーマンスに大きな影響を与えるため注意が必要です。

アドレス範囲

タスクIDやアドレスでトレースの範囲を絞り込むことが出来ます。

タスクID を指定すると、そのタスク以外のトレースが出力されなくなります。 また、開始アドレス終了アドレス を指定すると、そのアドレス範囲を実行したときのみにトレースが出力されます。

この設定によって劇的にトレースデータの量が削減できる可能性があるため、少ないトレースメモリ量でも対象の解析がしやすくなる場合があります。 また、トレースバスやターゲットメモリへの負荷も軽減され、トレースのオーバーフローを抑制する効果も期待できます。


参考

ETBとETRの比較

ETB

ETR

取得可能なトレースの量

オーバーフローの発生頻度

ターゲットへの負荷

設定の手間

  • ETBはCPUに内蔵されているトレース専用のメモリにトレースデータを保存するため、実行中のターゲットには影響をほぼ与えませんが、メモリサイズが小さい(8KB~64KB)ので、解析したい範囲が限定的な場合に向いています。

  • ETRはターゲットのRAMを使用するため、アドレスを設定(物理アドレス)する必要があります。また、DRAMコントローラが初期化される前には使用できません。

  • トレースのオーバーフローは、ターゲットプログラムの性質、トレースバスの帯域によって発生頻度が変化します。また、ETRの場合にはターゲットのメモリ帯域も影響します。

    • タイトなループを回っている場合(ブランチが多い場合)、トレースパケットのサイズが爆発しオーバーフローが発生する確率が高くなります。また、直接ブランチよりも間接ブランチが多い場合に発生しやすくなります。

    • トレースバスの帯域はターゲットとなるSoCに依存します。

    • ターゲットのメモリ帯域はSoCの他に、動作中のプログラムのメモリアクセス頻度も影響します。