2016-12-24 5 views
0

バックグラウンドを与えるために、コールスタックに基づいたログメッセージをきちんと表示したいと思います。コールスタック内の関数の位置を取得する方法は?

たとえば、

は、私はこれらの関数の引数としてスペースの数を渡すか、または同じのグローバルカウントを維持したくない

foo(){ 
    printf("Foo was called"); 
    bar(); 
} 

bar(){ 
    printf("bar was called"); 
    jai(); 
} 
jai(){ 
    printf("Jai was called"); 
} 

<<<OUTPUT>>> 
Foo was called. 
    bar was called 
     jai was called. 

として出力を与える必要があります。

コールスタック内の関数の位置を取得できれば、必要な出力形式を得るために、テキストの前に同じ数の空白を埋め込むことができると私は考えていました。

backtrace関数呼び出しでは、スタック名全体が返されます。コールの関数の総数も返します。

位置を返す関数はありますか?

+0

「呼び出しスタックの関数の位置を取得できます_」:これは実行する命令が多数あり、パラメータまたはグローバル変数です。 –

答えて

2

コールの関数の合計数も返します。
位置のみを返す関数はありますか?

これらは同じものです。

コールスタックがある場合:

main -> foo -> bar -> jai 

、あなたはjaiは4つのレベルの深であることを知ってほしい、そして機能の総数はjaiのレベルです。

mainを無視し、「自分の」関数だけをカウントする場合は、合計関数数から1を引いてください。

2

既存のライブラリを使用することをお勧めします。

すべてのコード(あるいは少なくとも大半は)(Linuxの場合)DWARFフォーマットで情報*をデバッグしてコンパイルされている場合は、私は(独立GCCの内部で使用されるが、使用可能な)イアン・テイラーのlibbacktraceをお勧めします。 DWARFデバッグ情報が利用可能な場合でも、ソース位置情報を与えることさえできます。

また、GNU glibc backtrace functionsを使用することもできます。

GCCのreturn address builtinsも参照してください。

注*:あなたが有効にデバッグ情報と最適化の両方を持っているgccまたはg++コンパイラに-g-O2の両方を渡すことができます。

関連する問題