src/share/vm/utilities/vmError.cpp

Print this page
rev 7023 : 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
Summary: Also fix stack trace on x86 to enable walking of runtime stubs and native wrappers


 568 
 569        if (fr.sp()) {
 570          st->print(",  sp=" PTR_FORMAT, fr.sp());
 571          size_t free_stack_size = pointer_delta(fr.sp(), stack_bottom, 1024);
 572          st->print(",  free space=" SIZE_FORMAT "k", free_stack_size);
 573        }
 574 
 575        st->cr();
 576      }
 577 
 578   STEP(120, "(printing native stack)" )
 579 
 580      if (_verbose) {
 581      if (os::platform_print_native_stack(st, _context, buf, sizeof(buf))) {
 582        // We have printed the native stack in platform-specific code
 583        // Windows/x64 needs special handling.
 584      } else {
 585        frame fr = _context ? os::fetch_frame_from_context(_context)
 586                            : os::current_frame();
 587 
 588        // see if it's a valid frame
 589        if (fr.pc()) {
 590           st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
 591 
 592 
 593           int count = 0;
 594           while (count++ < StackPrintLimit) {
 595              fr.print_on_error(st, buf, sizeof(buf));
 596              st->cr();
 597              // Compiled code may use EBP register on x86 so it looks like
 598              // non-walkable C frame. Use frame.sender() for java frames.
 599              if (_thread && _thread->is_Java_thread()) {
 600                // Catch very first native frame by using stack address.
 601                // For JavaThread stack_base and stack_size should be set.
 602                if (!_thread->on_local_stack((address)(fr.sender_sp() + 1))) {
 603                  break;
 604                }
 605                if (fr.is_java_frame()) {
 606                  RegisterMap map((JavaThread*)_thread, false); // No update
 607                  fr = fr.sender(&map);
 608                } else {
 609                  fr = os::get_sender_for_C_frame(&fr);
 610                }
 611              } else {
 612                // is_first_C_frame() does only simple checks for frame pointer,
 613                // it will pass if java compiled code has a pointer in EBP.
 614                if (os::is_first_C_frame(&fr)) break;
 615                fr = os::get_sender_for_C_frame(&fr);
 616              }
 617           }
 618 
 619           if (count > StackPrintLimit) {
 620              st->print_cr("...<more frames>...");
 621           }
 622 
 623           st->cr();
 624        }
 625      }
 626    }
 627 
 628   STEP(130, "(printing Java stack)" )
 629 
 630      if (_verbose && _thread && _thread->is_Java_thread()) {
 631        print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
 632      }
 633 
 634   STEP(135, "(printing target Java thread stack)" )
 635 
 636      // printing Java thread stack trace if it is involved in GC crash
 637      if (_verbose && _thread && (_thread->is_Named_thread())) {
 638        JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
 639        if (jt != NULL) {
 640          st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
 641          print_stack_trace(st, jt, buf, sizeof(buf), true);
 642        }
 643      }
 644 




 568 
 569        if (fr.sp()) {
 570          st->print(",  sp=" PTR_FORMAT, fr.sp());
 571          size_t free_stack_size = pointer_delta(fr.sp(), stack_bottom, 1024);
 572          st->print(",  free space=" SIZE_FORMAT "k", free_stack_size);
 573        }
 574 
 575        st->cr();
 576      }
 577 
 578   STEP(120, "(printing native stack)" )
 579 
 580    if (_verbose) {
 581      if (os::platform_print_native_stack(st, _context, buf, sizeof(buf))) {
 582        // We have printed the native stack in platform-specific code
 583        // Windows/x64 needs special handling.
 584      } else {
 585        frame fr = _context ? os::fetch_frame_from_context(_context)
 586                            : os::current_frame();
 587 
 588        print_native_stack(st, fr, _thread, buf, sizeof(buf));




































 589      }
 590    }
 591 
 592   STEP(130, "(printing Java stack)" )
 593 
 594      if (_verbose && _thread && _thread->is_Java_thread()) {
 595        print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
 596      }
 597 
 598   STEP(135, "(printing target Java thread stack)" )
 599 
 600      // printing Java thread stack trace if it is involved in GC crash
 601      if (_verbose && _thread && (_thread->is_Named_thread())) {
 602        JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
 603        if (jt != NULL) {
 604          st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
 605          print_stack_trace(st, jt, buf, sizeof(buf), true);
 606        }
 607      }
 608