Skip to main content

jdk 反汇编

· 5 min read

背景

很多时候可以通过java 命令打印反汇编信息

相关命令

jvm参数: HotSpot options (with an -XX: prefix on the command line)

核心参数是 -XX:+PrintAssembly , 这个参数可以获取对应的反汇编编码

./java   -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*com.Hello::testIncr  com.Hello  >> test.txt

解析参数

Thread 2 "java" hit Hardware watchpoint 19: PrintAssembly

Old value = false
New value = true
JVMFlag::write<bool> (this=0x7f1814bcf140 <flagTable+17600>, value=true) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlag.hpp:237
237 }
(gdb) bt
#0 JVMFlag::write<bool> (this=0x7f1814bcf140 <flagTable+17600>, value=true) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlag.hpp:237
#1 0x00007f18137cf984 in TypedFlagAccessImpl<bool, EventBooleanFlagChanged>::check_constraint_and_set (this=0x7f1814bd49c0 <flag_access_bool>, flag=0x7f1814bcf140 <flagTable+17600>, value_addr=0x7f18129e7f54,
origin=JVMFlagOrigin::COMMAND_LINE, verbose=true) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.cpp:75
#2 0x00007f18137ce655 in FlagAccessImpl_bool::set_impl (this=0x7f1814bd49c0 <flag_access_bool>, flag=0x7f1814bcf140 <flagTable+17600>, value_addr=0x7f18129e7f54, origin=JVMFlagOrigin::COMMAND_LINE)
at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.cpp:94
#3 0x00007f18137ce576 in FlagAccessImpl::set (this=0x7f1814bd49c0 <flag_access_bool>, flag=0x7f1814bcf140 <flagTable+17600>, value=0x7f18129e7f54, origin=JVMFlagOrigin::COMMAND_LINE)
at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.cpp:49
#4 0x00007f18137cc5db in JVMFlagAccess::set_impl (flag=0x7f1814bcf140 <flagTable+17600>, value=0x7f18129e7f54, origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.cpp:299
#5 0x00007f181306cdf9 in JVMFlagAccess::set<bool, 0> (flag=0x7f1814bcf140 <flagTable+17600>, value=0x7f18129e7f54, origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.hpp:120
#6 0x00007f181306bd96 in JVMFlagAccess::set_bool (f=0x7f1814bcf140 <flagTable+17600>, v=0x7f18129e7f54, origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/flags/jvmFlagAccess.hpp:133
#7 0x00007f1813060002 in set_bool_flag (flag=0x7f1814bcf140 <flagTable+17600>, value=true, origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/arguments.cpp:825
#8 0x00007f18130607a9 in Arguments::parse_argument (arg=0x55dcf2d093a4 "+PrintAssembly", origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/arguments.cpp:993
#9 0x00007f18130611be in Arguments::process_argument (arg=0x55dcf2d093a4 "+PrintAssembly", ignore_unrecognized=0 '\000', origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/arguments.cpp:1179
#10 0x00007f1813066867 in Arguments::parse_each_vm_init_arg (args=0x7f18129e8d50, patch_mod_javabase=0x7f18129e87fb, origin=JVMFlagOrigin::COMMAND_LINE) at /var/jdk/src/hotspot/share/runtime/arguments.cpp:2972
#11 0x00007f18130639da in Arguments::parse_vm_init_args (vm_options_args=0x7f18129e8878, java_tool_options_args=0x7f18129e88b8, java_options_args=0x7f18129e88f8, cmd_line_args=0x7f18129e8d50)
at /var/jdk/src/hotspot/share/runtime/arguments.cpp:2174
#12 0x00007f1813068a46 in Arguments::parse (initial_cmd_args=0x7f18129e8d50) at /var/jdk/src/hotspot/share/runtime/arguments.cpp:3946
#13 0x00007f1813e5def7 in Threads::create_vm (args=0x7f18129e8d50, canTryAgain=0x7f18129e8c5b) at /var/jdk/src/hotspot/share/runtime/thread.cpp:2734
#14 0x00007f181378343b in JNI_CreateJavaVM_inner (vm=0x7f18129e8da8, penv=0x7f18129e8db0, args=0x7f18129e8d50) at /var/jdk/src/hotspot/share/prims/jni.cpp:3613
#15 0x00007f1813783787 in JNI_CreateJavaVM (vm=0x7f18129e8da8, penv=0x7f18129e8db0, args=0x7f18129e8d50) at /var/jdk/src/hotspot/share/prims/jni.cpp:3701
#16 0x00007f1814efaa6a in InitializeJVM (pvm=0x7f18129e8da8, penv=0x7f18129e8db0, ifn=0x7f18129e8e00) at /var/jdk/src/java.base/share/native/libjli/java.c:1459
#17 0x00007f1814ef75ec in JavaMain (_args=0x7ffc68186870) at /var/jdk/src/java.base/share/native/libjli/java.c:411
#18 0x00007f1814efe5ec in ThreadJavaMain (args=0x7ffc68186870) at /var/jdk/src/java.base/unix/native/libjli/java_md.c:651
#19 0x00007f1814d59b43 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442

堆栈:

#0  Compile::Compile (this=0x7f5eb0b5ea80, ci_env=0x7f5eb0b5f6b0, generator=0x7f5ecfee55f2 <OptoRuntime::new_instance_Type()>, 
stub_function=0x7f5ecfee3d90 <OptoRuntime::new_instance_C(Klass*, JavaThread*)> "\363\017\036\372UH\211\345H\203\354`H\211}\250H\211u\240\350[2$\377H9E\240\017\225\300\204\300t?H\215\005m\241\364",
stub_name=0x7f5ed074e78a "_new_instance_Java", is_fancy_jump=0, pass_tls=true, return_pc=false, directive=0x7f5ec822a050) at /var/jdk/src/hotspot/share/opto/compile.cpp:892
#1 0x00007f5ecfee3c98 in OptoRuntime::generate_stub (env=0x7f5eb0b5f6b0, gen=0x7f5ecfee55f2 <OptoRuntime::new_instance_Type()>,
C_function=0x7f5ecfee3d90 <OptoRuntime::new_instance_C(Klass*, JavaThread*)> "\363\017\036\372UH\211\345H\203\354`H\211}\250H\211u\240\350[2$\377H9E\240\017\225\300\204\300t?H\215\005m\241\364", name=0x7f5ed074e78a "_new_instance_Java",
is_fancy_jump=0, pass_tls=true, return_pc=false) at /var/jdk/src/hotspot/share/opto/runtime.cpp:171
#2 0x00007f5ecfee374d in OptoRuntime::generate (env=0x7f5eb0b5f6b0) at /var/jdk/src/hotspot/share/opto/runtime.cpp:139
#3 0x00007f5ecf48ab83 in C2Compiler::init_c2_runtime () at /var/jdk/src/hotspot/share/opto/c2compiler.cpp:78
#4 0x00007f5ecf48ac07 in C2Compiler::initialize (this=0x7f5ec8342980) at /var/jdk/src/hotspot/share/opto/c2compiler.cpp:91
#5 0x00007f5ecf5c2ab2 in CompileBroker::init_compiler_runtime () at /var/jdk/src/hotspot/share/compiler/compileBroker.cpp:1782
#6 0x00007f5ecf5c3046 in CompileBroker::compiler_thread_loop () at /var/jdk/src/hotspot/share/compiler/compileBroker.cpp:1919
#7 0x00007f5ecf5e5462 in CompilerThread::thread_entry (thread=0x7f5ec8343060, __the_thread__=0x7f5ec8343060) at /var/jdk/src/hotspot/share/compiler/compilerThread.cpp:59
#8 0x00007f5ed00c0009 in JavaThread::thread_main_inner (this=0x7f5ec8343060) at /var/jdk/src/hotspot/share/runtime/thread.cpp:1297
#9 0x00007f5ed00bfe92 in JavaThread::run (this=0x7f5ec8343060) at /var/jdk/src/hotspot/share/runtime/thread.cpp:1280
#10 0x00007f5ed00bd57f in Thread::call_run (this=0x7f5ec8343060) at /var/jdk/src/hotspot/share/runtime/thread.cpp:358
#11 0x00007f5ecfe041e7 in thread_native_entry (thread=0x7f5ec8343060) at /var/jdk/src/hotspot/os/linux/os_linux.cpp:705
#12 0x00007f5ed0fc0b43 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#13 0x00007f5ed1051bb4 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100
(gdb) b Compile::Compile
(gdb) bt
#0 nmethod::print (this=0x7fd21d591010, st=0x7fd22c000b80) at /var/jdk/src/hotspot/share/code/nmethod.cpp:2518
#1 0x00007fd23498cf10 in nmethod::decode2 (this=0x7fd21d591010, ost=0x7fd22c000b80) at /var/jdk/src/hotspot/share/code/nmethod.cpp:2887
#2 0x00007fd234985e16 in nmethod::print_nmethod (this=0x7fd21d591010, printmethod=true) at /var/jdk/src/hotspot/share/code/nmethod.cpp:962
#3 0x00007fd234985c95 in nmethod::maybe_print_nmethod (this=0x7fd21d591010, directive=0x7fd22c229f20) at /var/jdk/src/hotspot/share/code/nmethod.cpp:935
#4 0x00007fd2341a2a9e in CompileBroker::invoke_compiler_on_method (task=0x7fd22c359c10) at /var/jdk/src/hotspot/share/compiler/compileBroker.cpp:2345
#5 0x00007fd2341a12c1 in CompileBroker::compiler_thread_loop () at /var/jdk/src/hotspot/share/compiler/compileBroker.cpp:1966
#6 0x00007fd2341c3462 in CompilerThread::thread_entry (thread=0x7fd22c344ac0, __the_thread__=0x7fd22c344ac0) at /var/jdk/src/hotspot/share/compiler/compilerThread.cpp:59
#7 0x00007fd234c9e009 in JavaThread::thread_main_inner (this=0x7fd22c344ac0) at /var/jdk/src/hotspot/share/runtime/thread.cpp:1297
#8 0x00007fd234c9de92 in JavaThread::run (this=0x7fd22c344ac0) at /var/jdk/src/hotspot/share/runtime/thread.cpp:1280
#9 0x00007fd234c9b57f in Thread::call_run (this=0x7fd22c344ac0) at /var/jdk/src/hotspot/share/runtime/thread.cpp:358
#10 0x00007fd2349e21e7 in thread_native_entry (thread=0x7fd22c344ac0) at /var/jdk/src/hotspot/os/linux/os_linux.cpp:705
#11 0x00007fd235b9eb43 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#12 0x00007fd235c2fbb4 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100

解析指令

(gdb) bt
#0 DirectivesStack::getMatchingDirective (method=..., comp=0x7f4b2c2bef40) at /var/jdk/src/hotspot/share/compiler/compilerDirectives.cpp:670
#1 0x00007f4b34793667 in CompileBroker::compile_method (method=..., osr_bci=-1, comp_level=3, hot_method=..., hot_count=0, compile_reason=CompileTask::Reason_MustBeCompiled, __the_thread__=0x7f4b2c02a5c0)
at /var/jdk/src/hotspot/share/compiler/compileBroker.cpp:1349
#2 0x00007f4b34770655 in CompilationPolicy::compile_if_required (m=..., __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/compiler/compilationPolicy.cpp:110
#3 0x00007f4b34ae8f97 in JavaCalls::call_helper (result=0x7f4b33e21750, method=..., args=0x7f4b33e217a0, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/runtime/javaCalls.cpp:359
#4 0x00007f4b34fe0344 in os::os_exception_wrapper (f=0x7f4b34ae8ccc <JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)>, value=0x7f4b33e21750, method=..., args=0x7f4b33e217a0, thread=0x7f4b2c02a5c0)
at /var/jdk/src/hotspot/os/linux/os_linux.cpp:4794
#5 0x00007f4b34ae8cc9 in JavaCalls::call (result=0x7f4b33e21750, method=..., args=0x7f4b33e217a0, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/runtime/javaCalls.cpp:330
#6 0x00007f4b34ab6626 in InstanceKlass::call_class_initializer (this=0x80004c5e8, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/oops/instanceKlass.cpp:1519
#7 0x00007f4b34ab50aa in InstanceKlass::initialize_impl (this=0x80004c5e8, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/oops/instanceKlass.cpp:1177
#8 0x00007f4b34ab3adc in InstanceKlass::initialize (this=0x80004c5e8, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/oops/instanceKlass.cpp:796
#9 0x00007f4b352905de in initialize_class (class_name=0x7f4b3114d470, __the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/runtime/thread.cpp:689
#10 0x00007f4b35296d82 in Threads::initialize_jsr292_core_classes (__the_thread__=0x7f4b2c02a5c0) at /var/jdk/src/hotspot/share/runtime/thread.cpp:2687
#11 0x00007f4b352975e0 in Threads::create_vm (args=0x7f4b33e21d50, canTryAgain=0x7f4b33e21c5b) at /var/jdk/src/hotspot/share/runtime/thread.cpp:2987
#12 0x00007f4b34bbc43b in JNI_CreateJavaVM_inner (vm=0x7f4b33e21da8, penv=0x7f4b33e21db0, args=0x7f4b33e21d50) at /var/jdk/src/hotspot/share/prims/jni.cpp:3613
#13 0x00007f4b34bbc787 in JNI_CreateJavaVM (vm=0x7f4b33e21da8, penv=0x7f4b33e21db0, args=0x7f4b33e21d50) at /var/jdk/src/hotspot/share/prims/jni.cpp:3701
#14 0x00007f4b36333a6a in InitializeJVM (pvm=0x7f4b33e21da8, penv=0x7f4b33e21db0, ifn=0x7f4b33e21e00) at /var/jdk/src/java.base/share/native/libjli/java.c:1459
#15 0x00007f4b363305ec in JavaMain (_args=0x7fff1f7dd300) at /var/jdk/src/java.base/share/native/libjli/java.c:411
#16 0x00007f4b363375ec in ThreadJavaMain (args=0x7fff1f7dd300) at /var/jdk/src/java.base/unix/native/libjli/java_md.c:651
#17 0x00007f4b36192b43 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#18 0x00007f4b36223bb4 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100

输出结果

输出结果:


------------------------ OptoAssembly for Compile_id = 26 -----------------------
#
# void ( )
#
# -- Old rsp -- Framesize: 32 --
#r591 rsp+28: in_preserve
#r590 rsp+24: return address
#r589 rsp+20: in_preserve
#r588 rsp+16: saved fp register
#r587 rsp+12: pad2, stack alignment
#r586 rsp+ 8: pad2, stack alignment
#r585 rsp+ 4: Fixed slot 1
#r584 rsp+ 0: Fixed slot 0
#
000 N1: # out( B1 ) <- in( B1 ) Freq: 1

000 B1: # out( N1 ) <- BLOCK HEAD IS JUNK Freq: 1
000 # stack bang (96 bytes)
pushq rbp # Save rbp
subq rsp, #16 # Create frame

00c movq R10, java/lang/Class:exact * # ptr
016 movl R8, [R10 + #112 (8-bit)] # int ! Field: volatile com/Hello.i
01a MEMBAR-acquire ! (empty encoding)
01a MEMBAR-release ! (empty encoding)
01a incl R8 # int
01d movl [R10 + #112 (8-bit)], R8 # int ! Field: volatile com/Hello.i
021 lock addl [rsp + #0], 0 ! membar_volatile
027 addq rsp, 16 # Destroy frame
popq rbp
cmpq rsp, poll_offset[r15_thread]
ja #safepoint_stub # Safepoint: poll for GC

039 ret

相关指令:

// jdk 中的函数输出上面的汇编
PhaseOutput::dump_asm_on

相关阅读