次のパラメーターを使用して 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==
これらのエラーの完全なスタックトレースを取得するにはどうすればよいですか?
完全なスタックトレースを取得するには、リークに関係している可能性のあるすべてのライブラリ/実行可能ファイルのデバッグシンボルが必要になります(および--num-callers
で設定された制限内)。
それらのいずれかを自分でビルドする場合は、gccで-g
フラグ(または他のコンパイラで関連するフラグ)を指定する必要があります。
valgrind は絶対確実ではなく、リークを見逃したり、完全なスタックトレースを提供できない場合があることに注意してください(特にスレッドを使用している場合、または複雑なclass
実装の場合)。
デバッグ情報のないライブラリの場合、スタックトレースはそのライブラリで停止します。
無料のツールの場合、 valgrind はその機能が非常に優れていますが、IBMのような場所がメモリプロファイルを高額で販売できるのには理由があります。