跟踪java字节码流

时间:2016-10-26 08:39:15

标签: java jvm

我想看到它正在执行的JVM的当前(字节码)指令流。经过一些googleing,我发现jvm调试版本提供了-XX:+TraceBytecodes选项(参见here)。但是,提到的热点JVM调试版本的链接已经死了,我无法在线找到调试版本:/

有没有其他方法可以跟踪jvm字节码流,还是有人能指出我正确的方向?我正在运行64位ubuntu 16.04。

P.S:我知道,打印出完整的指令流会很痛苦。但是,我很好奇

2 个答案:

答案 0 :(得分:7)

-XX:+TraceBytecodes选项正是您要找的东西。它在HotSpot JVM的调试版本中可用。您可以自己轻松构建JVM - 只需HotSpot,甚至不是JDK。

  1. 从OpenJDK 8项目克隆热点存储库

    hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
    
  2. 构建' fastdebug' JVM(假设JDK已安装在/usr/java/jdk1.8.0_102

    cd hotspot/make
    make ALT_BOOTDIR=/usr/java/jdk1.8.0_102 ARCH_DATA_MODEL=64 fastdebug
    

    您可以添加HOTSPOT_BUILD_JOBS=N以在N并行流程中运行编译。

  3. 运行它

    export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102
    ../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass
    

答案 1 :(得分:0)

can someone point me in the right direction

好吧,我会试试。我发现的唯一一件事就是使用jdb。你必须创建自己的“打印机”。

因为你出于好奇而不是需要这样做,我认为你不会像创造一个你想要的应用程序那样,但也许你会找到其他的资源(我没找到任何)或者最后放松了工作。

据我所知,jdb(java调试器)是一个使用JDBA(Java平台调试器架构)和JVM TI(Java虚拟机工具接口)的CLI程序。

这是jdb的工作原理:

  • 使用-g选项(非强制性)编译代码,使用jdb(而不是java)启动主类。
  • 您可以在控制台中使用step命令逐步执行代码,但这可能会运行多个字节码指令(所有指令都与源代码中的指令相对应)
  • 您可以使用仅执行一个字节码行的stepi
  • 您必须设置断点以逐步执行,cont选项将转到下一个断点(就像在IDE中一样)。
  • list选项允许您查看断点/行周围的代码(但不是字节码)。
  • 您也可以在源文件中获取当前行号,并在字节码中(我认为使用wherei)。

另一个工具是javap -c来获取可读字节码(但我想你已经知道了这一点)。

现在有了所有这些,我想你会看到我要去的地方。您创建一个使用jdb执行逐步字节码执行的应用程序(java应用程序或某些shell / dos),然后从javac -p中选择字节码中的匹配行以打印它。请注意,我不知道您应该如何在多线程环境中执行操作。还有字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项。

我相信IDE的调试器使用JVM TI,并且可能比jdb更强大,更复杂。

您可能感兴趣的一些链接:

至于我自己,我也很好奇java debuging(和其他东西)是如何工作的,所以这很有趣。