メモリリーク### valgrindの#valgrindのプロフィール

Valgrindの概要

アーキテクチャ

:Valgrindのは、Linux、オープンソース(GPL V2)シミュレーションデバッグツールのコレクション、公式のアドレスであるhttp://valgrind.org/カーネル(コア)とカーネルの組成に基づいて、他のデバッグツールによってvalgrindの。カーネルは、CPU環境をシミュレートし、他のツールにサービスを提供するフレームワーク(枠組み)と同様であり、他のツールは、(プラグイン)、カーネルによって提供されるサービスの使用は、特定のメモリデバッグさまざまなタスクを完了するためのプラグインと同様です。下に示すようにvalgrindのアーキテクチャ:

以下のものを含むValgrindのツール:

  1. Memcheck。そのようなメモリアクセス違反として初期化されていないメモリの使用、すでに解放されたメモリの使用、:これは、メモリチェッカーのヘビー級のようなメモリ使用量の誤差を、開発の大半で見つけることができ、最も広く使用されているツールvalgrindのです。これはまた、に焦点を当てるこの記事の一部です。
  2. Callgrind主に登場し、関数呼び出しの際に問題のプログラムをチェックするために使用されます。
  3. Cachegrind主に、プロシージャ・キャッシュの使用状況の問題をチェックするために使用されます。
  4. Helgrind主に懸念がマルチスレッドプログラムで発生する競争をチェックするために使用されます。
  5. 山塊主にプログラム・スタックの使用に起因する問題をチェックするために使用されます。
  6. 拡張。コア機能を利用することができ、あなた自身の特定のメモリデバッグツールを書くことができます。

Linuxのプログラムメモリ空間のレイアウト

Linuxでのメモリの問題を見つけるには、最初にすべての私たちは、メモリが割り当てられているかのLinuxでのことを知っている必要がありますか?ショー一般的なLinuxのCプログラムメモリ空間のレイアウト下図:

一般的なLinuxのCプログラムメモリには、いくつかの部分、以下の組成で構成されています。

  • コードセグメント(の.text)。コードセグメント(コード・セグメント/テキストセグメント)は、一般的に実行される格納プログラムコードに使用されるメモリの領域を指します。ここでは、実行するCPU命令に格納されます。セクションは、読み取り専用されている間(プログラム命令自体を変更することを可能にする、などのいくつかのアーキテクチャは、コードセグメントを書き込むことができる可能に起因するエラーを防止するために、コードセグメントは、メモリ内の同じコード、コピーを1つだけ共有されています)プログラムを修正。コードセグメントでも、文字列定数などの定数読み取り専用変数を含んでいてもよいです。したがって、この部分領域の大きさは、プログラムが実行される前に決定され、通常は読み出し専用のメモリ領域に属しています。
  • 初期化データセクション(.DATA)。データセグメント(データセグメント)は、一般に、ストア・プログラムに使用されるメモリの領域を意味するグローバル変数を初期化します。int型のval =「100」:ここでは、例えば、任意のグローバル変数の位置の外側が機能し、間違いなく割り当てられた初期値にプログラム変数に格納されます。プログラムを起動するexec関数を呼び出すときに、カーネルをソースファイルから読み込まれ、上記の二つのプログラムの実行可能ファイルに配置されていることを強調すべきです。静的なメモリ割り当て。
  • 未初期化データセクション(.bssの)bssセクション(BSS [記号で開始ブロックセグメント])は、一般に、ストア・プログラムに使用されるメモリの領域を意味するグローバル変数を初期化されていません。カーネルは0またはnullに初期化されたプログラムを実行する前にこのセクションでは、データに位置しています。それは、例えば、任意の関数の外側に発生、グローバル変数:INT和、スタティックメモリの割り当て。 
  • ヒープ(ヒープ)。このセクションでは、頻繁に使用されるmalloc関数として、プログラムで動的なメモリ割り当てのために使用される、新しいシリーズのメモリ機能は、このセグメントから適用することです。処理動作を動的メモリセグメントが割り当てられ、そのサイズが固定されていない動的メモリ割り当てに属し、それは動的に拡大または縮小することができます。
  • スタック(スタック)。ローカル変数や関数の呼び出し時に発生した一時的な変数の関数は、このセグメントに格納されています。我々はブラケット機能「{}」変数定義(しかし含まない変数は静的変数は、データ・セグメントに格納されている静的手段を宣言)。関数が呼び出されたときに加えて、そのパラメータは、呼び出されたプロセス・スタックを開始するためにプッシュされ、コールが終了するまで、戻り値がスタックに戻って格納されます。スタックは保存/呼び出しサイトを復元するために特に便利であるので、最初のうちの最初のスタック(FIFO)として備えています。この意味で、我々は預金、為替データの一時記憶領域として積み重ねることができます。 

プログラムは、基本的に3つのセグメントからなるbssセクション、データセクション、テキストです。

組み込みシステムの設計においては、一般的には、ストア・プログラム初期化されていないグローバル変数を使用するメモリのbssセクションの面積を指し、BSSセグメント部分は、一般に、初期化時にクリアされます。bssセグメントは、スタティックメモリの割り当てで、つまりプログラムの最初は晴れ。C言語プログラムは、同じようにコンパイルされた後、.dataセクションに保存されているグローバル変数、.bssの中に保存された初期化されていないグローバル変数を初期化します。

(典型的には、画像ファイルに硬化組込みシステムで)実行可能ファイルの両方のテキストおよびデータセグメントは、システムは、実行可能ファイルからロードされ、bssセクションは、実行可能ファイル内のシステム初期化ではありません。

メモリチェックの原則

Memcheckの下に示すように、メモリの問題の検出原理:

Memcheckは、二つのグローバルテーブルの確立に重要な嘘をメモリの問題を検出することができます。

  1. 有効な価値  表:

CPUの各レジスタのためだけでなく、それに対応するビットベクトル、プロセスのアドレス空間全体各バイト(バイト)のために、対応する8ビットを有します。レジスタの値を記録するための責任があるこれらのバイトやビットが有効、初期化された値を持っています。

  1. 有効な-アドレス 

アドレスを読み取ることができるかどうかを記録するための責任を負う各バイト(バイト)中の全アドレス空間、ならびに対応する1ビット、方法。

検出原理:

  • メモリ内のバイトが読み出されるときに、最初のチェックは、ビットに対応するバイト。Aビットの表示位置が非アクティブ位置であれば、memcheck書き込みエラーが報告されています。
  • バイトは、実際のCPUにロードされたときに、対応するVビットバイトもCPU仮想環境にロードするように、仮想CPUと類似のコア(コア)環境、メモリ、。レジスタの値と、メモリアドレスを生成するために使用される、または値が初期化されていない場合は、プログラムは、チェックmemcheck Vビットに対応する、出力値に影響を与えることができ、初期化されていないメモリエラーが報告されています

公開された170元の記事 ウォンの賞賛207 ビュー459万+

おすすめ

転載: blog.csdn.net/xiaoting451292510/article/details/104943580