1

Java プログラムによるすべての読み取りと書き込みをキャプチャできるツールを作成しようとしています。また、どのオブジェクトのどのフィールドがアクセス/変更されているかを知りたいです。

私は現在見ました: -

1) java.lang.instrument 私はそれで多くを行うことができませんでした. 実行中のプログラムにアクセスし、さまざまなオブジェクト/フィールドおよび関連するものに監視を作成できるエージェントを作成する方法を理解できませんでした。そのあたりの意見や情報があればよろしくお願いします。

2) jvmti jvmti を見て、jvmti ツールを作成しようとしましたが、オブジェクトを取得するには、JVMTI_EVENT_OBJECT_ALLOC が潜在的な機能である必要があることがわかりました。しかし、私はそうではないと考えました。さらに、このイベントは新しいコマンドに対して呼び出されないことを読みました。したがって、現時点では、これも当てはまらないようです。

それで、上記の方法またはあなたが知っているかもしれない他のテクニック/ツールを使用して、私がやりたいことを行う方法を知っているかどうか知りたいですか?

注: アプリケーションのソース コードにアクセスできません。私が持っているのはクラスファイルだけです。

4

2 に答える 2

1

ASM libを使用するのは非常に簡単です。クラスをロードする前にすべてのクラスを計測する新しいクラス・ローダーを作成し、それをターゲット・クラスのロードに使用します。新しい MethodAdapter を作成し、visitFieldInsnメソッドをオーバーライドします。PUTFIELD次に、、、およびオペコードPUTSTATICを探します。これは恐ろしく見えるかもしれませんが (私の説明は意味不明である可能性が高いため)、実際には非常に簡単です。ASM マニュアルをダウンロードするだけで、すぐにその方法がわかります。GETFIELDGETSTATIC

編集:JDKコードによって行われた読み取りと書き込みを傍受できるようにするには、これらのクラスを計測し、ファイルに保存し、コマンドライン引数を介して、変更されたブートストラップクラスパスでJVMを実行する必要があることを伝えるのを忘れていました-Xbootclasspath(java.* と他のいくつかのパッケージ。少なくとも、sun.* と javax.* にもこれが必要だと思います)。

これはAspectJでも実行できる可能性があります...しかし、よくわかりません。

于 2011-07-25T22:15:18.870 に答える