- 
    Bug 
- 
    Resolution: Fixed
- 
     P3 P3
- 
    9
- 
        b06
- 
        generic
- 
        generic
| Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build | 
|---|---|---|---|---|---|---|
| JDK-8045254 | 8u25 | Vladimir Kozlov | P3 | Resolved | Fixed | b01 | 
| JDK-8037263 | 8u20 | Vladimir Kozlov | P3 | Closed | Fixed | b06 | 
| JDK-8053255 | emb-8u26 | Vladimir Kozlov | P3 | Resolved | Fixed | b17 | 
                    We don't print whole stack if native frames intermix with compiled java frames in Java thread (on x86 fp is used by compiled code).
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x1e28428] void VMError::report(outputStream*)+0x1478
V [libjvm.so+0x1e29dd4] void VMError::report_and_die()+0x6b4
V [libjvm.so+0x14ad9ba] void report_vm_error(const char*,int,const char*,const char*)+0x9a
V [libjvm.so+0x1b6ccf5] void ObjectMonitor::exit(bool,Thread*)+0x125
V [libjvm.so+0x1d41cda] void ObjectSynchronizer::fast_exit(oopDesc*,BasicLock*,Thread*)+0x38a
V [libjvm.so+0x1d41fba] void ObjectSynchronizer::slow_exit(oopDesc*,BasicLock*,Thread*)+0x2a
V [libjvm.so+0x1caa13f] void SharedRuntime::complete_monitor_unlocking_C(oopDesc*,BasicLock*)+0x27f
The next changes seem fixed the problem:
src/share/vm/utilities/vmError.cpp
@@ -590,15 +590,17 @@
while (count++ < StackPrintLimit) {
fr.print_on_error(st, buf, sizeof(buf));
st->cr();
+ // Catch very first native frame by using stack address.
+ if ((address)(fr.sp() + 4) >= _thread->stack_base()) break;
+
// Compiled code may use EBP register on x86 so it looks like
- // non-walkable C frame. Use frame.sender() for java frames.
+ // non-walkable C frame. Use frame.sender() for java threads.
if (_thread && _thread->is_Java_thread() && fr.is_java_frame()) {
RegisterMap map((JavaThread*)_thread, false); // No update
fr = fr.sender(&map);
- continue;
+ } else {
+ fr = os::get_sender_for_C_frame(&fr);
}
- if (os::is_first_C_frame(&fr)) break;
- fr = os::get_sender_for_C_frame(&fr);
}
 
if (count > StackPrintLimit) {
Instead of using os::is_first_C_frame() which produces incorrect result for compiled java frames I am suggesting to look on frame's stack pointer relative to stack's base.
            
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x1e28428] void VMError::report(outputStream*)+0x1478
V [libjvm.so+0x1e29dd4] void VMError::report_and_die()+0x6b4
V [libjvm.so+0x14ad9ba] void report_vm_error(const char*,int,const char*,const char*)+0x9a
V [libjvm.so+0x1b6ccf5] void ObjectMonitor::exit(bool,Thread*)+0x125
V [libjvm.so+0x1d41cda] void ObjectSynchronizer::fast_exit(oopDesc*,BasicLock*,Thread*)+0x38a
V [libjvm.so+0x1d41fba] void ObjectSynchronizer::slow_exit(oopDesc*,BasicLock*,Thread*)+0x2a
V [libjvm.so+0x1caa13f] void SharedRuntime::complete_monitor_unlocking_C(oopDesc*,BasicLock*)+0x27f
The next changes seem fixed the problem:
src/share/vm/utilities/vmError.cpp
@@ -590,15 +590,17 @@
while (count++ < StackPrintLimit) {
fr.print_on_error(st, buf, sizeof(buf));
st->cr();
+ // Catch very first native frame by using stack address.
+ if ((address)(fr.sp() + 4) >= _thread->stack_base()) break;
+
// Compiled code may use EBP register on x86 so it looks like
- // non-walkable C frame. Use frame.sender() for java frames.
+ // non-walkable C frame. Use frame.sender() for java threads.
if (_thread && _thread->is_Java_thread() && fr.is_java_frame()) {
RegisterMap map((JavaThread*)_thread, false); // No update
fr = fr.sender(&map);
- continue;
+ } else {
+ fr = os::get_sender_for_C_frame(&fr);
}
- if (os::is_first_C_frame(&fr)) break;
- fr = os::get_sender_for_C_frame(&fr);
}
if (count > StackPrintLimit) {
Instead of using os::is_first_C_frame() which produces incorrect result for compiled java frames I am suggesting to look on frame's stack pointer relative to stack's base.
- backported by
- 
                    JDK-8045254 Fix "Native frames:" in crash report (hs_err file) -           
- Resolved
 
-         
- 
                    JDK-8053255 Fix "Native frames:" in crash report (hs_err file) -           
- Resolved
 
-         
- 
                    JDK-8037263 Fix "Native frames:" in crash report (hs_err file) -           
- Closed
 
-         
- relates to
- 
                    JDK-8194652 VMError::print_native_stack() is missing an os::is_first_C_frame() check -           
- Resolved
 
-