2012-06-28 11 views
15

私は次のパラメータを使用してValgrindを実行します。メモリリークでValgrindから完全なコールスタックを取得するには?

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes 

ログ、私がメインまでトレースフルスタックといくつかのエラーメッセージを参照して、いくつかのメッセージは、次のようになります。

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845 
==3956== at 0x4022AB8: malloc (vg_replace_malloc.c:207) 
==3956== 

方法をこれらのエラーの完全なスタックトレースを取得できますか?

+0

Valgrindの最後にリリースされたバージョンでは、--num-callersが50までしかサポートされていないため、使用しているバージョンが明確ではありません。上記のスタックトレースは不完全なようです。これは、アプリケーションのコンパイル方法にリンクされている可能性があります(たとえば、-fomit-frame-pointerオプションを指定すると、スタックトレースを生成しにくくなる可能性があります)。 – phd

+0

バンプ。 (stackoverflow "bump" posts?)同じ問題。 -gを使ってアプリケーションをコンパイルする。 malloc()、malloc()、main()の関数は、main()と同じファイル内の関数を含め、すべてをスキップします。 ??私はこの3スタックフレームの制限を持っていないオンラインの例を参照してください.. ??何か案は? – Samuel

+0

私はUbuntu 13.10でvalgrind 3.8.1を使用しており、すべての中間コールを含まないスタックトレースを参照しています。 gccでコンパイル中の最適化がありません(または、おそらく-Ogなどが必要です) – thoni56

答えて

14

完全なスタックトレースを取得するには、リークに関係する可能性のあるすべてのライブラリ/実行ファイル(および--num-callersで設定された制限内)のデバッグシンボルが必要です。

自分でビルドする場合は、gcc(または他のコンパイラの関連するフラグ)に-gフラグを指定する必要があります。

は絶対確実ではなく、リークを見逃したり、完全なスタックトレースを提供できない場合があります(特に、スレッドを使用している場合、または複雑なclass実装の場合)。

デバッグ情報のないライブラリの場合、スタックトレースはそのライブラリで停止します。

フリーツールの場合、は非常に優れていますが、IBMが大きなお金のためにメモリプロファイルを販売できる理由があります。

+6

私の場合、ちょうど--num-callersオプションを調整しなければなりませんでした。デフォルトは12であるように見えますが、これはSTLなどではかなり低くなります。 – cib