1

私たちは、Java クラス ファイルを計測するために使用される JVMTI Java エージェントに取り組んでいます。その一部は (明らかに) ネイティブの C++ コードですが、大部分は Java コードであり、ネットワーク経由で読み込まれ、ネイティブ エージェント コードから呼び出されます。コード カバレッジ ツールを使用して、ソース コードの計測を行う Java 部分のテスト カバレッジを収集します。

エージェントが起動すると、いくつかのクラスが初期化されます。具体的には、Thread を開始する java.lang.ref.Reference です。当社のエージェントは、コード カバレッジ ツールによってインストルメント化されたカスタム Java コードを使用して Thread start メソッドをインスツルメントします。カバレッジ ツールは、静的初期化子を持ついくつかの静的内部クラスを Java エージェント コードに配置するため、これは java.lang.ref.Reference が初期化される結果として実行されます。

問題は、この時点 (java.lang.ref.Reference が初期化されるとき) に、JVM のいくつかの基本機能がまだ整っていないことです。具体的には、コード カバレッジ ツールの初期化子は System.getProperty(String name) にアクセスしようとしていますが、System.props はまだ null であるため、呼び出しの結果は NullPointerException になります。これにより、コード カバレッジ ツールの静的な内部クラスが初期化されないままになり、クラスが初期化エラー状態になり、結果は NoClassDefFoundError になります。このクラスへのフォローアップ アクセスのたびに、NoClassDefFoundError が発生します。

私の意図は、この初期初期化エラーを無視し、VM_Start まで待ってから、問題のクラスの ClassState を「リンク済み」にリセットすることです。このようにして、クラスへのフォローアップアクセスでJVMがクラスを再度初期化しようとすることを願っています。

JVMTIエージェントからこれを行うことができるかどうか、誰かが考えを持っていますか?これを行う方法を教えてください。

4

2 に答える 2

0

VM_Startの後のRetransformClassesは、Reference用の新しいクラスロードフックを生成し、安全なVMフェーズでインストルメンテーションを実行できるようにします... ReferenceまたはgetLoadedClassesを再変換して、それらすべてを再変換します。

于 2011-03-15T13:21:30.077 に答える