valgrind memcheckの使い方と効果(回転)

6265 ワード

https://windmissing.github.io/linux/2016-02/valgrind-memcheck.html
 

一、valgrind


1.Valgrindとは何か
ValgrindはLinux上で実行されるシミュレーション技術に基づくプログラムデバッグと分析ツールで、カーネル--ソフトウェア合成のCPU、一連の小さなツールを含み、各ツールはタスク--デバッグ、分析、テストなどを完成することができます.Valgrindはメモリリークやメモリ違反を検出したり、cacheの使用などを分析したりすることができます.
どのツールを使用しても、valgrindは開始する前にプログラムの制御権を取得し、実行可能な関連ライブラリからデバッグ情報を読み出します.次にvalgrindコアが提供する仮想CPUでプログラムを実行し、valgrindは選択したツールに基づいてコードを処理し、このツールはコードに検出コードを追加し、これらのコードを最終コードとしてvalgrindコアに返し、最後にvalgrindコアはこれらのコードを実行します.
valgrindは高度にモジュール化されているので、開発者やユーザーは、独自の構造を損なうことなく、新しいツールを追加することができます.
2.valgrind toolとは何か
valgrindは、異なるデータを検出し、異なる使用要件を満たすための複数のメモリ検出方法を提供します.
使用できるツールは次のとおりです.
(1)cachegrindはバッファシミュレータである.プログラムの各行で実行される命令の数と、バッファのヒット数を示すために使用できます.
(2)callgrindはcachegrindに基づいて呼び出し追跡を追加する.呼び出しの回数と関数呼び出しのたびにオーバーヘッドを得るために使用できます.cachegrindの補足として、callgrindは、各スレッド、およびプログラム逆アセンブリ出力の各命令の実行回数、およびキャッシュミス数をそれぞれ表示することができる.
(3)helgrindは,プログラムにおける潜在的な条件競合を発見できる.
(4)lackeyは、テンプレートとして独自のツールを作成できるサンプルプログラムです.プログラムが終了すると、プログラム実行統計に関する基本的なデータが印刷されます.
(5)massifは、プログラムがどれだけのメモリを使用しているかを測定するスタックプロファイラーです.
(6)memcheckは細粒度のメモリチェッカである.
(7)noneには何の機能もありません.一般的にValgrindのデバッグとベンチマークテストに使用されます.
3.Valgrindの使い方
(1)取付
yum install valgrind

(2)運転
valgrind --tool=toolname args-val program args-pro

たとえば
valgrind --tool=memcheck ls -l
--toolオプション.valgrind toolのいずれかを選択し、toolの名前を付けます.この参照を付けなくてもよい場合は、デフォルトでmemcheckが使用されます.args-valオプション.valgrindが追加できるパラメータで、単一の実行時の特別な要件を構成します.
パラメータの様々な役割はvalgrind-hで確認できます.programオプションで、検出プログラムオブジェクトを指定します.valgrindはターゲットプログラムのコンパイルプロセスにいくつかの要求があります.
(1)デバッグモード(gccコンパイラの-gオプション)をオンにします.デバッグ情報がない場合、最良のvalgrindツールでも、特定のコードがどの関数に属しているかを推測できます.デバッグオプションを開いてコンパイルした後、valgrindでチェックすると、valgrindは行に関する詳細なレポートを表示します.
(2)コンパイル最適化オプション(たとえば-O 2以上の最適化オプション)をオフにします.これらの最適化オプションはmemcheckがエラーの初期化されていないレポートを送信する可能性があります.そのため、valgrindのレポートをより正確にするために、コンパイル時に最適化オプションを使用しないほうがいいです.args-proオプション、プログラムを実行するために必要なパラメータ.

memcheck


1.valgrind memcheckとは
memcheckはvalgrind toolの一種で、細粒度のメモリ検査器です.次の問題を検出できます.
1)初期化されていないメモリの使用
2)読み取り/書き込みが解放されたメモリ
3)リード/ライトメモリの限界
4)読み取り/書き込みが不適切なメモリスタックスペース
5)メモリリーク
6)malloc/new/new[]とfree/delete/delete[]が一致しません.
7)srcとdstのオーバーラップ
2.運転
valgrind --tool=memcheck program args-pro

または
valgrind  program args-pro

3.出力情報
(1)バージョン情報で、==の中間の数字(31549)はvalgrindのプロセスIDであり、プログラムのプロセスIDでもあり、これらは同じプロセスである.
==31549== Memcheck, a memory error detector
==31549== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==31549== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==31549== Command: ./uninit1
==31549==

後の内容はプログラムの実行が終わるまで待たなければなりません.
(2)エラーメッセージ,異なるエラーによって異なる内容が現れるので,以下で詳細に説明する.
(3)まとめ
==31549== HEAP SUMMARY:
==31549==     in use at exit: 0 bytes in 0 blocks
==31549==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==31549== 
==31549== All heap blocks were freed -- no leaks are possible
==31549== 
==31549== For counts of detected and suppressed errors, rerun with: -v
==31549== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 2 from 2)

使用例
1.初期化されていないメモリの使用
『valgrind memcheck未初期化メモリ使用』
2.リード/ライトが解放されたメモリ
『valgrind memcheck読み取り/書き込み解放されたメモリ』
3.リード/ライトメモリの限界
『valgrind memcheckリード/ライトメモリ境界』
4.読み取り/書き込みが不適切なメモリスタックスペース
他のいくつかの記事には、読み取り/書き込みが不適切なメモリスタック空間の例があります.
5.メモリリーク
『valgrind memcheckメモリ漏れ』
6.malloc/new/new[]とfree/delete/delete[]が一致しない
「valgrind memcheck malloc/new/new[]とfree/delete/delete[]が一致しない」
7.srcとdstのオーバーラップ
テストコード
#include 
using namespace std; #include "string.h" void test1() { char ch[10] = "abcdefghi"; char *p1 = ch; char *p2 = ch + 3; memcmp(p1, p2, 5); } int main() { test1(); return 0; } 

コンパイルおよび実行
g++ -g -o overlap val-overlap.cpp
valgrind --leak-check=full /home/vagrant/git_hub/windmissing.github.io/_posts/code/overlap

検出結果
==29405== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

検出結果解読
書くことにかかわらない場合、srcとdstが重なるのは問題ではありません.

四、Valgrindの特徴


1.メリット
(1)検出対象プログラムはコンパイル時に特別なオプションを指定する必要はなく,特別な関数ライブラリに接続する必要もない.
(2)valgrindは非侵入的に設計されており、実行可能なファイル上で直接動作するため、検査前にプログラムを再コンパイル、接続、修正する必要はありません.プログラムをチェックするのは簡単ですが、次のコマンドを実行するだけでいいです.
(3)valgrindシミュレータの各命令が実行されるため、検査ツールと剖析ツールはあなたのアプリケーションだけでなく、共有ライブラリ、GNU Cライブラリ、Xのクライアントライブラリにも役立ちます.
(4)ある行に対してスタック情報を印刷できる
(5)重複情報のマージ
2.短所
(1)異なるツール間で加わるコードの変化は非常に大きい.各役割ドメインの末尾でmemcheckはコードに参加して各メモリのアクセスをチェックし、値計算を行い、コードサイズは少なくとも12倍増加し、実行速度は通常より25~50倍遅い.
(2)プログラム実行終了後に結果が表示される
 
転載先:https://www.cnblogs.com/erhu-67786482/p/11244805.html