web-dev-qa-db-ja.com

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== 

これらのエラーの完全なスタックトレースを取得するにはどうすればよいですか?

20
Michael Lukin

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

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

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

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

無料のツールの場合、 valgrind はその機能が非常に優れていますが、IBMのような場所がメモリプロファイルを高額で販売できるのには理由があります。

20
roelofs