予想外に大量のヒープ (約 3GB) を使用しているプログラムがあります。すべてのヒープメモリにまだ到達可能であると主張して、リークがないことを報告した valgrind memcheck を実行しました。
そこで、デバッグ オプションを使用してすべてのライブラリを再構築し、valgrind massif を介してプログラムを実行しました。私は Valgrind-3.8.1 を使用しています。これは、今日ダウンロードして自分のボックスにビルドしたばかりです。コマンドラインは次のとおりです。
valgrind --tool=massif myprog
Valgrind はエラーや警告を生成しませんでした。結果の出力ファイルは、割り当てられたすべてのメモリを報告していますが、大規模な割り当てのすべてのスタック トレースは、関数名またはコードの場所を特定できません。たとえば、次のようになります。
97.34% (2,595,141,447B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->88.67% (2,363,882,948B) 0xCA6ACC0: ???
| ->88.67% (2,363,882,948B) 0xC7D7A71: ???
| ->88.67% (2,363,882,948B) 0xC7D705E: ???
| ->88.67% (2,363,882,948B) 0xA6ACB65: ???
| ->59.01% (1,573,247,120B) 0xA6AC9BA: ???
| | ->59.01% (1,573,247,120B) 0x9410C08: ???
| | ->59.01% (1,573,247,120B) 0x94123E2: ???
| | ->59.01% (1,573,247,120B) 0x940B3E9: ???
| | ->59.01% (1,573,247,120B) 0x9428BC0: ???
| | ->59.01% (1,573,247,120B) 0x98B0564: ???
| | ->59.01% (1,573,247,120B) 0x9AF0DA0: ???
| | ->59.01% (1,573,247,120B) 0x9AF09BE: ???
| | ->59.01% (1,573,247,120B) 0x9AF0E6C: ???
| | ->59.01% (1,573,247,120B) 0x4CE6438: run_S (Thread.cpp:98)
| | ->59.01% (1,573,247,120B) 0x3A9A40683B: start_thread (in /lib64/libpthread-2.5.so)
| | ->59.01% (1,573,247,120B) 0x3A994D503B: clone (in /lib64/libc 2.5.so)
私は今少し立ち往生しています。私が構築したライブラリで実際にデバッグが有効になっていないかどうか疑問に思いましたが、gdb でコードを実行すると、すべてのデバッグ情報が含まれているように見えます。また、コードからの関数名と場所を識別する massif 出力には、他にもいくつかの (はるかに小さい) メモリ割り当ての結果があります。
これらの結果は、システムまたは外部ライブラリのスタック トレースを示していますか? だから情報がないの?これらの割り当てを追跡する方法を誰か提案できますか?