2017-04-20 9 views
2

にコールスタックの深さを取得します。ねじれは私が自動的にコールスタックにその深さに応じてプリントアウトをインデントしたいということですので、私は<strong>LINE</strong>、<strong>FILE</strong>、<strong>FUNC</strong>といくつかの他のものを印刷し、デバッグ印刷機能を書きたいのgcc

main.c:55:main() 
    functions.c:33:function1() 
    functions.c:133:function2() 
     functions.c:33:function1() 
     functions.c:33:function1() 

のようなものは、関数1はすぐに返された場合、および機能2は二回関数1を呼び出します。

これは、関数が呼び出されるたびにインクリメントされ、関数が返されるたびにデクリメントされるグローバル変数を使用することで可能になると思いますが、コードベースの再補完が必要になります。簡単な方法があるのか​​どうか疑問に思っていましたか?

標準的なGNUであれば解決策が非標準のCであれば構いません。

+0

[ヒント](https://でアン。 wiktionary.org/wiki/BTDT):スタックの高さを制限して、コードの検索がスタックの深さに達するように制御します。 – chux

答えて

3

これは、Gccのコードプロファイリングオプションで行うことができます。 https://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Code-Gen-Options.html

-finstrument-機能
機能への入口と出口のための計装の呼び出しを生成します。ファンクション入力の直後にファンクション が終了する直前に、現在のファンクションのコールアドレスと のアドレスを使用して、次のプロファイリング関数がコールされます。 (呼び出しサイトの情報は 機能それ以外の場合は、プロファイリングに使用できない場合がありますので、いくつかのプラットフォームでは、 __builtin_return_addressは、現在の機能を超えて動作しません。)

void __cyg_profile_func_enter (void *this_fn, 
           void *call_site); 
void __cyg_profile_func_exit (void *this_fn, 
           void *call_site); 
+0

それは素晴らしいです!私が正しく理解していれば、GCCはプロトタイプしか提供しません.GCCはどのような方法でそれらを実装するのですか? – user7893856

関連する問題