RFR: 8368787: Error reporting: hs_err files should show instructions when referencing code in nmethods

Martin Doerr mdoerr at openjdk.org
Fri Sep 26 16:19:51 UTC 2025


We'd like to have a little more information in hs_err files in the following scenario: The VM crashes in code which does something with an nmethod. We often have a register pointing into code of the nmethod, but the nmethod is not disassembled in the hs_err file because the crash happens outside of it.

We can disassemble some instructions around the address inside the nmethod code. This is tricky on platforms which have variable length instructions (like x86). We need to find correct instruction start addresses. I'm proposing to use relocations for this purpose. There are usually enough of them distributed over the nmethod and they point to instruction start addresses.

I've tested this proposal by the following code on x86_64:

diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp
index a6b4efbe4f2..d715e69c850 100644
--- a/src/hotspot/cpu/x86/interp_masm_x86.cpp
+++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp
@@ -646,6 +646,18 @@ void InterpreterMacroAssembler::prepare_to_jump_from_interpreted() {
 void InterpreterMacroAssembler::jump_from_interpreted(Register method, Register temp) {
   prepare_to_jump_from_interpreted();
 
+  if (UseNewCode) {
+    Label ok;
+    movptr(temp, Address(method, Method::from_interpreted_offset()));
+    cmpptr(temp, Address(method, Method::interpreter_entry_offset()));
+    je(ok);
+    movptr(rax, Address(method, Method::from_compiled_offset()));
+    movptr(rbx, rax);
+    addptr(rbx, 128);
+    hlt();
+    bind(ok);
+  }
+
   if (JvmtiExport::can_post_interpreter_events()) {
     Label run_compiled_code;
     // JVMTI events, such as single-stepping, are implemented partly by avoiding running


The output is:

RAX=0x00007f3b19000100 is at entry_point+0 in (nmethod*)0x00007f3b19000008
Compiled method (c1) 2915    1       3       java.lang.Byte::toUnsignedInt (6 bytes)
 total in heap  [0x00007f3b19000008,0x00007f3b190001f8] = 496
 main code      [0x00007f3b19000100,0x00007f3b190001b8] = 184
 stub code      [0x00007f3b190001b8,0x00007f3b190001f8] = 64
 mutable data [0x00007f3ab401e0b0,0x00007f3ab401e0e0] = 48
 relocation     [0x00007f3ab401e0b0,0x00007f3ab401e0d8] = 40
 metadata       [0x00007f3ab401e0d8,0x00007f3ab401e0e0] = 8
 immutable data [0x00007f3ab401dcd0,0x00007f3ab401dd30] = 96
 dependencies   [0x00007f3ab401dcd0,0x00007f3ab401dcd8] = 8
 scopes pcs     [0x00007f3ab401dcd8,0x00007f3ab401dd18] = 64
 scopes data    [0x00007f3ab401dd18,0x00007f3ab401dd30] = 24
--------------------------------------------------------------------------------
  0x00007f3b19000100:   mov    %eax,-0x18000(%rsp)
  0x00007f3b19000107:   push   %rbp
  0x00007f3b19000108:   sub    $0x20,%rsp
  0x00007f3b1900010c:   cmpl   $0x1,0x20(%r15)
  0x00007f3b19000114:   je     0x00007f3b1900011b
--------------------------------------------------------------------------------
RBX=0x00007f3b19000180 is at entry_point+128 in (nmethod*)0x00007f3b19000008
Compiled method (c1) 2916    1       3       java.lang.Byte::toUnsignedInt (6 bytes)
 total in heap  [0x00007f3b19000008,0x00007f3b190001f8] = 496
 main code      [0x00007f3b19000100,0x00007f3b190001b8] = 184
 stub code      [0x00007f3b190001b8,0x00007f3b190001f8] = 64
 mutable data [0x00007f3ab401e0b0,0x00007f3ab401e0e0] = 48
 relocation     [0x00007f3ab401e0b0,0x00007f3ab401e0d8] = 40
 metadata       [0x00007f3ab401e0d8,0x00007f3ab401e0e0] = 8
 immutable data [0x00007f3ab401dcd0,0x00007f3ab401dd30] = 96
 dependencies   [0x00007f3ab401dcd0,0x00007f3ab401dcd8] = 8
 scopes pcs     [0x00007f3ab401dcd8,0x00007f3ab401dd18] = 64
 scopes data    [0x00007f3ab401dd18,0x00007f3ab401dd30] = 24
--------------------------------------------------------------------------------
  0x00007f3b19000179:   movabs $0x7f3b19000150,%r10
  0x00007f3b19000183:   mov    %r10,0x590(%r15)
--------------------------------------------------------------------------------


Feedback and further improvement suggestions are welcome.

-------------

Commit messages:
 - 8368787: Error reporting: hs_err files should print instructions when referencing code in nemthods

Changes: https://git.openjdk.org/jdk/pull/27530/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=27530&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8368787
  Stats: 18 lines in 1 file changed: 18 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/27530.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/27530/head:pull/27530

PR: https://git.openjdk.org/jdk/pull/27530


More information about the hotspot-compiler-dev mailing list