2016-06-11 4 views
1

Я новичок в области отладчиков, приборов и JVMTI. Итак, у меня есть несколько вопросов о них.JDI, Java Байт-код и Java-агенты (JWDP, JVMTI)

  1. В чем разница между JDI (Java отладчик интерфейса), JWDP, javaagent и нативного агента (JVMTI). , и где API-интерфейс инструментария java подходит для изображения.

  2. Я использую JDI для перехвата исключений в целевом приложении java. , но я узнал, что JDI недостаточно хорош, если мы говорим о том, как это влияет на производительность целевого приложения. Я читал, что наиболее хорошие приложения делают это с объединением JVMTI с инструментами байтового кода. Но я не могу понять, как можно использовать инструментарий байтового кода с JVMTI. Итак, как мы можем работать с байтовым кодом вместе с JVMTI? Любой пример будет полезен.

  3. Можем ли мы использовать как байтовый код, так и машинный код в java?

  4. Может использоваться статический анализ байтового кода вместе с JVMTI. Если да, то как?

Если у вас возникли вопросы или вопросы, свяжитесь со мной.

ответ

2

1 - Я думаю, что этот сайт очень хорошо объясняет это различие: http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/architecture.html - это в основном 3 уровня абстракции, построенные друг на друге, с JVMTI-интерфейсом непосредственно с запущенным JVM, затем JDWP используется как протокол связи , затем JDI в качестве интерфейса к этой удаленной JVM. Вы можете использовать javaagent для выполнения инструментария байт-кода (ортогонального реализации этих трех вещей).

2 - Я считаю, что наиболее эффективным способом сделать это будет инструмент для всего кода, чтобы добавить try/catch в каждый метод для обработки исключения - когда исключение поймано, вы его обрабатываете (однако вы хотели), а затем повторно выбросить его. Самый простой способ сделать аппаратуру - это подход javaagent (затем использовать javaassist или asm или что-то еще). Вы также можете использовать байт-код из JVMTI, но он намного более громоздкий. Если вам нужны только определенные исключения (а именно те, которые явно выбраны, а не те, которые интерпретируются внутренне интерпретатором, такие как NullPointerException, ArrayIndexOutOfBoundsException и т. Д.), Тогда самый простой способ справиться с ними - это перехват инструкций ATHROW (инструкция используется для исключения исключения). У меня нет особого опыта, но было бы разумно создать агент JVMTI, зарегистрированный для Exception event, но я не уверен в его производительности (может быть так же медленно, как ваш подход JDI, может быть лучше).

3 - Нет: вы можете использовать только байт-код инструмента, работающего на Java. Если вы хотите набрать машинный код, вы можете попробовать сделать что-то вроде булавки, но я думаю, что это, вероятно, выходит из-под контроля за тем, что вы ищете.

4 - Уверен: какой статический анализ вас интересует? Вы могли бы использовать что-то вроде сажи, а также использовать JVMTI.

+0

Большое спасибо за ваш ответ. Что касается статического анализа, то мой вариант использования - это только то, что если я могу узнать фрагменты кода, которые могут вызывать любые исключения, фактически не запуская целевое приложение. Во всяком случае, я не буду использовать анализ байтового кода в ближайшем будущем. Я был просто любопытным, если анализ байтового кода можно сделать с помощью JVMTI. Если бы вы могли указать на какой-то учебник для этого, это будет полезно. Я уже искал Google для этого, но ничего не нашел. Благодарю. –

+0

Если все, что вас интересует, - это точный сайт, который может генерировать исключение (например, «throw new MyException()»;), тогда вы можете использовать ASM, чтобы просто определить инструкцию ATHROW, а затем испустить некоторые инструменты вокруг него. Однако, если ваша цель состоит в более широком поиске всех возможных сайтов вызовов, которые могут вызывать код, который может генерировать исключение, тогда вам нужно построить статический график вызовов. И для этого я перейду к [саже] (https://sable.github.io/soot/). –

 Смежные вопросы

  • Нет связанных вопросов^_^