私は Linux マシンを使用しており、特定の時間、メモリへのすべての書き込みまたは読み取りをキャッチしようとしています (基本的に、バイト アドレスと書き込まれている値が必要です)。それを行うのに役立つツールはありますか、それとも OS コードを変更する必要がありますか?
4 に答える
特定の物理メモリアドレスへのメモリの読み取りと書き込みのみを監視したいとおっしゃいました。メモリの読み取り/書き込みと言うときは、命令フェッチではなく、データをメモリに読み書きするアセンブリ命令を意味すると仮定します。
特定のアドレス範囲にアクセスしたときにページ フォールトが発生するように、カーネル内のページング コードを変更する必要があります。次に、ページ フォールト ハンドラーで、何らかの方法でアクセスをログに記録できます。障害の原因となった命令をデコードし、レジスタからデータを読み取ることで、ターゲット アドレスとデータを抽出できます。ロギング後、ページはフォールトしないように構成され、命令が再試行されます。コピー オン ライト手法と似ていますが、各読み取り/書き込みをリージョンに記録しています。
もう 1 つのハードウェアの方法は、何らかの方法でバス スニファーをインストールするか、プラットフォームにハードウェア デバッグ インターフェイスを利用して、アクセスされているメモリ領域を監視することですが、この方法ではキャッシュで問題が発生すると思います。
別の投稿者が述べたように、エミュレーターを変更して特定のメモリ アクセスをキャプチャし、その上でコードを実行することもできます。
どちらの方法もプラットフォーム固有であり、多くの労力が必要になると思います。好奇心から、あなたが達成したいことは何ですか? 物理メモリへのアクセスを監視するよりも良い解決策があるはずです。
特定のプロセスによる (そのプロセスの仮想メモリ空間の一部/すべてに対する) メモリの読み取りと書き込みにのみ関心がある場合は、ptrace と mprotect を組み合わせて使用できます (mprotect を使用してメモリにアクセスできないようにし、ptrace を実行します)。メモリにアクセスするまで、そしてシングルステップ)。
自己内省は、ある種のデバッグに適しています。メモリアクセスの完全なトレースについては、そうではありません。デバッグ コードは、メモリ アクセスを追加せずにトレースを保存するにはどうすればよいですか?
ソフトウェアにとどまりたい場合は、エミュレーター内でトレース対象のコードを実行することをお勧めします。MMU を使用して直接アクセスを提供しながらテスト コードを分離する仮想マシンではなく、完全なエミュレーターです。x86 および関心のある他のほとんどのアーキテクチャ用に多数存在します。
申し訳ありませんが、OS コードを変更しても、やりたいことを実行することはできません。メモリへの読み取りと書き込みは、OS システム コールを経由しません。
最も近い方法は、対象の変数にアクセサー関数を使用することです。アクセサーをインストルメント化して、トレース情報を別のバッファーに入れることができます。組み込みデバッグは、I/O レジスタ アクセスのログを取得するためにこれを行うことがよくあります。