18

CentOS リポジトリの標準 gcc 4.4 パッケージを使用して、64 ビット CentOS 5.8 で静的にリンクされた 64 ビット C++ アプリケーションを開発しています。予想以上にメモリを使用しているように見えるので、massif を使用してメモリ使用量をプロファイリングしてみました。デバッグ情報をコンパイルして実行しました

valgrind --tool=massif ./MyProg

MyProg が存在するディレクトリから。次の massif.out.XXXX の例以外の結果は生成されません。

desc: (none)
cmd: ./MyProg
time_unit: i
#-----------
snapshot=0
#-----------
time=0
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty

これはファイルの内容全体であり、私のプログラムは何分間も実行できることに注意してください。

valgrind と massif にさまざまなオプションを試しましたが、役に立ちませんでした。念のため、MyProg への絶対パスを使用してみました。valgrind の最新の安定バージョン (3.8.1) をダウンロードしてコンパイルして実行しようとしましたが (CentOS は 3.5.0 を使用しているため)、同じ結果が得られました。健全性チェックとして実行しました

valgrind --tool=massif ls -l

また、予想どおり、ゼロ以外のメモリ使用量で複数のスナップショットを作成しました。

考えられるあらゆるキーワードの組み合わせを使用してオンラインで検索してみましたが、同様の問題は見つかりませんでした。

余談ですが、valgrind のデフォルトの memcheck ツールを使用して、アプリケーションのプロファイルを正常に作成できます。これが役立つ情報である場合に備えてです。

massif がアプリケーションのプロファイリングに失敗する理由を知っている人はいますか?

4

1 に答える 1

19

アプリケーションが静的にリンクされている場合、valgrind を使用して分析することはできません。Valgrind は、独自のバージョンの割り当て関数をプログラムに提供することによって機能します。これは、動的ルックアップをオーバーライドすることによって実現されます。

標準ライブラリ (libc および libstdc++) と動的にリンクできる場合は、探しているメモリ分析を実行できるはずです。

Valgrind FAQから:

次に、プログラムが静的にリンクされている場合、malloc などの特定の関数を独自のバージョンに置き換えることができないため、ほとんどの Valgrind ツールは同様に機能しません。

于 2012-11-27T19:38:06.223 に答える