2024年5月5日日曜日

instrument_functionで関数トレースをしてみる

モチベーション

ちょっとした動作確認を行った場合、コールツリーなどをチェックしたいということがありました。
わざわざ、関数にDebug Printを入れ込むのも面倒だなと言うことなので、ちょっと調査しました。

実現方法

1 . コンパイルオプション -finstrument-functions を設定してコンパイル 2 . 関数のentry/exitで以下の関数が呼び出される

  void __cyg_profile_func_enter(void *func_address, void *call_site) // func_addressが呼び出される関数アドレス、call_siteは呼び出しもとの関数アドレス
  void __cyg_profile_func_exit(void *func_address, void *call_site)

3 . この関数の中で、アドレスから関数名に変換する仕組みを入れることにより、 コールツリーが確認できる。 ※cyg_profile_func_enter/exit自体はフック対象外とするため、 -finstrument-functionsの対象外とする必要がある。

実装したサンプルコードはこちら サンプルコード

ちなみにstatic関数のコールトレースはできない。    staticを空のマクロ定義にして、読み出せるようにするなどで実現できるが、関数名の衝突などがありそうなため、うまくできるかは微妙。

改善点

  • 関数名までなので、引数も表示できるようにしたい。
    • libdwarfを使うとできるよう。

 

0 件のコメント:

コメントを投稿