3

我是调试器、仪器和 JVMTI 领域的新手。所以我对他们没有几个问题。

  1. JDI(Java 调试器接口)、JWDP、javaagent 和本机代理(JVMTI)有什么区别。以及 java 仪表 API 适合图片的位置。

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

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

  4. 静态字节码分析能否与 JVMTI 一起使用。如果是,那怎么办?

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

4

1 回答 1

3

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 指令(指令用于抛出异常)。我没有具体经验,异常事件,但我不确定它的性能(可能和你的 JDI 方法一样慢,可能会更好)。

3 - 否:您只能检测在 Java 中运行的字节码。如果您想检测机器代码,您可以尝试使用 pin 之类的东西来执行此操作,但我认为这对于您正在寻找的东西可能会失控。

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

于 2016-06-13T00:59:03.250 回答