覚書ブログ
覚えられないので書いておきます。
2024年5月5日日曜日
instrument_functionで関数トレースをしてみる
# モチベーション ちょっとした動作確認を行った場合、コールツリーなどをチェックしたいということがありました。 わざわざ、関数にDebug Printを入れ込むのも面倒だなと言うことなので、ちょっと調査しました。 # 実現方法 1 . コンパイルオプション ```-finstrument-functions``` を設定してコンパイル 2 . 関数のentry/exitで以下の関数が呼び出される ```c 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```の対象外とする必要がある。 実装したサンプルコードはこちら [サンプルコード](https://github.com/ponta027/c_lang_sandbox/tree/main/function_trace) ちなみにstatic関数のコールトレースはできない。 staticを空のマクロ定義にして、読み出せるようにするなどで実現できるが、関数名の衝突などがありそうなため、うまくできるかは微妙。 # 改善点 * 関数名までなので、引数も表示できるようにしたい。 * libdwarfを使うとできるよう。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿