Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪java字节码流_Java_Jvm - Fatal编程技术网

跟踪java字节码流

跟踪java字节码流,java,jvm,Java,Jvm,我希望看到它正在执行的JVM的当前(字节码)指令流。通过谷歌搜索,我发现jvm调试构建提供了-XX:+TraceBytecodes选项(请参阅)。但是,提到的指向hotspot JVM调试版本的链接已失效,我无法在线找到调试版本:/ 有没有其他方法来跟踪jvm字节码流,或者有人能给我指出正确的方向?我正在运行64位ubuntu 16.04 我知道,要打印出完整的指令流会非常慢。然而,我是古玩 can someone point me in the right direction 好吧,我试试看

我希望看到它正在执行的JVM的当前(字节码)指令流。通过谷歌搜索,我发现jvm调试构建提供了
-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
  • 您必须设置一个断点来逐步执行,并且
    cont
    选项将转到下一个断点(就像在IDE中一样)
  • 列表
    选项允许您查看断点/行周围的代码(但不是字节码)
  • 您还可以在源文件和字节码中获取当前行号(我想是使用
    where I
另一个工具是
javap-c
,用于获取可读的字节码(但我认为您已经知道这一点)

现在有了这些,我想你知道我要去哪里了。您创建了一个应用程序(java应用程序,或一些shell/dos),它使用
jdb
逐步执行字节码,然后从
javac-p
中选择字节码中的匹配行来打印它。请注意,我不知道在多线程环境中应该怎么做。还有一些字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项

我相信JVMTI是由IDE的调试器使用的,它可能比jdb更强大、更快、更复杂

您可能会感兴趣的一些链接:

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

好吧,我试试看。我唯一发现的是使用
jdb
。您必须创建自己的“打印机”

因为你问这个问题是出于好奇,而不是出于需要,我不认为你会去创造一个能满足你需要的应用程序,但也许你会找到其他的资源(我没有找到),或者最终让工作变得轻松

据我所知,
jdb
(java调试器)是一个使用JDBA(java平台调试器体系结构)和jvmti(java虚拟机工具接口)的CLI程序

这是jdb的工作原理:

  • 使用
    -g
    选项编译代码(非强制),使用
    jdb
    启动主类(而不是
    java
  • 您可以在控制台中使用
    step
    命令逐步执行代码,但这可能会运行多个字节码指令(所有与源代码中的指令相对应的指令)
  • 您可以使用只执行一行字节码的
    stepi
  • 您必须设置一个断点来逐步执行,并且
    cont
    选项将转到下一个断点(就像在IDE中一样)
  • 列表
    选项允许您查看断点/行周围的代码(但不是字节码)
  • 您还可以在源文件和字节码中获取当前行号(我想是使用
    where I
另一个工具是
javap-c
,用于获取可读的字节码(但我认为您已经知道这一点)

现在有了这些,我想你知道我要去哪里了。您创建了一个应用程序(java应用程序,或一些shell/dos),它使用
jdb
逐步执行字节码,然后从
javac-p
中选择字节码中的匹配行来打印它。请注意,我不知道在多线程环境中应该怎么做。还有一些字节码可视化工具,如ASM或dirtyJOE,但我认为它们不提供字节码调试选项

我相信JVMTI是由IDE的调试器使用的,它可能比jdb更强大、更快、更复杂

您可能会感兴趣的一些链接:


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

-XX:+TraceBytecodes
选项正是您想要的。它在HotSpot JVM的调试版本中可用。您可以轻松地自己构建JVM—只需热点,甚至不需要JDK

  • 从OpenJDK 8项目克隆热点存储库

    hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
    
  • 构建“fastdebug”JVM(假设JDK已经安装在
    /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