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) { |