<目次>
(1) Valgrindの使い方や見方について(基礎編)
(1-1) メモリリークのチェックのやり方
(1-2) 「valgrind」コマンドの基本的な使い方
(1-3) (参考)Valgrindのメモリリークの結果ステータスについて
(1) Valgrindの使い方や見方について(基礎編)
本記事ではValgrindをインストールしたものの、基本的な使い方を知りたいという方向けに代表的な使い方(メモリリークチェック)の入門手順をご紹介します。
(1-1) メモリリークのチェックのやり方
今回はC++のプログラムを使って、実際にメモリリークチェックを行う手順をご紹介します。
●①C++プログラムの準備
#include <stdlib.h> int main() { char *x1 = new char[100]; return 0; }
(図111)
●②プログラムのコンパイル
$ g++ -g -o [実行ファイル名] [プログラム名]
g++ -g -o ./memorytest_definitely ./memorytest_definitely.cpp
(図112)
●③「valgrind」コマンドによるメモリチェックの実行
$ valgrind --tool=memcheck プログラム名
(図121)
(1-2) 「valgrind」コマンドの基本的な使い方
●「valgrind –tool=memcheck」でメモリ使用のサマリを表示
valgrind --tool=memcheckプログラム名
「memcheck」を引数なしで実行すると、メモリの「割り当て」(allocs)と「解放」(frees)のサマリを表示します(「Definitely Lost」や「Still Reachable」等のステータスまでは表示されない)。
==16954== total heap usage: 1 allocs, 0 frees, 100 bytes allocated
もしメモリ解放漏れがあれば、この時に表示されるallocsとfreesの値が異なっているはずです(割り当てたのに解放していない)。
(結果例)※一部抜粋
==16954== HEAP SUMMARY: ==16954== in use at exit: 100 bytes in 1 blocks ==16954== total heap usage: 1 allocs, 0 frees, 100 bytes allocated ==16954== ==16954== LEAK SUMMARY: ==16954== definitely lost: 100 bytes in 1 blocks ==16954== indirectly lost: 0 bytes in 0 blocks ==16954== possibly lost: 0 bytes in 0 blocks ==16954== still reachable: 0 bytes in 0 blocks ==16954== suppressed: 0 bytes in 0 blocks ==16954== Rerun with --leak-check=full to see details of leaked memory
●「valgrind –tool=memcheck –leak-check=yes」で解放漏れ箇所の特定
(実行コマンド)
valgrind --tool=memcheck --leak-check=yes プログラム名
解放漏れがある場合は、「–leak-check=yes」を付与する事で、割り当て(alloc、newなど)をしたが、対応する解放(free、deleteなど)が無いものを一覧で表示してくれます。
==23466== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==23466== at 0x4C2C866: operator new[](unsigned long) (vg_replace_malloc.c:579) ==23466== by 0x40059E: main (memorytest_definitely.cpp:5)
(図122)
(結果例)※一部抜粋
==23466== HEAP SUMMARY: ==23466== in use at exit: 100 bytes in 1 blocks ==23466== total heap usage: 1 allocs, 0 frees, 100 bytes allocated ==23466== ==23466== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==23466== at 0x4C2C866: operator new[](unsigned long) (vg_replace_malloc.c:579) ==23466== by 0x40059E: main (memorytest_definitely.cpp:5) ==23466== ==23466== LEAK SUMMARY: ==23466== definitely lost: 100 bytes in 1 blocks ==23466== indirectly lost: 0 bytes in 0 blocks ==23466== possibly lost: 0 bytes in 0 blocks ==23466== still reachable: 0 bytes in 0 blocks ==23466== suppressed: 0 bytes in 0 blocks
●「valgrind –tool=memcheck –leak-check=yes –show-reachable=yes」で全ての解放漏れを検出する
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes プログラム名
(1-3) (参考)Valgrindのメモリリークの結果ステータスについて
●「definitely lost」
●「still reachable」
●「possibly lost」
●「indirectly lost」