3

java.lang.instrument API を使用して、静的メソッド呼び出しを java.lang.Object コンストラクターに追加しようとしています。メソッドで System.gc() を呼び出すと機能するため、基本は正しく理解しています。インストルメンテーションの有無にかかわらず -verbosegc を実行して、これを確認しました。自分のパッケージでメソッド呼び出しを静的クラス/メソッドに変更すると、致命的なエラーが発生します。

スレッド「メイン」での例外 ネイティブ メソッドでの致命的なエラー: -javaagent の処理に失敗しました

作業ディレクトリにダンプ ファイルが作成されないため、何が問題なのかを把握するのが難しいと感じています。他の情報:

  • 変換前に、静的メソッド クラスが premain メソッドに読み込まれていることを確認します。
  • 静的メソッド呼び出しによって新しいオブジェクトが作成されない
  • 最後にロードされたクラスは InterruptedIOException ですが、これは単なる副作用だと思います

前もって感謝します。

4

1 に答える 1

1

はい、@barry がコメントで指摘したように、Java エージェントのマニフェストにBoot-Class-Path定義を追加する必要があります。私の場合、エージェント内で javassist を使用してバイトコードを作成したため、マニフェストは次のようになります。

Manifest-Version: 1.0
Premain-Class: com.company.agent.Agent
Agent-Class: com.company.agent.Agent
Boot-Class-Path: javassist-3.18.2-GA.jar agent.jar

javassist およびエージェントの jar と同じ lib ディレクトリに、アプリケーションのすべての jar ファイルがあります。同じフォルダー内のクラスパス上のすべてで、機能します。

于 2014-10-30T20:35:25.037 に答える