誰かがValgrindがどのように機能するかについての簡単なトップレベルの説明を提供できますか?例:メモリが割り当てられ、解放されたときにそれをどのように知るのですか?
Valgrindは基本的にアプリケーションを「サンドボックス」で実行します。このサンドボックスで実行している間、独自の命令を挿入して高度なデバッグとプロファイリングを行うことができます。
マニュアルから:
プログラムは、Valgrindコアによって提供される合成CPUで実行されます。新しいコードが初めて実行されると、コアはコードを選択したツールに渡します。ツールは独自のインストルメンテーションコードをこれに追加し、結果をコアに返します。コアは、このインストルメントされたコードの継続的な実行を調整します。
したがって、基本的に、valgrindはアプリケーションを実行する仮想プロセッサを提供します。ただし、アプリケーションの指示は処理される前に、ツール(memcheckなど)に渡されます。これらのツールは一種のプラグインのようなもので、プロセッサーで実行する前にアプリケーションを変更できます。
このアプローチの優れた点は、valgrindで実行するためにプログラムを変更したり再リンクしたりする必要がないことです。プログラムの実行が遅くなりますが、valgrindはパフォーマンスを測定したり、アプリケーションの通常の実行中に実行したりすることを意図していないため、これは実際には問題になりません。
Valgrindは、動的バイナリ分析(DPA)ツールであり、Dynamic Binary Instrumentation(DPI)フレームワークを使用して、メモリ割り当てをチェックし、デッドロックを検出し、アプリケーションのプロファイルを作成します。 DPIフレームワークには、独自の低レベルのメモリマネージャー、スケジューラ、スレッドハンドラー、およびシグナルハンドラーがあります。 Valgrindツールスイートには、
Valgrindツールは、逆アセンブルおよび再合成メカニズムを使用して、アプリケーションをプロセスにロードし、アプリケーションコードを逆アセンブルし、分析用のインストルメンテーションコードを追加し、アセンブルしてアプリケーションを実行します。 Just Intime Compiler(JIT)を使用して、アプリケーションをインストルメンテーションコードに埋め込みます。
Valgrind Tool = Valgrind Core + Tool Plugin
Valgrindコアはアプリケーションコードを逆アセンブルし、コードフラグメントをインストルメンテーション用のツールプラグインに渡します。ツールプラグインは、分析コードを追加してアセンブルします。したがって、Valgrindは、Valgrindフレームワークの上に独自のツールを作成する柔軟性を提供します。 Valgrindは、シャドウレジスタとシャドウメモリを使用して、読み取り/書き込み命令、読み取り/書き込みシステムコール、スタックおよびヒープ割り当てを計測します。
Valgrindは、システムコールのラッパーを提供し、システムコールの一部としてアクセスされたメモリを追跡するために、すべてのシステムコールの事前および事後コールバックに登録します。したがって、ValgrindはLinuxオペレーティングシステムとクライアントアプリケーション間のOS抽象化レイヤーです。
この図は、Valgrindの8つのフェーズを示しています。
valgrindはプログラムとOSの間のレイヤーとして存在し、メモリへの(割り当て解除)要求を要求するOSへの呼び出しをインターセプトし、実際にメモリを割り当てて同等のものを返す前に操作内容を記録します。これは、はるかに低いレベル(プログラム関数呼び出しではなくシステム呼び出し)を除いて、基本的にほとんどのコードプロファイラーの動作方法です。
ここにいくつかのニース情報があります:
LD_PRELOADをよく理解してください。
Valgrindは基本的に、プログラムを実行する仮想マシンです。これは、メモリを割り当て/解放するために各呼び出しをインターセプトする仮想アーキテクチャです。