gpt4 book ai didi

java - JDI、Java 字节代码检测和 Java 代理(JWDP、JVMTI)

转载 作者:行者123 更新时间:2023-11-30 02:54:07 25 4
gpt4 key购买 nike

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

  1. JDI(java调试器接口(interface))、JWDP、javaagent和 native 代理(JVMTI)有什么区别。以及 Java Instrumentation API 在图片中的位置。

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

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

  4. 静态字节码分析可以与 JVMTI 一起使用吗?如果是的话怎么办?

如果有任何问题不相关或错误,请告诉我。

最佳答案

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

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

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

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

关于java - JDI、Java 字节代码检测和 Java 代理(JWDP、JVMTI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37762712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com