0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Valgrind によるメモリリークチェックのメモ

Posted at

概要

Valgrind というツールを使うことで、malloc()free() 忘れによるメモリリークなどを防止できるとのこと。

このページでは、Valgrind の基本的な使用方法をメモする。

Ref:

メモリチェックとは?

動的メモリ確保とヒープメモリ

malloc() 関数などで動的にメモリを確保する時は、ヒープという領域のメモリを使用する。
malloc() で確保したメモリは free() 関数で解放されるまで確保され続ける。そのため不用意に malloc() などを使いまくり、なおかつ free() をサボっていると、ヒープを圧迫し、最悪クラッシュしてしまう(らしい)。こうした free() 忘れを、メモリリークという(とのこと)[1]

Valgrind によるメモリチェック

動的メモリ確保に関連するバグは、デバッグが非常に困難であるため、できるだけ避けたい。Linux 環境であれば、こうしたバグの解析に有用なツールである、Valgrind を使うことができる。Valgrind は、malloc() で確保した領域を超えた読み書き、メモリリーク、重複 free() などを検出してくれる[1]

Valgrind は以下のように使用する。

$ Valgrind hoge

ここで hoge は、解析対象の実行バイナリである。

また、以下のコマンドを使用することで、より詳細な情報を取得できる。

--leak-check=full

なお解析対象の実行バイナリをビルドする際には、-g-O0 オプションを付けるべし。

Valgrind の使用例

基本的な使い方

Inkedvalgrind1_LI.jpg

HEAP SUMMARY の読み方

valgrind2.png

↑は -g, -O0 オプションを付けてビルドした実行ファイルを、--leak-check=full オプションを付けて valgrind で解析した時に、HEAP SUMMARY の下に出てくる情報。
確定的な(?)解放漏れの箇所を教えてくれる。
例えば

hoge bytes in 1 blocks are definitely lost in loss record ~
	at ~~~~~~: fuga (in piyo.so)
	by ~~~~~~:
	by ~~~~~~:
	by ~~~~~~:main (foo.c :bar)

の場合、foo.c の bar 行目でメモリ解放漏れがあり、元をたどると piyo.so の fuga でメモリが確保されている、みたいな感じだと思う。たぶん。知らんけど。

注意

Valgrind を十全に活用するためには、実行バイナリにデバッグ情報がついていることが重要となる。また、最適化の度合いが深いと、デバッグに苦労する場合があるらしい。リンクさせるライブラリも含めて、ビルド時には -g-O0 オプションを忘れずにつけておきたい。

まとめ

Valgrind を活用してメモリリークを予防しよう、ヨシ!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?