valgrind を使ってみた
valgrind とは?
linux 環境で動く超強力なメモリデバッガー。
メモリリークや、セグメンテーション違反を起こしている正確な位置を教えてくれる。
以下、使い方メモ。
使用バージョンは、valgrind-3.2.1
メモリリーク検出など
$ valgrind --leak-check=full ./program arg1 arg2
ヒーププロファイラ
$ valgrind --tool=massif ./program arg1 arg2
メモリをデバッグしてみる
1. バッファオーバーランとメモリリークを行うソースコードを記述
$ vi main.cpp #include <stdio.h> int main() { int *a = new int[2]; a[2] = 0; // バッファオーバーラン return 0; // メモリリーク }
2. コンパイルする
$ g++ main.cpp -g
3. 検証する
$ valgrind --leak-check=full ./a.out ... 省略 ... ・バッファオーバーラン検出 ==10945== Invalid write of size 4 ==10945== at 0x80484AA: main (main.cpp:7) ==10945== Address 0x410E030 is 0 bytes after a block of size 8 alloc'd ==10945== at 0x40057F5: operator new[](unsigned) (vg_replace_malloc.c:195) ==10945== by 0x80484A0: main (main.cpp:5) ==10945== ==10945== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1) ==10945== malloc/free: in use at exit: 8 bytes in 1 blocks. ==10945== malloc/free: 1 allocs, 0 frees, 8 bytes allocated. ==10945== For counts of detected errors, rerun with: -v ==10945== searching for pointers to 1 not-freed blocks. ==10945== checked 87,724 bytes. ・メモリリーク検出 ==10945== 8 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==10945== at 0x40057F5: operator new[](unsigned) (vg_replace_malloc.c:195) ==10945== by 0x80484A0: main (main.cpp:5) ==10945== ==10945== LEAK SUMMARY: ==10945== definitely lost: 8 bytes in 1 blocks. ==10945== possibly lost: 0 bytes in 0 blocks. ==10945== still reachable: 0 bytes in 0 blocks. ==10945== suppressed: 0 bytes in 0 blocks. ==10945== Reachable blocks (those to which a pointer was found) are not shown. ==10945== To see them, rerun with: --show-reachable=yes
ヒーププロファイラを試してみる
1. massifモードで起動する
$ valgrind --tool=massif ./a.out
2. massif.pid.ps ファイルが作成されている。Postscriptでは見づらいので、PDFへ変換すると良さげ。
雑感
頭良すぎだろ。惚れた。