Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++ Valgrind

Valgrindの使い方や見方について(基礎編)

投稿日:2021年10月22日 更新日:

 

<目次>

(1) Valgrindの使い方や見方について(基礎編)
 (1-1) メモリリークのチェックのやり方
 (1-2) 「valgrind」コマンドの基本的な使い方
 (1-3) (参考)Valgrindのメモリリークの結果ステータスについて

(1) Valgrindの使い方や見方について(基礎編)

本記事ではValgrindをインストールしたものの、基本的な使い方を知りたいという方向けに代表的な使い方(メモリリークチェック)の入門手順をご紹介します。

(1-1) メモリリークのチェックのやり方

今回はC++のプログラムを使って、実際にメモリリークチェックを行う手順をご紹介します。

●①C++プログラムの準備

Valgrindのメモリリークチェックを試すために、Linuxサーバ上のエディタ(viエディタ等)を用いて簡単なC++のp;うログラムを作成します。

(例)
#include <stdlib.h>
int main()
{
    char *x1 = new char[100];
    return 0;
}

(図111)

●②プログラムのコンパイル

コンパイルはGCCコンパイラ(⇒★C++ Linux コンパイル)を使って、次のようなコマンドで実行します。「-o」オプションで実行ファイルの名前を指定しています。

(構文)
$ g++ -g -o [実行ファイル名] [プログラム名]
(例)
g++ -g -o ./memorytest_definitely ./memorytest_definitely.cpp

(図112)

●③「valgrind」コマンドによるメモリチェックの実行

コンパイル出来たら、生成された実行ファイルに対して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の値が異なっているはずです(割り当てたのに解放していない)。

(図121)

(結果例)※一部抜粋

==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 プログラム名
「–leak-check=yes」のオプションのみでは、全てのメモリ解放漏れは表示されません(「still reachable」などは表示されない⇒★)。必ず全ての解放漏れを表示するためには「–show-reachable=yes」オプションを使用する必要があります。
(図123)

(1-3) (参考)Valgrindのメモリリークの結果ステータスについて

Valgrindではメモリリークの緊急性をいくつかのステータスで段階的に表示しています。上記の例で出ている「100 bytes in 1 blocks are definitely lost ~」の「definitely lost」もそのステータスの1つです。具体的なステータスとしては次のようなものがあります。

●「definitely lost」

⇒★リンク予定

●「still reachable」

⇒★リンク予定

●「possibly lost」

⇒★リンク予定

●「indirectly lost」

⇒★リンク予定

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++, Valgrind

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C++の値渡しと参照渡しの使い分けや違いについて

<目次> (1) C++の値渡しと参照渡しの使い分けや違いについて  (1-1) 「値渡し」とは?  (1-2) 「参照渡し」とは?  (1-3) 「値渡し」と「参照渡し」の使い分け (1) C++の …

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

GDBの使い方をC++のプログラムのデバッグを例にご紹介

  <目次> (1) GDBの使い方をC++のプログラムのデバッグを例にご紹介  (1-1) GDBのデバッグのシナリオ概要(例)  (1-2) GDBのデバッグ手順(例)  (1-3) そ …

C++における「>>」の意味について

  <目次> (1) C++における「>>」の意味について  (1-1) 概要  (1-2) サンプルプログラム  (1-3) どんな時に使われる?⇒データ圧縮  (1-4) 備 …

C++のtime関数とlocaltime関数の違いについて

  <目次> (1) C++のtime関数とlocaltime関数の違いについて  (1-1) C++のlocaltime関数の概要とサンプル  (1-2) C++のtime関数の概要とサン …

  • English (United States)
  • 日本語
Top