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

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

Issue 11028040: - Add support to interrupt a running isolate (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 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 | Annotate | Revision Log
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 "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/code_patcher.h" 10 #include "vm/code_patcher.h"
(...skipping 10 matching lines...) Expand all
21 #include "vm/stub_code.h" 21 #include "vm/stub_code.h"
22 #include "vm/symbols.h" 22 #include "vm/symbols.h"
23 #include "vm/visitor.h" 23 #include "vm/visitor.h"
24 24
25 25
26 namespace dart { 26 namespace dart {
27 27
28 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages"); 28 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
29 29
30 30
31 static void DefaultBreakpointHandler(SourceBreakpoint* bpt, 31 static void DefaultBreakpointHandler(Dart_Port isolate_id,
32 SourceBreakpoint* bpt,
32 DebuggerStackTrace* stack) { 33 DebuggerStackTrace* stack) {
33 String& var_name = String::Handle(); 34 String& var_name = String::Handle();
34 Instance& value = Instance::Handle(); 35 Instance& value = Instance::Handle();
35 for (intptr_t i = 0; i < stack->Length(); i++) { 36 for (intptr_t i = 0; i < stack->Length(); i++) {
36 ActivationFrame* frame = stack->ActivationFrameAt(i); 37 ActivationFrame* frame = stack->ActivationFrameAt(i);
37 OS::Print(" %"Pd". %s\n", 38 OS::Print(" %"Pd". %s\n",
38 i + 1, frame->ToCString()); 39 i + 1, frame->ToCString());
39 intptr_t num_locals = frame->NumLocalVariables(); 40 intptr_t num_locals = frame->NumLocalVariables();
40 for (intptr_t i = 0; i < num_locals; i++) { 41 for (intptr_t i = 0; i < num_locals; i++) {
41 intptr_t token_pos, end_pos; 42 intptr_t token_pos, end_pos;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 162
162 163
163 void Debugger::SignalIsolateEvent(EventType type) { 164 void Debugger::SignalIsolateEvent(EventType type) {
164 if (event_handler_ != NULL) { 165 if (event_handler_ != NULL) {
165 Debugger* debugger = Isolate::Current()->debugger(); 166 Debugger* debugger = Isolate::Current()->debugger();
166 ASSERT(debugger != NULL); 167 ASSERT(debugger != NULL);
167 DebuggerEvent event; 168 DebuggerEvent event;
168 event.type = type; 169 event.type = type;
169 event.isolate_id = debugger->GetIsolateId(); 170 event.isolate_id = debugger->GetIsolateId();
170 ASSERT(event.isolate_id != ILLEGAL_ISOLATE_ID); 171 ASSERT(event.isolate_id != ILLEGAL_ISOLATE_ID);
171 (*event_handler_)(&event); 172 if (type == kIsolateInterrupted) {
173 DebuggerStackTrace* stack_trace = debugger->CollectStackTrace();
174 ASSERT(stack_trace->Length() > 0);
175 ASSERT(debugger->stack_trace_ == NULL);
176 ASSERT(debugger->obj_cache_ == NULL);
177 debugger->obj_cache_ = new RemoteObjectCache(64);
178 debugger->stack_trace_ = stack_trace;
179 (*event_handler_)(&event);
180 debugger->stack_trace_ = NULL;
181 debugger->obj_cache_ = NULL; // Remote object cache is zone allocated.
182 // TODO(asiva): Need some work here to be able to single step after
183 // an interrupt.
184 } else {
185 (*event_handler_)(&event);
186 }
172 } 187 }
173 } 188 }
174 189
175 190
176 const char* Debugger::QualifiedFunctionName(const Function& func) { 191 const char* Debugger::QualifiedFunctionName(const Function& func) {
177 const String& func_name = String::Handle(func.name()); 192 const String& func_name = String::Handle(func.name());
178 Class& func_class = Class::Handle(func.Owner()); 193 Class& func_class = Class::Handle(func.Owner());
179 String& class_name = String::Handle(func_class.Name()); 194 String& class_name = String::Handle(func_class.Name());
180 195
181 const char* kFormat = "%s%s%s"; 196 const char* kFormat = "%s%s%s";
(...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 // callback even if it is on the same line as the previous breakpoint. 1345 // callback even if it is on the same line as the previous breakpoint.
1331 last_bpt_line_ = -1; 1346 last_bpt_line_ = -1;
1332 } 1347 }
1333 1348
1334 bool notify_frontend = 1349 bool notify_frontend =
1335 (last_bpt_line_ < 0) || (last_bpt_line_ != bpt->LineNumber()); 1350 (last_bpt_line_ < 0) || (last_bpt_line_ != bpt->LineNumber());
1336 1351
1337 if (notify_frontend) { 1352 if (notify_frontend) {
1338 resume_action_ = kContinue; 1353 resume_action_ = kContinue;
1339 if (bp_handler_ != NULL) { 1354 if (bp_handler_ != NULL) {
1355 Isolate* isolate = Isolate::Current();
hausner 2012/10/05 18:06:34 Why do you need to get the debugger object through
siva 2012/10/05 22:35:06 Good point, this is not a static function so just
1356 ASSERT(isolate != NULL);
1357 ASSERT(isolate->debugger() != NULL);
1340 SourceBreakpoint* src_bpt = bpt->src_bpt(); 1358 SourceBreakpoint* src_bpt = bpt->src_bpt();
1341 ASSERT(stack_trace_ == NULL); 1359 ASSERT(stack_trace_ == NULL);
1342 ASSERT(obj_cache_ == NULL); 1360 ASSERT(obj_cache_ == NULL);
1343 obj_cache_ = new RemoteObjectCache(64); 1361 obj_cache_ = new RemoteObjectCache(64);
1344 stack_trace_ = stack_trace; 1362 stack_trace_ = stack_trace;
1345 (*bp_handler_)(src_bpt, stack_trace); 1363 (*bp_handler_)(isolate->debugger()->GetIsolateId(), src_bpt, stack_trace);
1346 stack_trace_ = NULL; 1364 stack_trace_ = NULL;
1347 obj_cache_ = NULL; // Remote object cache is zone allocated. 1365 obj_cache_ = NULL; // Remote object cache is zone allocated.
1348 last_bpt_line_ = bpt->LineNumber(); 1366 last_bpt_line_ = bpt->LineNumber();
1349 } 1367 }
1350 } 1368 }
1351 1369
1352 Function& currently_instrumented_func = Function::Handle(); 1370 Function& currently_instrumented_func = Function::Handle();
1353 if (bpt->IsInternal()) { 1371 if (bpt->IsInternal()) {
1354 currently_instrumented_func = bpt->function(); 1372 currently_instrumented_func = bpt->function();
1355 } 1373 }
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 } 1619 }
1602 1620
1603 1621
1604 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 1622 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
1605 ASSERT(bpt->next() == NULL); 1623 ASSERT(bpt->next() == NULL);
1606 bpt->set_next(code_breakpoints_); 1624 bpt->set_next(code_breakpoints_);
1607 code_breakpoints_ = bpt; 1625 code_breakpoints_ = bpt;
1608 } 1626 }
1609 1627
1610 } // namespace dart 1628 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698