1. ホーム
  2. c++

[解決済み] CまたはC++でコールスタックを印刷する

2022-04-27 09:03:56

質問

CまたはC++で実行中のプロセスで、ある関数が呼び出されるたびにコールスタックをダンプする方法はありますか? 私が考えているのは、以下のようなものです。

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

ここで print_stack_trace と同じような働きをします。 caller をPerlで作成します。

あるいはこんな感じ。

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 

    // etc...
}

ここで register_stack_trace_function を実行するたびにスタックトレースが出力されるような、ある種の内部ブレークポイントを設置します。 foo が呼び出されます。

このようなものは、C言語の標準的なライブラリに存在するのでしょうか?

Linuxで、GCCを使っています。


背景

あるテスト実行で、本来は影響しないはずのコマンドラインスイッチによって、異なる動作をするものがあります。 私のコードには擬似乱数生成器があり、これらのスイッチに基づき異なる形で呼び出されていると推測されます。 私は、スイッチの各セットでテストを実行し、乱数ジェネレータがそれぞれ異なるように呼び出されるかどうかを確認できるようにしたい。

どのように解決するのですか?

linux だけで解決するには、次のようにします。 バックトレース(3) の配列を返すだけです。 void * (実際には、これらの各々は対応するスタックフレームからのリターンアドレスを指しています)。これらを実用的なものに変換するには、次のようにします。 バックトレースシンボル(3) .

に注意してください。 backtrace(3) のノートセクション :

シンボル名は使用できない場合があります 特別なリンカーを使用しない限り オプションを使用します。 GNUリンカを使用しているシステムでは、GNUリンカのオプションである -ダイナミックリンカー オプションで指定します。 static"関数の名前は公開されないことに注意してください。 であり バックトレースで利用可能です。