| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index 88a976f8dccb778ba72d1b94ca144ebe1f020995..9efb5c37aae3fb6983c95cdfccaa989734a040a9 100644
|
| --- a/src/debug.cc
|
| +++ b/src/debug.cc
|
| @@ -892,6 +892,16 @@ void Debug::Iterate(ObjectVisitor* v) {
|
| }
|
|
|
|
|
| +void Debug::PutValuesOnStackAndDie(int start,
|
| + Address c_entry_fp,
|
| + Address last_fp,
|
| + Address larger_fp,
|
| + int count,
|
| + int end) {
|
| + OS::Abort();
|
| +}
|
| +
|
| +
|
| Object* Debug::Break(Arguments args) {
|
| Heap* heap = isolate_->heap();
|
| HandleScope scope(isolate_);
|
| @@ -984,11 +994,34 @@ Object* Debug::Break(Arguments args) {
|
| // Count frames until target frame
|
| int count = 0;
|
| JavaScriptFrameIterator it(isolate_);
|
| - while (!it.done() && it.frame()->fp() != thread_local_.last_fp_) {
|
| + while (!it.done() && it.frame()->fp() < thread_local_.last_fp_) {
|
| count++;
|
| it.Advance();
|
| }
|
|
|
| + // Catch the cases that would lead to crashes and capture
|
| + // - C entry FP at which to start stack crawl.
|
| + // - FP of the frame at which we plan to stop stepping out (last FP).
|
| + // - current FP that's larger than last FP.
|
| + // - Counter for the number of steps to step out.
|
| + if (it.done()) {
|
| + // We crawled the entire stack, never reaching last_fp_.
|
| + PutValuesOnStackAndDie(0xBEEEEEEE,
|
| + frame->fp(),
|
| + thread_local_.last_fp_,
|
| + NULL,
|
| + count,
|
| + 0xFEEEEEEE);
|
| + } else if (it.frame()->fp() != thread_local_.last_fp_) {
|
| + // We crawled over last_fp_, without getting a match.
|
| + PutValuesOnStackAndDie(0xBEEEEEEE,
|
| + frame->fp(),
|
| + thread_local_.last_fp_,
|
| + it.frame()->fp(),
|
| + count,
|
| + 0xFEEEEEEE);
|
| + }
|
| +
|
| // If we found original frame
|
| if (it.frame()->fp() == thread_local_.last_fp_) {
|
| if (step_count > 1) {
|
|
|