1.1 --- a/src/share/vm/utilities/vmError.cpp Mon Feb 24 15:12:26 2014 -0800 1.2 +++ b/src/share/vm/utilities/vmError.cpp Wed Mar 05 16:21:22 2014 -0800 1.3 @@ -592,13 +592,24 @@ 1.4 st->cr(); 1.5 // Compiled code may use EBP register on x86 so it looks like 1.6 // non-walkable C frame. Use frame.sender() for java frames. 1.7 - if (_thread && _thread->is_Java_thread() && fr.is_java_frame()) { 1.8 - RegisterMap map((JavaThread*)_thread, false); // No update 1.9 - fr = fr.sender(&map); 1.10 - continue; 1.11 + if (_thread && _thread->is_Java_thread()) { 1.12 + // Catch very first native frame by using stack address. 1.13 + // For JavaThread stack_base and stack_size should be set. 1.14 + if (!_thread->on_local_stack((address)(fr.sender_sp() + 1))) { 1.15 + break; 1.16 + } 1.17 + if (fr.is_java_frame()) { 1.18 + RegisterMap map((JavaThread*)_thread, false); // No update 1.19 + fr = fr.sender(&map); 1.20 + } else { 1.21 + fr = os::get_sender_for_C_frame(&fr); 1.22 + } 1.23 + } else { 1.24 + // is_first_C_frame() does only simple checks for frame pointer, 1.25 + // it will pass if java compiled code has a pointer in EBP. 1.26 + if (os::is_first_C_frame(&fr)) break; 1.27 + fr = os::get_sender_for_C_frame(&fr); 1.28 } 1.29 - if (os::is_first_C_frame(&fr)) break; 1.30 - fr = os::get_sender_for_C_frame(&fr); 1.31 } 1.32 1.33 if (count > StackPrintLimit) {