8035983: Fix "Native frames:" in crash report (hs_err file)

Wed, 05 Mar 2014 16:21:22 -0800

author
kvn
date
Wed, 05 Mar 2014 16:21:22 -0800
changeset 6357
f8068fa6aa46
parent 6356
4d4ea046d32a
child 6359
e35733785856

8035983: Fix "Native frames:" in crash report (hs_err file)
Summary: check fr.sender_sp() in java thread instead of os::is_first_C_frame(&fr).
Reviewed-by: twisti, coleenp

src/share/vm/utilities/vmError.cpp file | annotate | diff | comparison | revisions
     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) {

mercurial