首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跟踪java字节码流

跟踪java字节码流
EN

Stack Overflow用户
提问于 2016-10-26 08:39:15
回答 2查看 1.3K关注 0票数 2

我希望看到它正在执行的JVM的当前(字节码)指令流。在googleing之后,我发现jvm调试构建提供了-XX:+TraceBytecodes选项(参见这里)。但是,上述指向hotspot JVM调试构建的链接已经失效,我无法在网上找到调试构建:/

是否有另一种方法来跟踪jvm字节码流,或者有人可以指出正确的方向?我在运行64位的ubuntu 16.04。

记者:我知道,打印出完整的指令流会非常缓慢。不过,我很好奇

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 00:53:35

-XX:+TraceBytecodes选项正是您要寻找的内容。它可以在HotSpot JVM的调试构建中使用。您可以自己轻松地构建JVM --只是HotSpot,甚至JDK都不行。

  1. 从OpenJDK 8项目克隆热点存储库 hg克隆http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
  2. 构建“快速调试”JVM (假设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并行进程中运行编译。
  3. 运行它 导出ALT_java_HOME=/usr/java/102 1.8.0_102 ../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass
票数 9
EN

Stack Overflow用户

发布于 2016-10-26 12:25:23

代码语言:javascript
复制
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更强大、更快、更复杂。

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

  • 如何调试字节码
  • 用jdb进行基本调试
  • Jdb命令列表
  • Java调试器平台架构

至于我自己,我也很好奇java调试器(和其他东西)是如何工作的,所以这有点有趣。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40257504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档