Java代码转汇编代码的方法
2021/6/4 12:21:50
本文主要是介绍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代码转汇编代码的方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南