跟踪java字节码流
我希望看到它正在执行的JVM的当前(字节码)指令流。通过谷歌搜索,我发现jvm调试构建提供了跟踪java字节码流,java,jvm,Java,Jvm,我希望看到它正在执行的JVM的当前(字节码)指令流。通过谷歌搜索,我发现jvm调试构建提供了-XX:+TraceBytecodes选项(请参阅)。但是,提到的指向hotspot JVM调试版本的链接已失效,我无法在线找到调试版本:/ 有没有其他方法来跟踪jvm字节码流,或者有人能给我指出正确的方向?我正在运行64位ubuntu 16.04 我知道,要打印出完整的指令流会非常慢。然而,我是古玩 can someone point me in the right direction 好吧,我试试看
-XX:+TraceBytecodes
选项(请参阅)。但是,提到的指向hotspot JVM调试版本的链接已失效,我无法在线找到调试版本:/
有没有其他方法来跟踪jvm字节码流,或者有人能给我指出正确的方向?我正在运行64位ubuntu 16.04
我知道,要打印出完整的指令流会非常慢。然而,我是古玩
can someone point me in the right direction
好吧,我试试看。我唯一发现的是使用jdb
。您必须创建自己的“打印机”
因为你问这个问题是出于好奇,而不是出于需要,我不认为你会去创造一个能满足你需要的应用程序,但也许你会找到其他的资源(我没有找到),或者最终让工作变得轻松
据我所知,jdb
(java调试器)是一个使用JDBA(java平台调试器体系结构)和jvmti(java虚拟机工具接口)的CLI程序
这是jdb的工作原理:
- 使用
选项编译代码(非强制),使用-g
启动主类(而不是jdb
)李>java
- 您可以在控制台中使用
命令逐步执行代码,但这可能会运行多个字节码指令(所有与源代码中的指令相对应的指令)step
- 您可以使用只执行一行字节码的
李>stepi
- 您必须设置一个断点来逐步执行,并且
选项将转到下一个断点(就像在IDE中一样)李>cont
选项允许您查看断点/行周围的代码(但不是字节码)李>列表
- 您还可以在源文件和字节码中获取当前行号(我想是使用
)where I
javap-c
,用于获取可读的字节码(但我认为您已经知道这一点)
现在有了这些,我想你知道我要去哪里了。您创建了一个应用程序(java应用程序,或一些shell/dos),它使用jdb
逐步执行字节码,然后从javac-p
中选择字节码中的匹配行来打印它。请注意,我不知道在多线程环境中应该怎么做。还有一些字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项
我相信JVMTI是由IDE的调试器使用的,它可能比jdb更强大、更快、更复杂
您可能会感兴趣的一些链接:
jdb
。您必须创建自己的“打印机”
因为你问这个问题是出于好奇,而不是出于需要,我不认为你会去创造一个能满足你需要的应用程序,但也许你会找到其他的资源(我没有找到),或者最终让工作变得轻松
据我所知,jdb
(java调试器)是一个使用JDBA(java平台调试器体系结构)和jvmti(java虚拟机工具接口)的CLI程序
这是jdb的工作原理:
- 使用
选项编译代码(非强制),使用-g
启动主类(而不是jdb
)李>java
- 您可以在控制台中使用
命令逐步执行代码,但这可能会运行多个字节码指令(所有与源代码中的指令相对应的指令)step
- 您可以使用只执行一行字节码的
李>stepi
- 您必须设置一个断点来逐步执行,并且
选项将转到下一个断点(就像在IDE中一样)李>cont
选项允许您查看断点/行周围的代码(但不是字节码)李>列表
- 您还可以在源文件和字节码中获取当前行号(我想是使用
)where I
javap-c
,用于获取可读的字节码(但我认为您已经知道这一点)
现在有了这些,我想你知道我要去哪里了。您创建了一个应用程序(java应用程序,或一些shell/dos),它使用jdb
逐步执行字节码,然后从javac-p
中选择字节码中的匹配行来打印它。请注意,我不知道在多线程环境中应该怎么做。还有一些字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项
我相信JVMTI是由IDE的调试器使用的,它可能比jdb更强大、更快、更复杂
您可能会感兴趣的一些链接:
至于我自己,我也很好奇java调试(和其他东西)是如何工作的,所以这有点有趣。
-XX:+TraceBytecodes
选项正是您想要的。它在HotSpot JVM的调试版本中可用。您可以轻松地自己构建JVM—只需热点,甚至不需要JDK
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
/usr/java/jdk1.8.0\u 102
)
您可以添加HOTSPOT\u BUILD\u JOBS=N
以在N
并行进程中运行编译export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102
../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass
-XX:+TraceBytecodes
选项正是您想要的。它在HotSpot JVM的调试版本中可用。你
export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102
../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass