JDK-8163143 : illegal bci error with interpreted frames in SA due to mirror being stored in interpreted frames
  • Type: Bug
  • Component: hotspot
  • Sub-Component: svc-agent
  • Affected Version: 9
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2016-08-04
  • Updated: 2018-01-17
  • Resolved: 2016-08-11
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 9
9 b133Fixed
Related Reports
Relates :  
Description
JDK-8154580 introduced the storage of mirror in the interpreted frame. This needs to be reflected in SA. Without this, the offsets from which to read the various attributes like locals, bci , etc, in SA, became incorrect. 

From frame_x86.hpp, we have: 
...
71     interpreter_frame_last_sp_offset                 = interpreter_frame_sender_sp_offset - 1,
72     interpreter_frame_method_offset                  = interpreter_frame_last_sp_offset - 1,
73     interpreter_frame_mirror_offset                  = interpreter_frame_method_offset - 1,
74     interpreter_frame_mdp_offset                     = interpreter_frame_mirror_offset - 1,
75     interpreter_frame_cache_offset                   = interpreter_frame_mdp_offset - 1,
76     interpreter_frame_locals_offset                  = interpreter_frame_cache_offset - 1,
77     interpreter_frame_bcp_offset                     = interpreter_frame_locals_offset - 1,
...

This does not match with what we have in share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java. 

77     INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_METHOD_OFFSET - 1;
78     INTERPRETER_FRAME_CACHE_OFFSET                = INTERPRETER_FRAME_MDX_OFFSET - 1;
79     INTERPRETER_FRAME_LOCALS_OFFSET               = INTERPRETER_FRAME_CACHE_OFFSET - 1;
80     INTERPRETER_FRAME_BCX_OFFSET                  = INTERPRETER_FRAME_LOCALS_OFFSET - 1;

The issue gets manifested like this (From Yasumasa's mail):
(http://mail.openjdk.java.net/pipermail/serviceability-dev/2016-August/020077.html)

1. AssertionFailure: illegal bci
    I saw error stack as below with JDK 9 EA b129 Linux x64:
-------------------
0x00007fe06bd270c2      * java.lang.Object.wait(long) bci:-520544688 (Interpreted frame)
0x00007fe06bd1a443      sun.jvm.hotspot.utilities.AssertionFailure: illegal bci
         at sun.jvm.hotspot.utilities.Assert.that(jdk.hotspot.agent@9-ea/Assert.java:32)
         at sun.jvm.hotspot.oops.ConstMethod.getLineNumberFromBCI(jdk.hotspot.agent@9-ea/ConstMethod.java:297)
         at sun.jvm.hotspot.oops.Method.getLineNumberFromBCI(jdk.hotspot.agent@9-ea/Method.java:282)
         at sun.jvm.hotspot.tools.PStack.getJavaNames(jdk.hotspot.agent@9-ea/PStack.java:239)
         at sun.jvm.hotspot.tools.PStack.run(jdk.hotspot.agent@9-ea/PStack.java:112)
-------------------
==========================================
The following change from Yasumasa fixes this for x86.

diff -r 5acd2b561936 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java     Tue Aug 02 20:55:27 2016 -0700
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java     Wed Aug 03 23:42:36 2016 +0900
@@ -48,7 +48,7 @@
    private static final int SENDER_SP_OFFSET           =  2;

    // Interpreter frames
-  private static final int INTERPRETER_FRAME_MIRROR_OFFSET    =  2; // for native calls only
+  private static int INTERPRETER_FRAME_MIRROR_OFFSET;
    private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
    private static final int INTERPRETER_FRAME_LAST_SP_OFFSET   = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
    private static final int INTERPRETER_FRAME_METHOD_OFFSET    = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
@@ -74,7 +74,8 @@
    }

    private static synchronized void initialize(TypeDataBase db) {
-    INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+    INTERPRETER_FRAME_MIRROR_OFFSET               = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+    INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
      INTERPRETER_FRAME_CACHE_OFFSET                = INTERPRETER_FRAME_MDX_OFFSET - 1;
      INTERPRETER_FRAME_LOCALS_OFFSET               = INTERPRETER_FRAME_CACHE_OFFSET - 1;
      INTERPRETER_FRAME_BCX_OFFSET                  = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
-----------------