Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: runtime/vm/debugger.cc

Issue 2845053003: Fix asserts in StackFrameIterator which were effectively disabled (Closed)
Patch Set: Add StackFrameIterator::{ValidationPolicy,CrossThreadPolicy} enums Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/benchmark_test.cc ('k') | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/debugger.h" 5 #include "vm/debugger.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 8
9 #include "platform/address_sanitizer.h" 9 #include "platform/address_sanitizer.h"
10 10
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace(); 1158 DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
1159 intptr_t num_frames = stack->Length(); 1159 intptr_t num_frames = stack->Length();
1160 for (intptr_t i = 0; i < num_frames; i++) { 1160 for (intptr_t i = 0; i < num_frames; i++) {
1161 ActivationFrame* frame = stack->FrameAt(i); 1161 ActivationFrame* frame = stack->FrameAt(i);
1162 OS::PrintErr("#%04" Pd " %s", i, frame->ToCString()); 1162 OS::PrintErr("#%04" Pd " %s", i, frame->ToCString());
1163 } 1163 }
1164 1164
1165 OS::PrintErr( 1165 OS::PrintErr(
1166 "-------------------------\n" 1166 "-------------------------\n"
1167 "All frames...\n\n"); 1167 "All frames...\n\n");
1168 StackFrameIterator iterator(false); 1168 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
1169 Thread::Current(),
1170 StackFrameIterator::kNoCrossThreadIteration);
1169 StackFrame* frame = iterator.NextFrame(); 1171 StackFrame* frame = iterator.NextFrame();
1170 intptr_t num = 0; 1172 intptr_t num = 0;
1171 while ((frame != NULL)) { 1173 while ((frame != NULL)) {
1172 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString()); 1174 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString());
1173 frame = iterator.NextFrame(); 1175 frame = iterator.NextFrame();
1174 } 1176 }
1175 } 1177 }
1176 1178
1177 1179
1178 void ActivationFrame::VariableAt(intptr_t i, 1180 void ActivationFrame::VariableAt(intptr_t i,
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
1841 1843
1842 return dest_frame.raw(); 1844 return dest_frame.raw();
1843 } 1845 }
1844 1846
1845 1847
1846 DebuggerStackTrace* Debugger::CollectStackTrace() { 1848 DebuggerStackTrace* Debugger::CollectStackTrace() {
1847 Thread* thread = Thread::Current(); 1849 Thread* thread = Thread::Current();
1848 Zone* zone = thread->zone(); 1850 Zone* zone = thread->zone();
1849 Isolate* isolate = thread->isolate(); 1851 Isolate* isolate = thread->isolate();
1850 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); 1852 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
1851 StackFrameIterator iterator(false); 1853 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
1854 Thread::Current(),
1855 StackFrameIterator::kNoCrossThreadIteration);
1852 Code& code = Code::Handle(zone); 1856 Code& code = Code::Handle(zone);
1853 Code& inlined_code = Code::Handle(zone); 1857 Code& inlined_code = Code::Handle(zone);
1854 Array& deopt_frame = Array::Handle(zone); 1858 Array& deopt_frame = Array::Handle(zone);
1855 1859
1856 for (StackFrame* frame = iterator.NextFrame(); frame != NULL; 1860 for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
1857 frame = iterator.NextFrame()) { 1861 frame = iterator.NextFrame()) {
1858 ASSERT(frame->IsValid()); 1862 ASSERT(frame->IsValid());
1859 if (FLAG_trace_debugger_stacktrace) { 1863 if (FLAG_trace_debugger_stacktrace) {
1860 OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n", 1864 OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n",
1861 frame->ToCString()); 1865 frame->ToCString());
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1927 return NULL; 1931 return NULL;
1928 } 1932 }
1929 1933
1930 intptr_t synchronous_stack_trace_length = 1934 intptr_t synchronous_stack_trace_length =
1931 StackTraceUtils::CountFrames(thread, 0, async_function); 1935 StackTraceUtils::CountFrames(thread, 0, async_function);
1932 1936
1933 // Append the top frames from the synchronous stack trace, up until the active 1937 // Append the top frames from the synchronous stack trace, up until the active
1934 // asynchronous function. We truncate the remainder of the synchronous 1938 // asynchronous function. We truncate the remainder of the synchronous
1935 // stack trace because it contains activations that are part of the 1939 // stack trace because it contains activations that are part of the
1936 // asynchronous dispatch mechanisms. 1940 // asynchronous dispatch mechanisms.
1937 StackFrameIterator iterator(false); 1941 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
1942 Thread::Current(),
1943 StackFrameIterator::kNoCrossThreadIteration);
1938 StackFrame* frame = iterator.NextFrame(); 1944 StackFrame* frame = iterator.NextFrame();
1939 while (synchronous_stack_trace_length > 0) { 1945 while (synchronous_stack_trace_length > 0) {
1940 ASSERT(frame != NULL); 1946 ASSERT(frame != NULL);
1941 if (frame->IsDartFrame()) { 1947 if (frame->IsDartFrame()) {
1942 code = frame->LookupDartCode(); 1948 code = frame->LookupDartCode();
1943 AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code, 1949 AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
1944 &inlined_code, &deopt_frame); 1950 &inlined_code, &deopt_frame);
1945 synchronous_stack_trace_length--; 1951 synchronous_stack_trace_length--;
1946 } 1952 }
1947 frame = iterator.NextFrame(); 1953 frame = iterator.NextFrame();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 return NULL; 1996 return NULL;
1991 } 1997 }
1992 // Causal async stacks are not supported in the AOT runtime. 1998 // Causal async stacks are not supported in the AOT runtime.
1993 ASSERT(!FLAG_precompiled_runtime); 1999 ASSERT(!FLAG_precompiled_runtime);
1994 2000
1995 Thread* thread = Thread::Current(); 2001 Thread* thread = Thread::Current();
1996 Zone* zone = thread->zone(); 2002 Zone* zone = thread->zone();
1997 Isolate* isolate = thread->isolate(); 2003 Isolate* isolate = thread->isolate();
1998 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); 2004 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
1999 2005
2000 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames); 2006 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
2007 Thread::Current(),
2008 StackFrameIterator::kNoCrossThreadIteration);
2001 2009
2002 Code& code = Code::Handle(zone); 2010 Code& code = Code::Handle(zone);
2003 Smi& offset = Smi::Handle(zone); 2011 Smi& offset = Smi::Handle(zone);
2004 Function& function = Function::Handle(zone); 2012 Function& function = Function::Handle(zone);
2005 Code& inlined_code = Code::Handle(zone); 2013 Code& inlined_code = Code::Handle(zone);
2006 Closure& async_activation = Closure::Handle(zone); 2014 Closure& async_activation = Closure::Handle(zone);
2007 Object& next_async_activation = Object::Handle(zone); 2015 Object& next_async_activation = Object::Handle(zone);
2008 Array& deopt_frame = Array::Handle(zone); 2016 Array& deopt_frame = Array::Handle(zone);
2009 class StackTrace& async_stack_trace = StackTrace::Handle(zone); 2017 class StackTrace& async_stack_trace = StackTrace::Handle(zone);
2010 bool stack_has_async_function = false; 2018 bool stack_has_async_function = false;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2124 } 2132 }
2125 // Follow the link. 2133 // Follow the link.
2126 async_stack_trace = async_stack_trace.async_link(); 2134 async_stack_trace = async_stack_trace.async_link();
2127 } 2135 }
2128 2136
2129 return stack_trace; 2137 return stack_trace;
2130 } 2138 }
2131 2139
2132 2140
2133 ActivationFrame* Debugger::TopDartFrame() const { 2141 ActivationFrame* Debugger::TopDartFrame() const {
2134 StackFrameIterator iterator(false); 2142 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
2143 Thread::Current(),
2144 StackFrameIterator::kNoCrossThreadIteration);
2135 StackFrame* frame = iterator.NextFrame(); 2145 StackFrame* frame = iterator.NextFrame();
2136 while ((frame != NULL) && !frame->IsDartFrame()) { 2146 while ((frame != NULL) && !frame->IsDartFrame()) {
2137 frame = iterator.NextFrame(); 2147 frame = iterator.NextFrame();
2138 } 2148 }
2139 Code& code = Code::Handle(frame->LookupDartCode()); 2149 Code& code = Code::Handle(frame->LookupDartCode());
2140 ActivationFrame* activation = new ActivationFrame( 2150 ActivationFrame* activation = new ActivationFrame(
2141 frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0); 2151 frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0);
2142 return activation; 2152 return activation;
2143 } 2153 }
2144 2154
(...skipping 1192 matching lines...) Expand 10 before | Expand all | Expand 10 after
3337 } 3347 }
3338 if (FLAG_verbose_debug) { 3348 if (FLAG_verbose_debug) {
3339 OS::Print("HandleSteppingRequest- kStepOut %" Px "\n", stepping_fp_); 3349 OS::Print("HandleSteppingRequest- kStepOut %" Px "\n", stepping_fp_);
3340 } 3350 }
3341 } else if (resume_action_ == kStepRewind) { 3351 } else if (resume_action_ == kStepRewind) {
3342 if (FLAG_trace_rewind) { 3352 if (FLAG_trace_rewind) {
3343 OS::PrintErr("Rewinding to frame %" Pd "\n", resume_frame_index_); 3353 OS::PrintErr("Rewinding to frame %" Pd "\n", resume_frame_index_);
3344 OS::PrintErr( 3354 OS::PrintErr(
3345 "-------------------------\n" 3355 "-------------------------\n"
3346 "All frames...\n\n"); 3356 "All frames...\n\n");
3347 StackFrameIterator iterator(false); 3357 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
3358 Thread::Current(),
3359 StackFrameIterator::kNoCrossThreadIteration);
3348 StackFrame* frame = iterator.NextFrame(); 3360 StackFrame* frame = iterator.NextFrame();
3349 intptr_t num = 0; 3361 intptr_t num = 0;
3350 while ((frame != NULL)) { 3362 while ((frame != NULL)) {
3351 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString()); 3363 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString());
3352 frame = iterator.NextFrame(); 3364 frame = iterator.NextFrame();
3353 } 3365 }
3354 } 3366 }
3355 RewindToFrame(resume_frame_index_); 3367 RewindToFrame(resume_frame_index_);
3356 UNREACHABLE(); 3368 UNREACHABLE();
3357 } 3369 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
3459 } 3471 }
3460 3472
3461 3473
3462 void Debugger::RewindToFrame(intptr_t frame_index) { 3474 void Debugger::RewindToFrame(intptr_t frame_index) {
3463 Thread* thread = Thread::Current(); 3475 Thread* thread = Thread::Current();
3464 Zone* zone = thread->zone(); 3476 Zone* zone = thread->zone();
3465 Code& code = Code::Handle(zone); 3477 Code& code = Code::Handle(zone);
3466 Function& function = Function::Handle(zone); 3478 Function& function = Function::Handle(zone);
3467 3479
3468 // Find the requested frame. 3480 // Find the requested frame.
3469 StackFrameIterator iterator(false); 3481 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
3482 Thread::Current(),
3483 StackFrameIterator::kNoCrossThreadIteration);
3470 intptr_t current_frame = 0; 3484 intptr_t current_frame = 0;
3471 for (StackFrame* frame = iterator.NextFrame(); frame != NULL; 3485 for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
3472 frame = iterator.NextFrame()) { 3486 frame = iterator.NextFrame()) {
3473 ASSERT(frame->IsValid()); 3487 ASSERT(frame->IsValid());
3474 if (frame->IsDartFrame()) { 3488 if (frame->IsDartFrame()) {
3475 code = frame->LookupDartCode(); 3489 code = frame->LookupDartCode();
3476 function = code.function(); 3490 function = code.function();
3477 if (!IsFunctionVisible(function)) { 3491 if (!IsFunctionVisible(function)) {
3478 continue; 3492 continue;
3479 } 3493 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
3561 3575
3562 3576
3563 void Debugger::RewindPostDeopt() { 3577 void Debugger::RewindPostDeopt() {
3564 intptr_t rewind_frame = post_deopt_frame_index_; 3578 intptr_t rewind_frame = post_deopt_frame_index_;
3565 post_deopt_frame_index_ = -1; 3579 post_deopt_frame_index_ = -1;
3566 if (FLAG_trace_rewind) { 3580 if (FLAG_trace_rewind) {
3567 OS::PrintErr("Post deopt, jumping to frame %" Pd "\n", rewind_frame); 3581 OS::PrintErr("Post deopt, jumping to frame %" Pd "\n", rewind_frame);
3568 OS::PrintErr( 3582 OS::PrintErr(
3569 "-------------------------\n" 3583 "-------------------------\n"
3570 "All frames...\n\n"); 3584 "All frames...\n\n");
3571 StackFrameIterator iterator(false); 3585 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
3586 Thread::Current(),
3587 StackFrameIterator::kNoCrossThreadIteration);
3572 StackFrame* frame = iterator.NextFrame(); 3588 StackFrame* frame = iterator.NextFrame();
3573 intptr_t num = 0; 3589 intptr_t num = 0;
3574 while ((frame != NULL)) { 3590 while ((frame != NULL)) {
3575 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString()); 3591 OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString());
3576 frame = iterator.NextFrame(); 3592 frame = iterator.NextFrame();
3577 } 3593 }
3578 } 3594 }
3579 3595
3580 Thread* thread = Thread::Current(); 3596 Thread* thread = Thread::Current();
3581 Zone* zone = thread->zone(); 3597 Zone* zone = thread->zone();
3582 Code& code = Code::Handle(zone); 3598 Code& code = Code::Handle(zone);
3583 3599
3584 StackFrameIterator iterator(false); 3600 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames,
3601 Thread::Current(),
3602 StackFrameIterator::kNoCrossThreadIteration);
3585 intptr_t current_frame = 0; 3603 intptr_t current_frame = 0;
3586 for (StackFrame* frame = iterator.NextFrame(); frame != NULL; 3604 for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
3587 frame = iterator.NextFrame()) { 3605 frame = iterator.NextFrame()) {
3588 ASSERT(frame->IsValid()); 3606 ASSERT(frame->IsValid());
3589 if (frame->IsDartFrame()) { 3607 if (frame->IsDartFrame()) {
3590 code = frame->LookupDartCode(); 3608 code = frame->LookupDartCode();
3591 ASSERT(!code.is_optimized()); 3609 ASSERT(!code.is_optimized());
3592 if (current_frame == rewind_frame) { 3610 if (current_frame == rewind_frame) {
3593 RewindToUnoptimizedFrame(frame, code); 3611 RewindToUnoptimizedFrame(frame, code);
3594 UNREACHABLE(); 3612 UNREACHABLE();
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after
4367 4385
4368 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 4386 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
4369 ASSERT(bpt->next() == NULL); 4387 ASSERT(bpt->next() == NULL);
4370 bpt->set_next(code_breakpoints_); 4388 bpt->set_next(code_breakpoints_);
4371 code_breakpoints_ = bpt; 4389 code_breakpoints_ = bpt;
4372 } 4390 }
4373 4391
4374 #endif // !PRODUCT 4392 #endif // !PRODUCT
4375 4393
4376 } // namespace dart 4394 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/benchmark_test.cc ('k') | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698