How to use gdb to debug C1 compiler's internal error?

Leslie Zhai lesliezhai at llvm.org.cn
Fri Mar 23 15:11:44 UTC 2018


Hi Dean,

Thanks for your response!


在 2018年03月23日 04:59, dean.long at oracle.com 写道:
> Gdb is not very useful for getting stack backtraces in generated JIT 
> code, and it wouldn't know where to start because it apparently jumped 
> to 0x000000000000dead.  I suggest trying -XX:+C1Breakpoint and then 
> single-stepping through the generated code.
Work :)

Thread 2 "java" received signal SIGSEGV, Segmentation fault.
0x00007fffe1214138 in ?? ()
(gdb) call help()

"Executing help"
basic
   pp(void* p)   - try to make sense of p
   pv(intptr_t p)- ((PrintableResourceObj*) p)->print()
   ps()          - print current thread stack
   pss()         - print all thread stacks
   pm(int pc)    - print Method* given compiled PC
   findm(intptr_t pc) - finds Method*
   find(intptr_t x)   - finds & prints nmethod/stub/bytecode/oop based 
on pointer into it
   pns(void* sp, void* fp, void* pc)  - print native (i.e. mixed) stack 
trace. E.g.
                    pns($sp, $rbp, $pc) on Linux/amd64 and Solaris/amd64 or
                    pns($sp, $ebp, $pc) on Linux/x86 or
                    pns($sp, 0, $pc)    on Linux/ppc64 or
                    pns($sp + 0x7ff, 0, $pc) on Solaris/SPARC
                  - in gdb do 'set overload-resolution off' before 
calling pns()
                  - in dbx do 'frame 1' before calling pns()
misc.
   flush()       - flushes the log file
   events()      - dump events from ring buffers
compiler debugging
   debug()       - to set things up for compiler debugging
   ndebug()      - undo debug
(gdb) call find(0x00007fffe1214138)

"Executing find"
0x00007fffe1214138 is at entry_point+56 in (nmethod*)0x00007fffe1213f90
Compiled method (c2)   17107   33       4 
java.util.Properties::getProperty (46 bytes)
  total in heap  [0x00007fffe1213f90,0x00007fffe1214370] = 992
  relocation     [0x00007fffe12140c0,0x00007fffe12140f0] = 48
  main code      [0x00007fffe1214100,0x00007fffe12141a0] = 160
  stub code      [0x00007fffe12141a0,0x00007fffe12141d8] = 56
  metadata       [0x00007fffe12141d8,0x00007fffe12141e8] = 16
  scopes data    [0x00007fffe12141e8,0x00007fffe1214248] = 96
  scopes pcs     [0x00007fffe1214248,0x00007fffe1214328] = 224
  dependencies   [0x00007fffe1214328,0x00007fffe1214330] = 8
  handler table  [0x00007fffe1214330,0x00007fffe1214360] = 48
  nul chk table  [0x00007fffe1214360,0x00007fffe1214370] = 16
(gdb) call pns($sp, $rbp, $pc)

"Executing pns"
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, 
C=native code)
...

And I found someone experienced similar case 
http://llvm.org/docs/DebuggingJITedCode.html

>
>
> dl
>
> On 3/22/18 9:32 AM, Leslie Zhai wrote:
>> Hi HotSpot compiler developers,
>>
>> I am new to HotSpot C1 compiler, and I am trying to implement a new 
>> greedy register allocation skeleton for academy research, but might 
>> wrongly modified some code, for example, 
>> `Runtime1::generate_handle_exception` in 
>> jdk/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp, then `install_code` 
>> failed to work and thrown such internal error:
>>
>> ...
>>
>> [Stub Code]
>>   0x00007fffe13752a0: mov    $0x0,%rbx          ;   {no_reloc}
>>   0x00007fffe13752aa: jmpq   0x00007fffe13752aa  ; {runtime_call}
>> [Exception Handler]
>>   0x00007fffe13752af: jmpq   0x00007fffe1004ee0  ; {runtime_call}
>> [Deopt Handler Code]
>>   0x00007fffe13752b4: callq  0x00007fffe13752b9
>>   0x00007fffe13752b9: subq   $0x5,(%rsp)
>>   0x00007fffe13752be: jmpq   0x00007fffe11072e0  ; {runtime_call}
>>   0x00007fffe13752c3: hlt
>>   0x00007fffe13752c4: hlt
>>   0x00007fffe13752c5: hlt
>>   0x00007fffe13752c6: hlt
>>   0x00007fffe13752c7: hlt
>> Decoding compiled method 0x00007fffe136d310:
>> Code:
>> [Entry Point]
>>   # {method} {0x00007fffe015e0e0} 'fillInStackTrace' 
>> '(I)Ljava/lang/Throwable;' in 'java/lang/Throwable'
>>   # this:     rsi:rsi   = 'java/lang/Throwable'
>>   # parm0:    rdx       = int
>>   #           [sp+0x50]  (sp of caller)
>>   0x00007fffe136d4a0: mov    0x8(%rsi),%r10d
>>   0x00007fffe136d4a4: shl    $0x3,%r10
>>   0x00007fffe136d4a8: cmp    %r10,%rax
>>   0x00007fffe136d4ab: je     0x00007fffe136d4b8
>>   0x00007fffe136d4b1: jmpq   0x00007fffe1105c40  ; {runtime_call}
>>   0x00007fffe136d4b6: nop
>>   0x00007fffe136d4b7: nop
>> [Verified Entry Point]
>>   0x00007fffe136d4b8: mov    %eax,-0x16000(%rsp)
>>   0x00007fffe136d4bf: push   %rbp
>>   0x00007fffe136d4c0: mov    %rsp,%rbp
>>   0x00007fffe136d4c3: sub    $0x40,%rsp
>>   0x00007fffe136d4c7: mov    %rsp,%rax
>>   0x00007fffe136d4ca: and    $0xfffffffffffffff0,%rax
>>   0x00007fffe136d4ce: cmp    %rsp,%rax
>>   0x00007fffe136d4d1: je     0x00007fffe136d54e
>>   0x00007fffe136d4d7: mov    %rsp,-0x28(%rsp)
>>   0x00007fffe136d4dc: sub    $0x80,%rsp
>>   0x00007fffe136d4e3: mov    %rax,0x78(%rsp)
>>   0x00007fffe136d4e8: mov    %rcx,0x70(%rsp)
>>   0x00007fffe136d4ed: mov    %rdx,0x68(%rsp)
>>   0x00007fffe136d4f2: mov    %rbx,0x60(%rsp)
>>   0x00007fffe136d4f7: mov    %rbp,0x50(%rsp)
>>   0x00007fffe136d4fc: mov    %rsi,0x48(%rsp)
>>   0x00007fffe136d501: mov    %rdi,0x40(%rsp)
>>   0x00007fffe136d506: mov    %r8,0x38(%rsp)
>>   0x00007fffe136d50b: mov    %r9,0x30(%rsp)
>>   0x00007fffe136d510: mov    %r10,0x28(%rsp)
>>   0x00007fffe136d515: mov    %r11,0x20(%rsp)
>>   0x00007fffe136d51a: mov    %r12,0x18(%rsp)
>>   0x00007fffe136d51f: mov    %r13,0x10(%rsp)
>>   0x00007fffe136d524: mov    %r14,0x8(%rsp)
>>   0x00007fffe136d529: mov    %r15,(%rsp)
>>   0x00007fffe136d52d: mov    $0x7ffff6dbea09,%rdi  ; {external_word}
>>   0x00007fffe136d537: mov    $0x7fffe136d4d7,%rsi  ; {internal_word}
>>   0x00007fffe136d541: mov    %rsp,%rdx
>>   0x00007fffe136d544: and    $0xfffffffffffffff0,%rsp
>>   0x00007fffe136d548: callq  0x00007ffff68211ee  ; {runtime_call}
>>   0x00007fffe136d54d: hlt
>>   ;; move 1 -> 2
>>   ;; move 0 -> 1
>>   0x00007fffe136d54e: mov    %rsi,(%rsp)
>>   0x00007fffe136d552: cmp    $0x0,%rsi
>>   0x00007fffe136d556: lea    (%rsp),%rsi
>>   0x00007fffe136d55a: cmove  (%rsp),%rsi        ; OopMap{[0]=Oop 
>> off=191}
>>   0x00007fffe136d55f: mov    $0x7fffe136d55f,%r10  ; {section_word}
>>   0x00007fffe136d569: mov    %r10,0x208(%r15)
>>   0x00007fffe136d570: mov    %rsp,0x200(%r15)
>>   0x00007fffe136d577: cmpb   $0x0,0x1602de2c(%rip)        # 
>> 0x00007ffff739b3aa
>>                                                 ; {external_word}
>>   0x00007fffe136d57e: je     0x00007fffe136d5b8
>>   0x00007fffe136d584: push   %rsi
>>   0x00007fffe136d585: push   %rdx
>>   0x00007fffe136d586: mov    $0x7fffe015e0e0,%rsi  ; 
>> {metadata({method} {0x00007fffe015e0e0} 'fillInStackTrace' 
>> '(I)Ljava/lang/Throwable;' in 'java/lang/Throwable')}
>>   0x00007fffe136d590: mov    %r15,%rdi
>>   0x00007fffe136d593: test   $0xf,%esp
>>   0x00007fffe136d599: je     0x00007fffe136d5b1
>>   0x00007fffe136d59f: sub    $0x8,%rsp
>>   0x00007fffe136d5a3: callq  0x00007ffff69c48ae  ; {runtime_call}
>>   0x00007fffe136d5a8: add    $0x8,%rsp
>>   0x00007fffe136d5ac: jmpq   0x00007fffe136d5b6
>>   0x00007fffe136d5b1: callq  0x00007ffff69c48ae  ; {runtime_call}
>>   0x00007fffe136d5b6: pop    %rdx
>>   0x00007fffe136d5b7: pop    %rsi
>>   0x00007fffe136d5b8: lea    0x220(%r15),%rdi
>>   0x00007fffe136d5bf: movl   $0x4,0x298(%r15)
>>   0x00007fffe136d5ca: callq  0x00007ffff4f55fef  ; {runtime_call}
>>   0x00007fffe136d5cf: vzeroupper
>>   0x00007fffe136d5d2: movl   $0x5,0x298(%r15)
>>   0x00007fffe136d5dd: mov    %r15d,%ecx
>>   0x00007fffe136d5e0: shr    $0x4,%ecx
>>   0x00007fffe136d5e3: and    $0xffc,%ecx
>>   0x00007fffe136d5e9: mov    $0x7ffff7ff3000,%r10  ; {external_word}
>>   0x00007fffe136d5f3: mov    %ecx,(%r10,%rcx,1)
>>   0x00007fffe136d5f7: cmpl   $0x0,0x1603f89f(%rip)        # 
>> 0x00007ffff73acea0
>>                                                 ; {external_word}
>>   0x00007fffe136d601: jne    0x00007fffe136d615
>>   0x00007fffe136d607: cmpl   $0x0,0x30(%r15)
>>   0x00007fffe136d60f: je     0x00007fffe136d636
>>   0x00007fffe136d615: mov    %rax,-0x8(%rbp)
>>   0x00007fffe136d619: mov    %r15,%rdi
>>   0x00007fffe136d61c: mov    %rsp,%r12
>>   0x00007fffe136d61f: sub    $0x0,%rsp
>>   0x00007fffe136d623: and    $0xfffffffffffffff0,%rsp
>>   0x00007fffe136d627: callq  0x00007ffff6a691da  ; {runtime_call}
>>   0x00007fffe136d62c: mov    %r12,%rsp
>>   0x00007fffe136d62f: xor    %r12,%r12
>>   0x00007fffe136d632: mov    -0x8(%rbp),%rax
>>   0x00007fffe136d636: movl   $0x8,0x298(%r15)
>>   0x00007fffe136d641: cmpl   $0x1,0x2c4(%r15)
>>   0x00007fffe136d64c: je     0x00007fffe136d6e8
>>   0x00007fffe136d652: cmpb   $0x0,0x1602dd51(%rip)        # 
>> 0x00007ffff739b3aa
>>                                                 ; {external_word}
>>   0x00007fffe136d659: je     0x00007fffe136d697
>>   0x00007fffe136d65f: mov    %rax,-0x8(%rbp)
>>   0x00007fffe136d663: mov    $0x7fffe015e0e0,%rsi  ; 
>> {metadata({method} {0x00007fffe015e0e0} 'fillInStackTrace' 
>> '(I)Ljava/lang/Throwable;' in 'java/lang/Throwable')}
>>   0x00007fffe136d66d: mov    %r15,%rdi
>>   0x00007fffe136d670: test   $0xf,%esp
>>   0x00007fffe136d676: je     0x00007fffe136d68e
>>   0x00007fffe136d67c: sub    $0x8,%rsp
>>   0x00007fffe136d680: callq  0x00007ffff69c4ab8  ; {runtime_call}
>>   0x00007fffe136d685: add    $0x8,%rsp
>>   0x00007fffe136d689: jmpq   0x00007fffe136d693
>>   0x00007fffe136d68e: callq  0x00007ffff69c4ab8  ; {runtime_call}
>>   0x00007fffe136d693: mov    -0x8(%rbp),%rax
>>   0x00007fffe136d697: mov    $0x0,%r10
>>   0x00007fffe136d6a1: mov    %r10,0x200(%r15)
>>   0x00007fffe136d6a8: mov    $0x0,%r10
>>   0x00007fffe136d6b2: mov    %r10,0x208(%r15)
>>   0x00007fffe136d6b9: test   %rax,%rax
>>   0x00007fffe136d6bc: je     0x00007fffe136d6c5
>>   0x00007fffe136d6c2: mov    (%rax),%rax
>>   0x00007fffe136d6c5: mov    0x38(%r15),%rcx
>>   0x00007fffe136d6c9: movl   $0x0,0x108(%rcx)
>>   0x00007fffe136d6d3: leaveq
>>   0x00007fffe136d6d4: cmpq   $0x0,0x8(%r15)
>>   0x00007fffe136d6dc: jne    0x00007fffe136d6e3
>>   0x00007fffe136d6e2: retq
>>   0x00007fffe136d6e3: jmpq   Stub::forward exception  ; {runtime_call}
>>   0x00007fffe136d6e8: mov    %rax,-0x8(%rbp)
>>   0x00007fffe136d6ec: mov    %rsp,%r12
>>   0x00007fffe136d6ef: sub    $0x0,%rsp
>>   0x00007fffe136d6f3: and    $0xfffffffffffffff0,%rsp
>>   0x00007fffe136d6f7: callq  0x00007ffff69c8b64  ; {runtime_call}
>>   0x00007fffe136d6fc: mov    %r12,%rsp
>>   0x00007fffe136d6ff: xor    %r12,%r12
>>   0x00007fffe136d702: mov    -0x8(%rbp),%rax
>>   0x00007fffe136d706: jmpq   0x00007fffe136d652
>>   0x00007fffe136d70b: hlt
>>   0x00007fffe136d70c: hlt
>>   0x00007fffe136d70d: hlt
>>   0x00007fffe136d70e: hlt
>>   0x00007fffe136d70f: hlt
>>
>> #
>> # A fatal error has been detected by the Java Runtime Environment:
>> #
>> #  SIGSEGV (0xb) at pc=0x000000000000dead, pid=2174, 
>> tid=0x00007ffff7fc8700
>> #
>> # JRE version: OpenJDK Runtime Environment (8.0) (build 
>> 1.8.0-internal-debug-xiangzhai_2018_03_19_20_27-b00)
>> # Java VM: OpenJDK 64-Bit Server VM (25.71-b00-debug compiled mode 
>> linux-amd64 compressed oops)
>> # Problematic frame:
>> # C  0x000000000000dead
>> #
>> # Core dump written. Default location: 
>> /data/project/openjdk/jdk8u/hotspot/test/compiler/5057225/core or 
>> core.2174
>> #
>> # An error report file with more information is saved as:
>> # 
>> /data/project/openjdk/jdk8u/hotspot/test/compiler/5057225/hs_err_pid2174.log
>>
>> Compiled method (c1)   21870  156   !   3 
>> java.lang.ClassLoader::loadClass (122 bytes)
>>  total in heap  [0x00007fffe12bcc90,0x00007fffe12beee0] = 8784
>>  relocation     [0x00007fffe12bcdc0,0x00007fffe12bcfb8] = 504
>>  main code      [0x00007fffe12bcfc0,0x00007fffe12be2c0] = 4864
>>  stub code      [0x00007fffe12be2c0,0x00007fffe12be460] = 416
>>  metadata       [0x00007fffe12be460,0x00007fffe12be4a0] = 64
>>  scopes data    [0x00007fffe12be4a0,0x00007fffe12be848] = 936
>>  scopes pcs     [0x00007fffe12be848,0x00007fffe12becd8] = 1168
>>  dependencies   [0x00007fffe12becd8,0x00007fffe12bece0] = 8
>>  handler table  [0x00007fffe12bece0,0x00007fffe12beea8] = 456
>>  nul chk table  [0x00007fffe12beea8,0x00007fffe12beee0] = 56
>> Compiled method (c1)   21871  156   !   3 
>> java.lang.ClassLoader::loadClass (122 bytes)
>>  total in heap  [0x00007fffe12bcc90,0x00007fffe12beee0] = 8784
>>  relocation     [0x00007fffe12bcdc0,0x00007fffe12bcfb8] = 504
>>  main code      [0x00007fffe12bcfc0,0x00007fffe12be2c0] = 4864
>>  stub code      [0x00007fffe12be2c0,0x00007fffe12be460] = 416
>>  metadata       [0x00007fffe12be460,0x00007fffe12be4a0] = 64
>>  scopes data    [0x00007fffe12be4a0,0x00007fffe12be848] = 936
>>  scopes pcs     [0x00007fffe12be848,0x00007fffe12becd8] = 1168
>>  dependencies   [0x00007fffe12becd8,0x00007fffe12bece0] = 8
>>  handler table  [0x00007fffe12bece0,0x00007fffe12beea8] = 456
>>  nul chk table  [0x00007fffe12beea8,0x00007fffe12beee0] = 56
>> #
>> # If you would like to submit a bug report, please visit:
>> #   http://bugreport.java.com/bugreport/crash.jsp
>> #
>> Current thread is 140737353910016
>> Dumping core ...
>>
>> [Switching to Thread 0x7ffff7fc8700 (LWP 2178)]
>> __GI_raise (sig=sig at entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
>> 51      }
>> (gdb) bt
>> #0  __GI_raise (sig=sig at entry=6) at 
>> ../sysdeps/unix/sysv/linux/raise.c:51
>> #1  0x00007ffff740c4da in __GI_abort () at abort.c:89
>> #2  0x00007ffff6905d0b in os::abort (dump_core=true)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/os/linux/vm/os_linux.cpp:1515
>> #3  0x00007ffff6ac75fc in VMError::report_and_die (this=0x7ffff7fc6400)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/share/vm/utilities/vmError.cpp:1060
>> #4  0x00007ffff6ac7d29 in crash_handler (sig=11, info=0x7ffff7fc6630, 
>> ucVoid=0x7ffff7fc6500)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/os/linux/vm/vmError_linux.cpp:106
>> #5  <signal handler called>
>> #6  0x00007ffff690071a in os::print_hex_dump (st=0x7ffff7fc6c30,
>>     start=0xde8d <error: Cannot access memory at address 0xde8d>,
>>     end=0xdecd <error: Cannot access memory at address 0xdecd>, 
>> unitsize=1)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/share/vm/runtime/os.cpp:802
>> #7  0x00007ffff691328e in os::print_context (st=0x7ffff7fc6c30, 
>> context=0x7ffff7fc6f00)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp:823
>> #8  0x00007ffff6ac5adb in VMError::report (this=0x7ffff7fc6d50, 
>> st=0x7ffff7fc6c30)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/share/vm/utilities/vmError.cpp:534
>> #9  0x00007ffff6ac70cc in VMError::report_and_die (this=0x7ffff7fc6d50)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/share/vm/utilities/vmError.cpp:971
>> #10 0x00007ffff6912bde in JVM_handle_linux_signal (sig=11, 
>> info=0x7ffff7fc7030, ucVoid=0x7ffff7fc6f00,
>>     abort_if_unrecognized=1)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp:541
>> #11 0x00007ffff690be1d in signalHandler (sig=11, info=0x7ffff7fc7030, 
>> uc=0x7ffff7fc6f00)
>>     at 
>> /data/project/openjdk/jdk8u/hotspot/src/os/linux/vm/os_linux.cpp:4435
>> #12 <signal handler called>
>> ...
>>
>> So backtrace or set breakpoint might be helpful for debugging 
>> compiling thread, but doesn't work for running thread? I am reading 
>> Analyzing and Debugging the HotSpot VM at the OS Level[1] please give 
>> me some advice, thanks a lot!
>>
>> [1] http://www.progdoc.de/papers/JavaOne2014/javaone2014_con3138.html
>>
>

-- 
Regards,
Leslie Zhai





More information about the hotspot-compiler-dev mailing list