我希望看到它正在执行的JVM的当前(字节码)指令流。在googleing之后,我发现jvm调试构建提供了-XX:+TraceBytecodes选项(参见这里)。但是,上述指向hotspot JVM调试构建的链接已经失效,我无法在网上找到调试构建:/
是否有另一种方法来跟踪jvm字节码流,或者有人可以指出正确的方向?我在运行64位的ubuntu 16.04。
记者:我知道,打印出完整的指令流会非常缓慢。不过,我很好奇
发布于 2016-10-28 00:53:35
-XX:+TraceBytecodes选项正是您要寻找的内容。它可以在HotSpot JVM的调试构建中使用。您可以自己轻松地构建JVM --只是HotSpot,甚至JDK都不行。
/usr/java/jdk1.8.0_102上)
cd热点/使ALT_BOOTDIR=/usr/java/ make 1.8.0_102 ARCH_DATA_MODEL=64快速调试
您可以添加HOTSPOT_BUILD_JOBS=N以在N并行进程中运行编译。发布于 2016-10-26 12:25:23
can someone point me in the right direction好吧,我试试。我发现的唯一一件事就是使用jdb。你必须创建自己的“打印机”。
因为你是出于好奇而不是出于需要才问这个问题的,所以我认为如果一个应用程序做了你想要的事情,你就不会这么做了,但也许你会找到其他的资源来完成这个任务(我没有找到),或者最终让你的工作变得轻松了。
据我所知,jdb (java调试器)是一个使用JDBA ()和()的CLI程序。
这是jdb的工作方式:
-g选项编译代码(不是强制性的),使用jdb (而不是java)启动主类。step命令逐步执行代码,但这可能会运行多个字节码指令(与源代码中的指令对应的所有字节码指令)。stepi,它只执行一个字节码行。cont选项将转到下一个断点(就像在IDE中一样)。list选项允许您查看断点/行周围的代码(而不是字节码)。wherei )。另一个工具是javap -c,以获得可读的字节码(但我认为您已经知道这一点)。
有了这些,我猜你知道我要去哪儿了。您创建一个应用程序(java应用程序,或一些shell/dos),它使用jdb逐步执行字节码,然后从javac -p中选择字节码中的匹配行来打印它。请注意,我不知道您应该如何在多线程环境中工作。还有一些字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项。
我相信IDE的调试器使用了JVM TI,它可能比jdb更强大、更快、更复杂。
一些你可能感兴趣的链接:
至于我自己,我也很好奇java调试器(和其他东西)是如何工作的,所以这有点有趣。
https://stackoverflow.com/questions/40257504
复制相似问题