JDI,Java字节代码检测和Java代理(JWDP,JVMTI)

时间:2016-06-11 10:36:42

标签: java bytecode-manipulation javaagents jvmti jdi

我是调试器,仪器和JVMTI领域的新手。 所以我对它们的问题很少。

  1. JDI(java调试器接口),JWDP,javaagent和本机代理(JVMTI)之间有什么区别。 java instrumentation API在哪里适合。

  2. 我正在使用JDI拦截目标java应用程序中的异常。 但是如果我们谈论它如何影响目标应用程序的性能,我发现JDI还不够好。 我读到大多数优秀的应用程序通过将JVMTI与字节码检测相结合来实现这一点。但我无法理解字节码检测如何与JVMTI一起使用。 那么,我们如何与JVMTI一起进行字节码检测呢? 任何一个例子都会有所帮助。

  3. 我们可以在java中检测字节码和机器码吗?

  4. 静态字节码分析可以与JVMTI一起使用。如果是,那么如何?

  5. 如果有任何问题无关紧要或错误,请告诉我。

1 个答案:

答案 0 :(得分:2)

1 - 我认为这个网站很好地解释了这个区别:http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/architecture.html - 这些基本上是3层抽象构建在一起,JVMTI直接与正在运行的JVM连接,然后JDWP用作通信协议,然后JDI作为远程JVM的接口。您可以使用javaagent来执行字节码检测(与这3件事的实现正交)。

2 - 我认为执行此操作的最高效方法是检测所有代码以在每个方法中添加try / catch来处理异常 - 当捕获异常时,您处理它(但是您想要) ,然后重新扔它。最简单的检测方法是使用javaagent方法(然后使用javaassist或asm或其他方法)。您也可以从JVMTI检测字节码,但它更加繁琐。如果你只关心特定的异常(即那些被显式抛出的异常,而不是那些被解释器内部抛出的异常,如NullPointerException,ArrayIndexOutOfBoundsException等),那么处理这些异常的最简单方法就是拦截ATHROW指令(指令)过去抛出异常)。我没有具体的经验,但是创建一个为Exception event注册的JVMTI代理可能是合理的,但我不确定它的性能(可能和JDI方法一样慢,可能更好)

3 - 否:您只能检测在Java中运行的字节码。如果您想要检测机器代码,您可以尝试使用pin这样的东西,但我认为这可能会让您无法理解您正在寻找的东西。

4 - 当然:您对哪种静态分析感兴趣?你当然可以使用类似烟灰的东西,也可以使用JVMTI。