我想看看它正在执行的JVM的当前(字节码)指令流。经过一些googleing后,我发现jvm debug build提供了-XX:+TraceBytecodes
选项(请参阅here)。然而,提到的热点JVM调试版本的链接已经死了,我找不到在线调试版本:/跟踪java字节码流
是否有另一种方式来跟踪jvm字节码流,或者有人能指向正确的方向?我正在运行64位Ubuntu的16.04。 P:我知道,打印出完整的指令流将会非常缓慢。然而,我很好奇
我想看看它正在执行的JVM的当前(字节码)指令流。经过一些googleing后,我发现jvm debug build提供了-XX:+TraceBytecodes
选项(请参阅here)。然而,提到的热点JVM调试版本的链接已经死了,我找不到在线调试版本:/跟踪java字节码流
是否有另一种方式来跟踪jvm字节码流,或者有人能指向正确的方向?我正在运行64位Ubuntu的16.04。 P:我知道,打印出完整的指令流将会非常缓慢。然而,我很好奇
-XX:+TraceBytecodes
选项正是你在找什么。它可用于HotSpot JVM的调试版本。您可以自己轻松构建JVM - 只需HotSpot,甚至不需要JDK。从OpenJDK的8项目
克隆热点库
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
建设 '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
并行进程中。
运行它
export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102
../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass
超级有趣的答案,谢谢!步骤1和2确定。对于运行,我点击:'错误:找不到Java启动程序“/java/re/j2se/1.8.0/promoted/latest/binaries/linux-amd64/bin/java”'。任何提示? –
@MartinMonperrus这意味着'ALT_JAVA_HOME' env变量没有被设置。您需要在'build/linux/linux_amd64_compiler2/fastdebug/hotspot'脚本中直接设置'ALT_JAVA_HOME'或修改JDK的路径。 – apangin
你是对的。有用。非常感谢。 –
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。
我不是真的我的理解:要打印(在一个文件或控制台)是实时执行的字节码? – Asoub
它不需要实时,但是。这几乎是我的目标 – user1228633
fastdebug版本不再发布,但源代码是开放的,所以你可以自己创建一个,如果你想。 JDK9的根存储库在这里http://hg.openjdk.java.net/jdk9/jdk9/。 [本自述](http://hg.openjdk.java.net/jdk9/jdk9/raw-file/f2bdff2bd261/README-builds.html)是一个很好的开始。 –