首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDI、Java Byte代码插装和Java代理(JWDP、JVMTI)

JDI、Java Byte代码插装和Java代理(JWDP、JVMTI)
EN

Stack Overflow用户
提问于 2016-06-11 10:36:41
回答 1查看 780关注 0票数 3

我是调试器、工具和JVMTI领域的新手。所以我对他们很少有疑问。

  1. JDI(java调试器接口)、JWDP、javaagent和本机代理(JVMTI)之间的区别是什么?以及java工具API在哪里适合于图片。
  2. 我正在使用JDI来拦截目标java应用程序中的异常。但是我发现,如果我们讨论JDI如何影响目标应用程序的性能,JDI是不够好的。我看到,大多数优秀的应用程序都是通过将JVMTI与字节码检测相结合来做到这一点的。但我不明白如何在JVMTI中使用字节代码检测。那么,我们如何与JVMTI一起进行字节代码检测呢?任何例子都会有帮助。
  3. 我们能用java同时测量字节码和机器码吗?
  4. 静态字节码分析可以与JVMTI一起使用吗?如果是,那怎么做?

如果有任何问题是不可放松或错误的,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 00:59:03

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

3-否:您只能在Java中运行字节码。如果你想检测机器代码,你可以试着用引脚之类的东西来做,但我认为这可能是你想要的东西已经失控了。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37762712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档