我是调试器、工具和JVMTI领域的新手。所以我对他们很少有疑问。
如果有任何问题是不可放松或错误的,请告诉我。
发布于 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。
https://stackoverflow.com/questions/37762712
复制相似问题