我是调试器、仪器和 JVMTI 领域的新手。
所以我对他们没什么疑问。
JDI(java调试器接口)、JWDP、javaagent和本机代理(JVMTI)有什么区别?
Java Instrumentation API 在图中的位置。
我正在使用 JDI 来拦截目标 java 应用程序中的异常。
但如果我们谈论它如何影响目标应用程序的性能,我发现 JDI 还不够好。
我读到大多数优秀的应用程序都是通过将 JVMTI 与字节码检测相结合来实现这一点。但我不明白字节码检测如何与 JVMTI 一起使用。
那么,我们如何与 JVMTI 一起进行字节码检测呢?
任何例子都会有帮助。
我们可以在 java 中同时检测字节码和机器码吗?
静态字节码分析可以和JVMTI一起使用吗?如果是的话怎么办?
如果有任何问题不相关或错误,请告诉我。
1 - 我认为这个网站很好地解释了这种区别:http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/architecture.html 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 代理可能是合理的异常事件 http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#Exception,但我不确定它的性能(可能和你的 JDI 方法一样慢,可能会更好)。
3 - 否:您只能检测在 Java 中运行的字节码。如果你想检测机器代码,你可以尝试使用 pin 之类的东西来做到这一点,但我认为这对于你正在寻找的东西来说可能已经失控了。
4 - 当然:您对哪种静态分析感兴趣?您当然可以使用 soot 之类的东西,也可以使用 JVMTI。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)