3

C プログラムが実行中に変更するすべてのメモリ位置のログが必要です。メモリ領域の開始アドレスまたは終了アドレスがないため、問題はgdb/valgrindを使用してメモリ領域を監視するよりも少し複雑です。基本的に、プログラムがメモリ更新を行うときはいつでもどこでも(pushの形で、メモリオペランドに移動するなど)、そのメモリアドレスとそのアドレスに書き込まれた値が必要です。

誰か提案やアドバイスはありますか?

ありがとう!

4

2 に答える 2

6

Intelが作成したツールであるPinを使用して、メモリのストア、読み取り、レジスタの内容などを監視できます。これは、プロセッサ キャッシュ(命令および/またはデータ) をシミュレートする MIT のプロジェクトです。Pin を使用して詳細な命令トレースを作成し、そのトレースをキャッシュ シミュレータへの入力として使用します。

于 2012-09-05T00:47:44.377 に答える
1

エミュレーターでプログラムを実行できる場合は、必要なデータを記録するようにエミュレーターをインストルメント化できます。Bochs や QEMU など、Wikipedia にいくつかのX86 エミュレーターがリストされています。

とハンドラーを使用した解決策の半分を考えることができます。保護されたメモリは、アクセス時にシグナルを生成しmprotect()ます。SIGSEGVハンドラーがアドレスを記録し、アクセスを再度有効にすると、障害のある命令が再開されます (そして成功します)。ただし、セグメントを再び保護する方法はわかりません。

独自のデバッガーを作成することもできます (マニュアル ページを参照してください。それほど複雑ではありません)。このデバッガーは、プログラムの途中までptrace()しか存在しません。PT_STEPおそらく、一時停止した命令を解析して、それがメモリ アクセスであるかどうかを判断し、実効アドレスを自分で計算する必要があります (必要なレジスタを で取得しますPT_ GETREGS)。

于 2012-09-05T01:35:27.510 に答える