モチベーション
ちょっとした動作確認を行った場合、コールツリーなどをチェックしたいということがありました。
わざわざ、関数に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 件のコメント:
コメントを投稿