2016-10-26 85 views
1

我想看看它正在执行的JVM的当前(字节码)指令流。经过一些googleing后,我发现jvm debug build提供了-XX:+TraceBytecodes选项(请参阅here)。然而,提到的热点JVM调试版本的链接已经死了,我找不到在线调试版本:/跟踪java字节码流

是否有另一种方式来跟踪jvm字节码流,或者有人能指向正确的方向?我正在运行64位Ubuntu的16.04。 P:我知道,打印出完整的指令流将会非常缓慢。然而,我很好奇

+0

我不是真的我的理解:要打印(在一个文件或控制台)是实时执行的字节码? – Asoub

+0

它不需要实时,但是。这几乎是我的目标 – user1228633

+0

fastdebug版本不再发布,但源代码是开放的,所以你可以自己创建一个,如果你想。 JDK9的根存储库在这里http://hg.openjdk.java.net/jdk9/jdk9/。 [本自述](http://hg.openjdk.java.net/jdk9/jdk9/raw-file/f2bdff2bd261/README-builds.html)是一个很好的开始。 –

回答

6

-XX:+TraceBytecodes选项正是你在找什么。它可用于HotSpot JVM的调试版本。您可以自己轻松构建JVM - 只需HotSpot,甚至不需要JDK。从OpenJDK的8项目

  1. 克隆热点库

    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 
    
+0

超级有趣的答案,谢谢!步骤1和2确定。对于运行,我点击:'错误:找不到Java启动程序“/java/re/j2se/1.8.0/promoted/latest/binaries/linux-amd64/bin/java”'。任何提示? –

+0

@MartinMonperrus这意味着'ALT_JAVA_HOME' env变量没有被设置。您需要在'build/linux/linux_amd64_compiler2/fastdebug/hotspot'脚本中直接设置'ALT_JAVA_HOME'或修改JDK的路径。 – apangin

+0

你是对的。有用。非常感谢。 –

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更快更复杂,而且比jdb复杂。

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

至于我自己,我也是在java中如何调试运行好奇(和其他的东西)工作,所以这是有点interssti NG。