HotSpot反匯編插件HSDIS下載使用
今天學習《深入理解Java虛擬機》第4章,介紹了HSDIS的使用,生成匯編代碼的解讀。自己實踐了一下。
1.首先從Project Kenai網站(http://kenai.com/projects/base-hsdis)上下載反匯編的插件HSDIS,打開網站后顯示:
好可惜網站已經關閉了。于是我第一時間到CSDN網站上搜索,資源倒是搜到了,不過下載需要最少17幣
,唉!現在國內的平臺收費機制……所以又輾轉到GitHub上下載了~免費的(已上傳到我的資源-免費)。下載完了解壓把dll放到JAVA_HOME/jre/bin/client和JAVA_HOME/jre/bin/server目錄下;2.按書撰寫Bar.java,代碼如下:
package com.test.MonitorTool;
public class Bar {
int a = 1;
static int b = 2;
public int sum(int c){
return a+b+c;
}
public static void main(String[] args) {
new Bar().sum(3);
}
}
3.將Bar.java放在了D:\com\test\MonitorTool目錄;
然后用javac命令編譯一下,生成Bar.class;
然后可以執行java命令:
D:\>java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCom
mand=dontinline,*Bar.sum -XX:CompileCommand=compileonly,*Bar.sum com.test.Monito
rTool.Bar
注意如果出現:Unrecognized VM option '+PrintAssembly' 一定要添加-XX:+UnlockDiagnosticVMOptions 如上;
最后生成反匯編代碼:
Code:
[Disassembling for mach='i386:x86-64']
[Entry Point]
[Constants]
# {method} 'sum' '(I)I' in 'com/test/MonitorTool/Bar'
# this: rdx:rdx = 'com/test/MonitorTool/Bar'
# parm0: r8 = int
# [sp+0x20] (sp of caller)
0x00000000020e1120: mov 0x8(%rdx),%r10d
0x00000000020e1124: shl $0x3,%r10
0x00000000020e1128: cmp %r10,%rax
0x00000000020e112b: jne 0x00000000020b7720 ; {runtime_call}
0x00000000020e1131: data32 xchg %ax,%ax
0x00000000020e1134: nopl 0x0(%rax,%rax,1)
0x00000000020e113c: data32 data32 xchg %ax,%ax
[Verified Entry Point]
0x00000000020e1140: push %rbp
0x00000000020e1141: sub $0x10,%rsp
0x00000000020e1145: nop ;*synchronization entry
; - com.test.MonitorTool.Bar::su
m@-1 (line 8)
0x00000000020e1146: movabs $0x77d6ee0f0,%r10 ; {oop('com/test/MonitorTool/B
ar')}
0x00000000020e1150: mov 0x260(%r10),%r10d
0x00000000020e1157: add 0xc(%rdx),%r10d
0x00000000020e115b: mov %r8d,%eax
0x00000000020e115e: add %r10d,%eax ;*iadd
; - com.test.MonitorTool.Bar::su
m@9 (line 8)
0x00000000020e1161: add $0x10,%rsp
0x00000000020e1165: pop %rbp
0x00000000020e1166: test %eax,-0x1d5116c(%rip) # 0x0000000000390000
; {poll_return}
0x00000000020e116c: retq
0x00000000020e116d: hlt
0x00000000020e116e: hlt
0x00000000020e116f: hlt
0x00000000020e1170: hlt
0x00000000020e1171: hlt
0x00000000020e1172: hlt
0x00000000020e1173: hlt
0x00000000020e1174: hlt
0x00000000020e1175: hlt
0x00000000020e1176: hlt
0x00000000020e1177: hlt
0x00000000020e1178: hlt
0x00000000020e1179: hlt
0x00000000020e117a: hlt
0x00000000020e117b: hlt
0x00000000020e117c: hlt
0x00000000020e117d: hlt
0x00000000020e117e: hlt
0x00000000020e117f: hlt
[Exception Handler]
[Stub Code]
0x00000000020e1180: jmpq 0x00000000020de1a0 ; {no_reloc}
[Deopt Handler Code]
0x00000000020e1185: callq 0x00000000020e118a
0x00000000020e118a: subq $0x5,(%rsp)
0x00000000020e118f: jmpq 0x00000000020b88c0 ; {runtime_call}
0x00000000020e1194: add %al,(%rax)
0x00000000020e1196: add %al,(%rax)
內容解釋參考教材說明啦~
拜~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/46103.html
標籤:Java SE
