ユーザーモードとカーネルモードで行われた仮想メモリアクセスを分析する方法は?

ユーザーモードとカーネルモードで行われた仮想メモリアクセスを分析する方法は?

特定のプログラムを実行した結果、ユーザーモードとカーネルモードで実行されたすべての仮想メモリアクセスのログを生成したいと思います。

メモリアクセス場所を収集するだけでなく、他のステータス情報(コマンドポインタ、スレッド識別子など)もキャプチャしたいと思います。基本ツールを使用しても、必要な統計をすべて収集することはできません。

この分析をオフラインで実行する予定なので、パフォーマンスへの影響は心配しません。実際に利用可能な項目によっては、どのツールがすべてのメモリアクセスを記録できるのか、どのツールがサンプリングのみできるかを知ることが役に立ちます。

私はもともとユーザーモードのメモリアクセスのみを記録することに気付くまで、不適切なツールであるValgrindを改善する予定でした。利用可能な他のツールを調べている間、どのツールが自分が望む情報をキャプチャするのかをすばやく判断する方法がわかりません。

始めるのに役立ついくつかのリソースは次のとおりです。

ベストアンサー1

他の人が同様の問題に遭遇した場合に備えて、私が見つけた情報で私の質問を更新したいと思いました。

Linuxトレースツールについて私が理解しているように、ほとんどはプローブ(実行ファイルのバイナリに動的に挿入されるインストルメントを記述するために使用)とトレースポイント(検索を有効または無効にできるコードでコンパイルされたコードを説明します)使用) トレースを使用することです。大きいズームイベント(関数呼び出しなど)したがって、これらのツールはメモリアクセスなどの詳細な項目を追跡するのに役立ちません。

Valgrindは、すべてのメモリアクセスを追跡するのに役立ちます。ユーザーコード(しかしカーネルコード合成CPUでプログラムを実行するためです。ドキュメントから:

その後、プログラムはValgrindコアによって提供される合成CPUで実行されます。新しいコードが初めて実行されると、コアはコードを選択したツールに渡します。このツールは独自の計測コードを追加し、結果をコアに返し、コアはその計測コードの継続的な実行を調整します。

これは、実行される各コマンドを渡すコンポーネントレベルでこれらのトレース情報を収集する必要があることを示すようです。したがって、エミュレータを使わずに実行時にこの深さと幅の情報を得る方法はないようです。ユーザーとカーネルコード

これは私が見つけた唯一の解決策につながりますperf_event_open()。プロセッサのパフォーマンスモニタリングデバイス(PMU)を使用してメモリアクセスをサンプリングできます。perf_event_open()十分な深さの情報(コマンドポインタ、メモリアドレス、プログラムレジスタなど)を提供できますが、幅は提供できません。サンプルメモリアクセス)。

(また、perf memフロントエンドはメモリアクセスに関する情報の収集を開始するのに最適で簡単な場所です。その後、オフライン処理サンプルを使用できますperf script。)

おすすめ記事