関数トレース
Note
SOLID 1.4.0 以降で使用できます。スターターキットでは使用できません。
概要
引数付きの関数トレース情報をターゲットのメモリに保存し、結果をIDEで表示します。 clangでのみ使用できます。(gccを選択している場合はオプションが表示されません。)
準備
プロパティシート変更
プロパティシートのユーザマクロに、LibXRayTrace
を追加し、値を true
にしてください。
メモリ領域の割り当て
メモリマップデザイナで、FTRACE
という名前のメモリ領域を割り当ててください。
サイズは、最低でも 8Kバイト * コア数分 程度必要です。この設定が無い場合には、malloc()
でヒープからメモリを確保してしまうので、
メモリマップデザイナでの割当を推奨します。
インストルメンテーションの有効化
トレースを有効にしたいプロジェクトのプロパティを開き、 はい にしてください。
を命令のしきい値を指定すると、指定された命令数以上に展開される関数にのみ適用されます。 指定しない場合は 200命令 となります。1を指定すると、すべての関数に適用されますが、 小さくて頻繁に実行される関数にコードが追加されると、 著しくパフォーマンスが低下する可能性がありますので注意してください。
関数へのパッチ適用
コンパイル、実行後に適当な場所でブレークし、メニューの Patch all をクリックし、 関数にパッチを当てます。
から関数トレースウィンドウを開きます。次に ウィンドウの右側にある実行と結果表示
再実行すると、トレースデータの収集が開始されます。 ブレーク後に、関数トレースウィンドウにある Save trace data をクリックしてください。
データの欄に取得した日付が表示されるので、▷ をクリックして展開し、CPU番号をダブルクリックしてください。
結果が表示されます。
ウィンドウ上段には、タスクの遷移が時間とともに表示されます。 下段には、関数名が呼び出された順に表示されます。表示される項目は以下のとおりです。
- タイプ
関数が呼び出された (entry)、関数からリターンした (exit) のどちらか。
- 名前
関数名。
- 深さ
関数の呼び出し階層の深さ。
- 間隔
関数が呼び出されてから、リターンするまでの時間。 entry で間隔が表示されている場合は、それ以上呼び出される関数がないleaf関数です。間隔が表示されていない場合、さらに呼び出される関数が存在します。
- 時間
ターゲットのタイマから取得した時間。
- タスク
タスクID。
- 引数
関数に引数がある場合、その値が4つまで表示されます。それ以上の引数は ??? 表示になります。
その他の使い方
特定の関数にパッチを当てる
関数トレースウィンドウにある、Patch をクリックすると、 パッチを当てる関数を選択するウィンドウが表示されます。 検索などで関数を絞り込み、選択して OK を押すとパッチが適用されます。
これで選択した関数のトレースのみが取得できるようになります。
パッチの無効化
関数トレースウィンドウから Unpatch を実行すると、パッチ非適用状態に戻るので、 トレースを収集する、ランタイムコードが実行されずパフォーマンス低下が最小限になります。
制限事項
トレースを取得できるタスクは現状63までです。
関数の呼び出しの深さは64までです。
clangの機能を使用しているため、gccでは使用できません。