2012-05-02 4 views
3

J'essaie d'ajouter un appel de méthode statique au constructeur java.lang.Object en utilisant l'API java.lang.instrument. Je sais que j'ai les bases correctes parce que cela fonctionne si je fais appeler la méthode System.gc(). J'ai vérifié cela en exécutant -verbosegc avec et sans l'instrumentation. Si je change l'appel de méthode à une classe statique/méthode dans mon propre paquet que je reçois une erreur fatale:Comment analysez-vous les erreurs fatales -javaagent?

Exception dans le thread FATAL ERROR « principal » dans la méthode native: traitement des -javaagent n'a

Non Les fichiers de vidage sont créés dans le répertoire de travail, donc je trouve difficile de comprendre ce qui ne va pas. Autres informations:

  • J'assure la classe de méthode statique est chargée dans la méthode premain avant transformation
  • L'appel de méthode statique ne donne pas lieu à la création de nouveaux objets
  • La dernière classe chargée est InterruptedIOException bien que je pense c'est juste un effet secondaire

Merci d'avance.

+1

Il s'avère que j'ai dû ajouter des bibliothèques de génération de bytecode au chemin de classe de démarrage dans le manifeste de l'agent jar comme documenté ici http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package- summary.html – barry

Répondre

1

Oui, comme @barry l'a noté dans son commentaire, vous devez ajouter au manifeste de l'agent Java la définition Boot-Class-Path. Pour moi, je javassist dans mon agent pour créer le bytecode, donc mon manifeste ressemble à ceci:

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 

J'ai tous les fichiers jar mon application dans le même répertoire lib comme les pots de javassist et agent. Avec tout sur le classpath, dans le même dossier, cela fonctionne.

Questions connexes