0

valgrind を使用して、できればテキスト ファイルで、C++ プログラムによって呼び出された関数の時系列ログを取得したいと考えています。

以下のサンプル C++ プログラム (simple.cpp) の場合:

void baz(){
}

void bar(){
  for(int i = 0; i < 3; i++)
    baz();
}

void foo(){
  bar();
}

int main(){
  foo();
  return 0;
}

取得したい main() -> foo()-> bar->baz()*3

私が試したこと:

としてコンパイルしg++ -g simple.cpp -o simple.out て実行valgrind --tool=callgrind ./simple.outし、取得しますcallgrind.out.3519

実行callgrind_annotate --tree=both callgrind.out.3519 | grep bazしても何も返されません。

関数kcachegrind callgrind.out.3519のソース コード ビュー内を移動するとmain()、呼び出しが時系列で表示されます。

この情報だけをログに書き出す方法はありますか?

4

2 に答える 2

0

clog << "functionname"; と書くだけです。すべての機能で。パフォーマンスが低下しますが、それがロギングの目的です。

呼び出しを追跡したい場合は、関数ポインターがない限り、呼び出し元グラフを生成できる doxygen doku をコメントしてビルドすることをお勧めします。

それがあなたに合わない場合は、そのログが必要な理由を正確に知る必要があります.

于 2013-06-04T07:06:13.787 に答える
0

callgrind_annotate は、callgrind によって生成されたデータでこれを正確に行うことを意図しているようです。単純な例で「baz」が表示されない理由は、単純に、テスト コードが非常に高速に実行されるため、オーバーヘッド コード (動的ライブラリの読み込みコードなど) 内で費やされる時間と比較して、テスト コード内で費やされる実行時間が見劣りするからです。

しきい値パラメーターを使用して、callgrind_annotate に baz を含めることができます。

callgrind_annotate --threshold=100 --tree=both callgrind.out.3519 | grep baz

または、例を変更することによって:

int main(){
  for(int i=0;i<1000000;i++9 {
    foo();
  }
  return 0;
}
于 2013-06-04T17:19:18.893 に答える