Rainbow Engine

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

C++ Valgrind

Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)

投稿日:2021年9月18日 更新日:

 

<目次>

(1) Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)
 (1-1) Valgrindとは?
 (1-2) Valgrindの導入方法
 (1-3) Valgrindの使い方(HelloWorld)

(1) Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)

本記事ではLinuxにおけるC++のメモリリーク等の検知ツールである「Valgrind」のインストール~疎通までの手順についてご紹介します。

(1-1) Valgrindとは?

「メモリリーク」といったプログラム中のメモリの問題を検知するためのツールです。通常、メモリリーク等は実際にメモリ枯渇が起きるまでは問題としては顕在化しないため、検知が難しいとされています。加えて、CやC++にはJavaのようなGC(ガーベッジコレクション)の機能がないため、メモリの適切な解放に多くの時間を費やす事になります。それらの課題を解決するのが、このValgrindツールになります。
 

(1-2) Valgrindの導入方法

●STEP1:ソフトウェアのダウンロード

・下記の公式サイトのURLにアクセスします。
 
・「valgrind X.XX.X (tar.bz2)」(Xはバージョン番号)のリンクをクリックしてダウンロードします。
(図111)①


(図111)②

●STEP2:サーバへの配備

Teraterm等でサーバにSSH接続して、SSH SCP機能などでサーバ上の任意のディレクトリに配備します。
 
(図112)①

(図112)②

●STEP3:ファイルの解凍

ファイルは「bzip2」形式なので、bzip2コマンドで解凍したのちに「tar」コマンドで展開します。
 
(構文)「XX.XX.XX」はバージョン番号です
bzip2 -d valgrind-XX.XX.XX.tar.bz2
tar -xf valgrind-XX.XX.XX.tar

(例)

bzip2 -d valgrind-3.17.0.tar.bz2
tar -xf valgrind-3.17.0.tar
 
(図113)① bzip2で解凍するとtarファイルが出てきます

(図113)②

●STEP4:インストール

・①valgrindの資源があるフォルダに移動し、「configure」シェルを実行

$ cd ./valgrind-3.17.0/
$ ./configure
 
(図114)①
(図114)②
(図114)③
 
・②makeコマンドを実行します。
このコマンドはかなり時間が掛かりました。数分待ったら完了してプロンプトが再度表示されました。

$ make
 
(図114)④
(図114)⑤
 
・③make installコマンドの実行
最後のmake installは通常のユーザで実行すると権限不足でエラーとなったため、sudoで実行しました。
 
$ sudo make install
 
(図114)⑥
 

(1-3) Valgrindの使い方(HelloWorld)

●サンプルプログラムの作成

viエディタ等でcppのサンプルプログラムを作成します。
 
 
#include 
int main()
{
    char *x = new char[100];
    return 0;
}
 
(図121)①

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

次のコマンドでコンパイルします。
 
(構文)
$ g++ -o [実行ファイル名] [プログラム名]
 
(例)

$ g++ -o memorytest memorytest.cpp
 
「memorytest.cpp」をコンパイルすると、実行ファイル「memorytest」が作成されます。
 
(図121)② 

●Valgrindによるチェック実施

「valgrind」コマンドでチェックを行います。「–tool」オプションで「memcheck」を指定して、メモリの検査を行います。
 
・①「valgrind-3.17.0」の階層に「cd」(ディレクトリ移動)する
 
(例)
$ cd ./valgrind-3.17.0/
 
(図121)③
 
・②次のコマンドを実行
 
(構文)
$ valgrind --tool=memcheck プログラム実行ファイル名
 
(図121)④
 
(実行結果例)

[admin@ik1-411-37776 valgrind-3.17.0]$ valgrind --tool=memcheck ../memorytest
==8152== Memcheck, a memory error detector
==8152== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8152== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
==8152== Command: ../memorytest
==8152==
==8152==
==8152== HEAP SUMMARY:
==8152==     in use at exit: 100 bytes in 1 blocks
==8152==   total heap usage: 1 allocs, 0 frees, 100 bytes allocated
==8152==
==8152== LEAK SUMMARY:
==8152==    definitely lost: 100 bytes in 1 blocks
==8152==    indirectly lost: 0 bytes in 0 blocks
==8152==      possibly lost: 0 bytes in 0 blocks
==8152==    still reachable: 0 bytes in 0 blocks
==8152==         suppressed: 0 bytes in 0 blocks
==8152== Rerun with --leak-check=full to see details of leaked memory
==8152==
==8152== For lists of detected and suppressed errors, rerun with: -s
==8152== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
[admin@ik1-411-37776 valgrind-3.17.0]$
 
チェックした結果として、プログラムにおいて「メモリの割当てをしたが、後続で解放をしていない」ものの情報が表示されます。しかし、これだけではメモリリークが発生した事は分かるものの、「どの行で発生したか?」といった情報がありません。
 
そういった点も含めて、Valgrindの基本的な使い方については、下記の別記事でもご紹介していますので、ぜひ併せてご覧下さい。
 
⇒(参考)Valgrindの基本的な使い方について(★Link)
 
⇒(参考)Valgrindでメモリ解放箇所の行番号を表示する方法(★Link)
 

Adsense審査用広告コード


Adsense審査用広告コード


-C++, Valgrind

執筆者:


comment

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

関連記事

ValgrindのStill Reachableの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのStill Reachableの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Still Reachable」はどんな状況?  (1 …

C++の「int **g = new int*;」の意味について

  <目次> (1) C++の「int **g = new int*;」の意味について  (1-1) 「int **g = new int*;」の意味  (1-2) サンプルで理解を深める …

C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use)」エラーについて

  <目次> (1) C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use) …

CORBA通信のPOA(Portable Object Adapter)とは?

  <目次> (1) CORBA通信のPOA(Portable Object Adapter)とは?  (1-1) 概要と特徴  (1-2) 一般的なPOAの処理構成  (1-3) POAの …

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

  • English (United States)
  • 日本語
Top