関数トレース

Note

SOLID 1.4.0 以降で使用できます。スターターキットでは使用できません。

概要

引数付きの関数トレース情報をターゲットのメモリに保存し、結果をIDEで表示します。 clangでのみ使用できます。(gccを選択している場合はオプションが表示されません。)


準備

プロパティシート変更

プロパティシートのユーザマクロに、LibXRayTrace を追加し、値を true にしてください。

メモリ領域の割り当て

メモリマップデザイナで、FTRACE という名前のメモリ領域を割り当ててください。 サイズは、最低でも 8Kバイト * コア数分 程度必要です。この設定が無い場合には、malloc() でヒープからメモリを確保してしまうので、 メモリマップデザイナでの割当を推奨します。

../_images/ftrace-memmap.png

インストルメンテーションの有効化

トレースを有効にしたいプロジェクトのプロパティを開き、 C/C++ ‣ XRay ‣ XRayインストルメンテーションの有効化はい にしてください。

命令のしきい値を指定すると、指定された命令数以上に展開される関数にのみ適用されます。 指定しない場合は 200命令 となります。1を指定すると、すべての関数に適用されますが、 小さくて頻繁に実行される関数にコードが追加されると、 著しくパフォーマンスが低下する可能性がありますので注意してください。

関数へのパッチ適用

コンパイル、実行後に適当な場所でブレークし、メニューの デバッグ(D) ‣ ウィンドウ(W) ‣ 関数トレース から関数トレースウィンドウを開きます。次に ウィンドウの右側にある Patch all をクリックし、 関数にパッチを当てます。

../_images/ftrace-patch-functions.png

実行と結果表示

再実行すると、トレースデータの収集が開始されます。 ブレーク後に、関数トレースウィンドウにある Save trace data をクリックしてください。

../_images/ftrace-saving.png

データの欄に取得した日付が表示されるので、 をクリックして展開し、CPU番号をダブルクリックしてください。

../_images/ftrace-select-cpu.png

結果が表示されます。

../_images/ftrace-result1.png

ウィンドウ上段には、タスクの遷移が時間とともに表示されます。 下段には、関数名が呼び出された順に表示されます。表示される項目は以下のとおりです。

タイプ

関数が呼び出された (entry)、関数からリターンした (exit) のどちらか。

名前

関数名。

深さ

関数の呼び出し階層の深さ。

間隔

関数が呼び出されてから、リターンするまでの時間。 entry で間隔が表示されている場合は、それ以上呼び出される関数がないleaf関数です。間隔が表示されていない場合、さらに呼び出される関数が存在します。

時間

ターゲットのタイマから取得した時間。

タスク

タスクID。

引数

関数に引数がある場合、その値が4つまで表示されます。それ以上の引数は ??? 表示になります。


その他の使い方

特定の関数にパッチを当てる

関数トレースウィンドウにある、Patch をクリックすると、 パッチを当てる関数を選択するウィンドウが表示されます。 検索などで関数を絞り込み、選択して OK を押すとパッチが適用されます。

../_images/ftrace-patch.png

これで選択した関数のトレースのみが取得できるようになります。

../_images/ftrace-patch-result.png

パッチの無効化

関数トレースウィンドウから Unpatch を実行すると、パッチ非適用状態に戻るので、 トレースを収集する、ランタイムコードが実行されずパフォーマンス低下が最小限になります。


制限事項

  • トレースを取得できるタスクは現状63までです。

  • 関数の呼び出しの深さは64までです。

  • clangの機能を使用しているため、gccでは使用できません。