タダでソフト開発の生産性と品質を上げる方法(8):メモリリークを一瞬で見つける「Valgrind」(その1):山浦恒央の“くみこみ”な話(98)(3/3 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第8回。今回は、ソフトウェアエンジニアを悩ませる常習的なバグ「メモリリーク」を簡単に検出できる「Valgrind」を紹介します。
4.Valgrindの概要
Valgrindは、数種類の動的解析ツールを集めたフレームワークです。今回は、その中で不正なメモリアクセスやメモリリークを検出するツールを使います。なお、便宜上、これをValgrindと呼びます。
Valgrindで全てのバグを検出できるわけではありませんが、デバッグ時のうっかりミスを見つけられます。参考文献[1]によると、本ツールでは、以下のメモリ関連のバグを検出できるそうです。
- 初期化していない変数
- 領域外の読み出し
- メモリリーク
- メモリ操作関数の間違った呼び出し
いずれも、うっかり作り込んでしまうけれども、見つけるのが難しいバグばかりですね。今回は、特にメモリリークに着目します。メモリリークは、確保したメモリを解放し忘れた時に発生します。リスト1の例題で考えます。
#include<stdlib.h> int main(){ char *str; str = (char*)malloc(100); return 0; }
リスト1は、malloc関数で100バイト分を動的確保したプログラムの例です。3行目で、char型の*strを宣言し、4行目でmalloc関数を使って100バイト分だけメモリを確保しています。一通り見ると、メモリ解放を指示するfree関数がなく、メモリリークが起きています。例題プログラムなら何の問題もありませんが、規模が大きいプログラムでは、バグの温床になります。
Valgrindを実行すると、メモリリークを自動的に検出できます。図13を見てください。
下から5行目の「definitely lost: 100 bytes in 1 blocks」というメッセージがありますね。これは、メモリリークを起こしている際に出るメッセージです。Valgrindでは、このようにメモリリークを検出できます。mallocを使う場合は、free関数を使うことを徹底しましょう。「free(str);」を追加すると、エラーメッセージはなくなります。
4.まとめ
今回の内容を簡単にまとめます。
- メモリリークは、常習犯的なバグである。簡単に作り込むのに、検出が面倒
- Valgrindは、メモリ関連するバグを検出するツールをまとめたものである
- Valgrindを使用すると、メモリリークを検出し、ログメッセージで確認できる
5.終わりに
今回は、メモリリークなどのメモリ関連のバグを検出するValgrindの環境構築と、使い方を紹介しました。メモリリークは常習犯的なバグですが、見逃してしまうことも少なくありません。Valgrindを使用すると、メモリリークを自動的に検出できますので、デバッグ時に大変重宝します。ただし、ツールへの過度の期待は禁物。どんなツールや技法にも制限事項が存在します。メモリリークについて詳しく知りたい方は、以下の書籍を参照してください。
- 「ゲームエンジンアーキテクチャ 第2版」(ジェイソン・グレゴリー他、2015、ソフトバンククリエイティブ)
- 「デバッグの理論と実践 なぜプログラムはうまく動かないのか」(Andreas Zeller他、2012、オライリージャパン)
- 「ガベージコレクション 自動的メモリ管理を構成する理論と実装」(リチャード・ジョーンズ他、2016、翔泳社)
次回も引き続き、Valgrindを取り上げます。
参考文献
[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- タダでソフト開発の生産性と品質を上げる方法(7):高機能な単体テストツール「GoogleTest」を使いこなす(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第7回。グーグル(Google)製の単体テストフレームワーク「GoogleTest」の高度な機能のうち、今回は「パスカバレッジ」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第6回。前回紹介したグーグル(Google)製の単体テストフレームワーク「GoogleTest」には高度な機能がありますが、今回は「アサーションマクロ」と「テストフィクスチャの使い方」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(5):グーグルの隠し球的単体テストツール「GoogleTest」
「タダでソフト開発の生産性と品質を上げる方法」の第5回。今回は、IT業界の巨人、グーグル(Google)製の単体テストフレームワーク「GoogleTest」を紹介する。 - タダでソフト開発の生産性と品質を上げる方法(4):単体テストで威力を発揮する「MinUnit」
「タダでソフト開発の生産性と品質を上げる方法」の第4回。今回は、単体テストで威力を発揮する「MinUnit」を紹介する。 - タダでソフト開発の生産性と品質を上げる方法(3):意外に使えるフリーツール「PictMaster」を使いこなす
「タダでソフト開発の生産性と品質を上げる方法」の第3回。今回は、前回紹介した無料の組合せテスト自動生成ツール「PictMaster」を使いこなす応用編だ。