我想看到它正在执行的JVM的当前(字节码)指令流。经过一些googleing,我发现jvm调试版本提供了-XX:+TraceBytecodes
选项(参见here)。但是,提到的热点JVM调试版本的链接已经死了,我无法在线找到调试版本:/
有没有其他方法可以跟踪jvm字节码流,还是有人能指出我正确的方向?我正在运行64位ubuntu 16.04。
P.S:我知道,打印出完整的指令流会很痛苦。但是,我很好奇
答案 0 :(得分:7)
-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 :(得分: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(和其他东西)是如何工作的,所以这很有趣。