2012-05-02 2 views
3

Я пытаюсь добавить вызов статического метода в конструктор java.lang.Object, используя API java.lang.instrument. Я знаю, что у меня есть основы, потому что это работает, если я вызываю метод вызова System.gc(). Я проверил это, выполнив -verbosegc с помощью инструментария и без него. Если изменить вызов метода на статический класс/метод в моем собственном пакете я получаю фатальную ошибку:Как вы анализируете фатальные ошибки javaagent?

Исключение в нити «основной» неустранимая ошибка нативного метода: обработка -javaagent не удалось

Нет файлы дампа создаются в рабочем каталоге, поэтому мне трудно понять, что не так. Дополнительная информация:

  • Я обеспечить статический класс метод загружается в методе premain перед трансформацией
  • Статический вызов метода не приводит к созданию новых объектов
  • Последний класс загруженная InterruptedIOException хотя я думаю, это только побочный эффект

Заранее спасибо.

+1

Оказывается, что мне пришлось добавлять байт-генерации генерации байт-кода в путь загрузки в манифест агента jar, как описано здесь http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package- summary.html – barry

ответ

1

Да, как отметил в своем комментарии @barry, вы должны добавить в манифест Java Agent определение 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 

У меня есть все фляги файлы моего приложения в том же каталоге, что Lib в Javassist и агент банке. Все, что находится на пути к классу, в той же папке, работает.