comparison src/share/vm/runtime/vframe.hpp @ 107:93b6525e3b82

6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on Summary: Rewrite frame::safe_for_sender and friends to be safe for collector/analyzer Reviewed-by: dcubed, kvn
author sgoldman
date Tue, 08 Apr 2008 12:23:15 -0400
parents d3cd40645d0d
children d1605aabd0a1
comparison
equal deleted inserted replaced
106:c9314fa4f757 107:93b6525e3b82
414 } else { 414 } else {
415 PcDesc* pc_desc = nm()->pc_desc_at(_frame.pc()); 415 PcDesc* pc_desc = nm()->pc_desc_at(_frame.pc());
416 int decode_offset; 416 int decode_offset;
417 if (pc_desc == NULL) { 417 if (pc_desc == NULL) {
418 // Should not happen, but let fill_from_compiled_frame handle it. 418 // Should not happen, but let fill_from_compiled_frame handle it.
419
420 // If we are trying to walk the stack of a thread that is not
421 // at a safepoint (like AsyncGetCallTrace would do) then this is an
422 // acceptable result. [ This is assuming that safe_for_sender
423 // is so bullet proof that we can trust the frames it produced. ]
424 //
425 // So if we see that the thread is not safepoint safe
426 // then simply produce the method and a bci of zero
427 // and skip the possibility of decoding any inlining that
428 // may be present. That is far better than simply stopping (or
429 // asserting. If however the thread is safepoint safe this
430 // is the sign of a compiler bug and we'll let
431 // fill_from_compiled_frame handle it.
432
433
434 JavaThreadState state = _thread->thread_state();
435
436 // in_Java should be good enough to test safepoint safety
437 // if state were say in_Java_trans then we'd expect that
438 // the pc would have already been slightly adjusted to
439 // one that would produce a pcDesc since the trans state
440 // would be one that might in fact anticipate a safepoint
441
442 if (state == _thread_in_Java ) {
443 // This will get a method a zero bci and no inlining.
444 // Might be nice to have a unique bci to signify this
445 // particular case but for now zero will do.
446
447 fill_from_compiled_native_frame();
448
449 // There is something to be said for setting the mode to
450 // at_end_mode to prevent trying to walk further up the
451 // stack. There is evidence that if we walk any further
452 // that we could produce a bad stack chain. However until
453 // we see evidence that allowing this causes us to find
454 // frames bad enough to cause segv's or assertion failures
455 // we don't do it as while we may get a bad call chain the
456 // probability is much higher (several magnitudes) that we
457 // get good data.
458
459 return true;
460 }
419 decode_offset = DebugInformationRecorder::serialized_null; 461 decode_offset = DebugInformationRecorder::serialized_null;
420 } else { 462 } else {
421 decode_offset = pc_desc->scope_decode_offset(); 463 decode_offset = pc_desc->scope_decode_offset();
422 } 464 }
423 fill_from_compiled_frame(decode_offset); 465 fill_from_compiled_frame(decode_offset);