root@ubuntu:~/Downloads# ./jdk1.6.0_45/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints HelloWorld
Hello OpenJDK
-1
root@ubuntu:~/Downloads# ./jdk1.6.0_45/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints HelloWorld
Hello OpenJDK
-1
root@ubuntu:~/Downloads# ./jdk1.7.0_80/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints HelloWorld
Hello OpenJDK
-1
root@ubuntu:~/Downloads# ./jdk1.8.0_20/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints HelloWorld
Could not load [b]hsdis-amd64.so[/b]; library not loadable; PrintAssembly is disabled
Hello OpenJDK
-1
下载hsdis: https://kenai.com/projects/base-hsdis/downloads
linux-hsdis-amd64.so
改名为hsdis-amd64.so,放入/root/Downloads/jdk1.8.0_20/jre/lib/amd64/server
暂时只有JDK1.8有用,1.6和1.7都没生效,具体先不找原因(可能是要类似debug版本)。
---这里1.6和1.7不生效,应该是HOTSPOT的JIT导致的,我们增加参数-Xcomp,就可以了
root@ubuntu:~/Downloads# ./jdk1.8.0_20/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints HelloWorld > disass.log
截取indexOf部分:
Decoding compiled method 0x00007fe4b8276810:
Code:
[Entry Point]
[Constants]
# {method} {0x00007fe4b6316148} 'indexOf' '(II)I' in 'java/lang/String'
# this: rsi:rsi = 'java/lang/String'
# parm0: rdx = int
# parm1: rcx = int
# [sp+0x40] (sp of caller)
0x00007fe4b82769a0: mov 0x8(%rsi),%r10d
0x00007fe4b82769a4: shl $0x3,%r10
0x00007fe4b82769a8: cmp %rax,%r10
0x00007fe4b82769ab: jne 0x00007fe4b81b3b60 ; {runtime_call}
0x00007fe4b82769b1: nopw 0x0(%rax,%rax,1)
0x00007fe4b82769bc: xchg %ax,%ax
[Verified Entry Point]
0x00007fe4b82769c0: mov %eax,-0x14000(%rsp)
0x00007fe4b82769c7: push %rbp
0x00007fe4b82769c8: sub $0x30,%rsp
0x00007fe4b82769cc: mov $0x7fe4b64ff8b8,%rax ; {metadata(method data for {method} {0x00007fe4b6316148} 'indexOf' '(II)I' in 'java/lang/String')}
<截断>
关于hsdis,可以查看openjdk的文档:
../openjdk/hotspot/src/share/tools/hsdis/README
'hsdis': A HotSpot plugin for disassembling dynamically generated code.
The files in this directory (Makefile, hsdis.[ch], hsdis-demo.c)
are built independently of the HotSpot JVM.
To use the plugin with a JVM, you need a new version that can load it.
If the product mode of your JVM does not accept -XX:+PrintAssembly,
you do not have a version that is new enough.
另外使用HSDB和SAPlugin都没有反汇编成功,后续再搞
分享到:
相关推荐
hsdis-1.1.1-win32-i386 hsdis-1.1.1-win32-i386 hsdis-1.1.1-win32-i386
jvm反汇编插件hsdis 32位和64位,放入如:\Java\jdk1.8.0_141\jre\bin\server
解压后将 hsdis-amd64.dll 文件放入 JDK_HOME/jre/bin/server目录(JDK 9以下)或 JDK_HOME/lib/amd64/server(JDK 9或以上)中即可。 如无法正常使用,可以尝试将 hsdis-amd64.dll 文件放入 C:\Program Files\Java\...
解决:Could not load hsdis-amd64.dll; library not loadable; PrintAssembly is disabled 问题.下载对应版本解压得到dll,保存到jdk目录下\jre\bin\server就可以了
jvm开启-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 需要hsdis-amd64.dll支持才能输出汇编代码,这是编译好的dll,用于windows64位,java9需要放到bin/server中,java8放到jre/bin/server
HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就...
hsdis-i386.dll
hsdis-amd64.dll和hsdis-i386.dll
其中包含以下文件:hsdis-amd64.dll、hsdis-i386.dll、linux-hsdis-amd6、linux-hsdis-i386。用于查看Hotspot的JIT的汇编码。
HSDIS是一个Java官方推荐 HotSpot虚拟机JIT编译代码的反汇编插件。我们有了这个插件后,通过JVM参数-XX:+PrintAssembly就可以加载这个HSDIS插件,然后为我们把JIT动态生成的那些本地代码还原成汇编代码,然后打印...
HSDIS 反汇编插件windows版,mac和linux版可以从GitHub上寻找。解压后将dll放到JAVA_HOME/jre/bin/client即可使用。
HSDIS是一个Java官方推荐 HotSpot虚拟机JIT编译代码的反汇编插件。我们有了这个插件后,通过JVM参数-XX:+PrintAssembly就可以加载这个HSDIS插件,然后为我们把JIT动态生成的那些本地代码还原成汇编代码,然后打印...
hsdis-amd64.so
我弄成压缩包了,适用于win10 64位的hsdis插件,用于把Java程序以汇编格式输出,解压后即可使用里面的hsdis-amd64.dll。
已经编译好的Windows上的HSDIS库,放在JDK_HOME/jre/bin/client和JDK_HOME/jre/binserver文件夹下就可以使用,具体使用命令可查看博客https://blog.csdn.net/qq_32483145/article/details/80229140