Commit 05c195bd authored by yangguo@chromium.org's avatar yangguo@chromium.org

Intercept a crash, put debug information onto the stack and then abort gracefully.

BUG=125128
TEST=

Review URL: https://chromiumcodereview.appspot.com/10375009

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11516 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ae0a7ec9
...@@ -892,6 +892,16 @@ void Debug::Iterate(ObjectVisitor* v) { ...@@ -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) { Object* Debug::Break(Arguments args) {
Heap* heap = isolate_->heap(); Heap* heap = isolate_->heap();
HandleScope scope(isolate_); HandleScope scope(isolate_);
...@@ -984,11 +994,34 @@ Object* Debug::Break(Arguments args) { ...@@ -984,11 +994,34 @@ Object* Debug::Break(Arguments args) {
// Count frames until target frame // Count frames until target frame
int count = 0; int count = 0;
JavaScriptFrameIterator it(isolate_); JavaScriptFrameIterator it(isolate_);
while (!it.done() && it.frame()->fp() != thread_local_.last_fp_) { while (!it.done() && it.frame()->fp() < thread_local_.last_fp_) {
count++; count++;
it.Advance(); 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 we found original frame
if (it.frame()->fp() == thread_local_.last_fp_) { if (it.frame()->fp() == thread_local_.last_fp_) {
if (step_count > 1) { if (step_count > 1) {
......
...@@ -232,6 +232,12 @@ class Debug { ...@@ -232,6 +232,12 @@ class Debug {
void PreemptionWhileInDebugger(); void PreemptionWhileInDebugger();
void Iterate(ObjectVisitor* v); void Iterate(ObjectVisitor* v);
NO_INLINE(void PutValuesOnStackAndDie(int start,
Address c_entry_fp,
Address last_fp,
Address larger_fp,
int count,
int end));
Object* Break(Arguments args); Object* Break(Arguments args);
void SetBreakPoint(Handle<SharedFunctionInfo> shared, void SetBreakPoint(Handle<SharedFunctionInfo> shared,
Handle<Object> break_point_object, Handle<Object> break_point_object,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment