Java代码转汇编代码的方法

1、下载hsdis-amd64.dylib工具

链接: https://pan.baidu.com/s/1Qpww4ysxMQXgdekiSuxdIA 密码: 1jva


2、将hsdis-amd64.dylib放到Jdk对应文件夹中

将工具放到
…/jdk1.8.0_181.jdk/Contents/Home/jre/lib/server/


3、使用hsdis-amd64.dylib工具

通过在执行java命令的时候增加配置参数,执行java文件的同时输出其汇编代码。
参数为:-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly

以代码V.java为例

public class V {
    private static volatile int a_value;
    public static void a_test(){
        a_value = 1;
    }

    public static void main(String[] args) {
        a_test();
        System.out.println("aaaaa");
    }
}
方法一 命令行执行

java -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly …/V.java

除了输出aaaaa外,还输出了汇编代码,代码非常多就是了。

如果觉得代码太多,可以针对某个方法进行汇编代码的输出。在XX:CompileCommand=compileonly后增加对应方法即可。
例如:… XX:CompileCommand=compileonly,*V.a_test()
该操作我没做命令行试过,我都是在ide里边配置的。

aaaaa
server jjleong$ java -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly .../V.java
Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompileCommand: An error occurred during parsing
Line: compileonly
Error: Could not parse method pattern

Usage: '-XX:CompileCommand=command,"package/Class.method()"'
Use:   '-XX:CompileCommand=help' for more information.

Compiled method (c1)      22    1       3       java.lang.invoke.MethodHandle::<clinit> (30 bytes)
 total in heap  [0x000000011a7cf010,0x000000011a7cf860] = 2128
 relocation     [0x000000011a7cf188,0x000000011a7cf208] = 128
 main code      [0x000000011a7cf220,0x000000011a7cf5a0] = 896
 stub code      [0x000000011a7cf5a0,0x000000011a7cf658] = 184
 oops           [0x000000011a7cf658,0x000000011a7cf668] = 16
 metadata       [0x000000011a7cf668,0x000000011a7cf678] = 16
 scopes data    [0x000000011a7cf678,0x000000011a7cf6f0] = 120
 scopes pcs     [0x000000011a7cf6f0,0x000000011a7cf840] = 336
 dependencies   [0x000000011a7cf840,0x000000011a7cf848] = 8
 nul chk table  [0x000000011a7cf848,0x000000011a7cf860] = 24
Loaded disassembler from hsdis-amd64.dylib
----------------------------------------------------------------------
java/lang/invoke/MethodHandle.<clinit>()V  [0x000000011a7cf220, 0x000000011a7cf658]  1080 bytes
[Disassembling for mach='i386:x86-64']
[Entry Point]
[Verified Entry Point]
[Constants]
  # {method} {0x00000008000a7400} '<clinit>' '()V' in 'java/lang/invoke/MethodHandle'
  #           [sp+0x60]  (sp of caller)
  0x000000011a7cf220: mov    %eax,-0x14000(%rsp)
  0x000000011a7cf227: push   %rbp
  0x000000011a7cf228: sub    $0x50,%rsp
  0x000000011a7cf22c: movabs $0x133245bf0,%rsi              ;   {metadata(method data for {method} {0x00000008000a7400} '<clinit>' '()V' in 'java/lang/invoke/MethodHandle')}
  0x000000011a7cf236: mov    0x104(%rsi),%edi
  0x000000011a7cf23c: add    $0x8,%edi
  0x000000011a7cf23f: mov    %edi,0x104(%rsi)
  0x000000011a7cf245: jmpq   0x000000011a7cf3ae             ;*ldc {reexecute=0 rethrow=0 return_oop=0}
                                                            ; - java.lang.invoke.MethodHandle::<clinit>@0 (line 440)

  0x000000011a7cf24a: movabs $0x7bfe2fd18,%rsi              ;   {oop(a 'java/lang/Class'{0x00000007bfe2fd18} = 'java/lang/invoke/MethodHandle')}
  0x000000011a7cf254: mov    %rsi,%rdi
  0x000000011a7cf257: movabs $0x133245bf0,%rbx              ;   {metadata(method data for {method} {0x00000008000a7400} '<clinit>' '()V' in 'java/lang/invoke/MethodHandle')}
  0x000000011a7cf261: addq   $0x1,0x140(%rbx)
  0x000000011a7cf269: nopw   0x0(%rax,%rax,1)
  0x000000011a7cf26f: callq  0x000000011a265900             ; ImmutableOopMap{}
                                                            ;*invokevirtual desiredAssertionStatus {reexecute=0 rethrow=0 return_oop=0}
                                                            ; - java.lang.invoke.MethodHandle::<clinit>@2 (line 440)
                                                            ;   {optimized virtual_call}
  0x000000011a7cf274: cmp    $0x0,%eax
  0x000000011a7cf277: movabs $0x133245bf0,%rdx              ;   {metadata(method data for {method} {0x00000008000a7400} '<clinit>' '()V' in 'java/lang/invoke/MethodHandle')}
  0x000000011a7cf281: movabs $0x178,%rcx
  0x000000011a7cf28b: jne    0x000000011a7cf29b
  0x000000011a7cf291: movabs $0x188,%rcx
  0x000000011a7cf29b: mov    (%rdx,%rcx,1),%rsi
  0x000000011a7cf29f: lea    0x1(%rsi),%rsi
  ...

方法二 ide执行

以android studio为例,在Run Config里边配置VM options即可
Java代码转汇编代码的方法

上一篇:JavaScript最后的课程笔记


下一篇:java代理