OLD | NEW |
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 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 ctx = activation->GetSavedCurrentContext(); | 956 ctx = activation->GetSavedCurrentContext(); |
957 if (FLAG_verbose_debug && ctx.IsNull()) { | 957 if (FLAG_verbose_debug && ctx.IsNull()) { |
958 const Function& caller = activation->function(); | 958 const Function& caller = activation->function(); |
959 const Function& callee = callee_activation->function(); | 959 const Function& callee = callee_activation->function(); |
960 const Script& script = | 960 const Script& script = |
961 Script::Handle(Class::Handle(caller.Owner()).script()); | 961 Script::Handle(Class::Handle(caller.Owner()).script()); |
962 intptr_t line, col; | 962 intptr_t line, col; |
963 script.GetTokenLocation(activation->TokenPos(), &line, &col); | 963 script.GetTokenLocation(activation->TokenPos(), &line, &col); |
964 OS::Print("CollectStackTrace error: no saved context in function " | 964 OS::Print("CollectStackTrace error: no saved context in function " |
965 "'%s' which calls closure '%s' " | 965 "'%s' which calls closure '%s' " |
966 " in line %"Pd" column %"Pd"\n", | 966 " in line %" Pd " column %" Pd "\n", |
967 caller.ToFullyQualifiedCString(), | 967 caller.ToFullyQualifiedCString(), |
968 callee.ToFullyQualifiedCString(), | 968 callee.ToFullyQualifiedCString(), |
969 line, col); | 969 line, col); |
970 } | 970 } |
971 } | 971 } |
972 if (optimized_frame_found || code.is_optimized()) { | 972 if (optimized_frame_found || code.is_optimized()) { |
973 // Set context to null, to avoid returning bad context variable values. | 973 // Set context to null, to avoid returning bad context variable values. |
974 activation->SetContext(Context::Handle()); | 974 activation->SetContext(Context::Handle()); |
975 optimized_frame_found = true; | 975 optimized_frame_found = true; |
976 } else { | 976 } else { |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 } else { | 1184 } else { |
1185 // This function has not been compiled yet. Set a pending | 1185 // This function has not been compiled yet. Set a pending |
1186 // breakpoint to be resolved later. | 1186 // breakpoint to be resolved later. |
1187 SourceBreakpoint* source_bpt = | 1187 SourceBreakpoint* source_bpt = |
1188 GetSourceBreakpoint(target_function, first_token_pos); | 1188 GetSourceBreakpoint(target_function, first_token_pos); |
1189 if (source_bpt != NULL) { | 1189 if (source_bpt != NULL) { |
1190 // A pending source breakpoint for this uncompiled location | 1190 // A pending source breakpoint for this uncompiled location |
1191 // already exists. | 1191 // already exists. |
1192 if (FLAG_verbose_debug) { | 1192 if (FLAG_verbose_debug) { |
1193 OS::Print("Pending breakpoint for uncompiled function" | 1193 OS::Print("Pending breakpoint for uncompiled function" |
1194 " '%s' at line %"Pd" already exists\n", | 1194 " '%s' at line %" Pd " already exists\n", |
1195 target_function.ToFullyQualifiedCString(), | 1195 target_function.ToFullyQualifiedCString(), |
1196 source_bpt->LineNumber()); | 1196 source_bpt->LineNumber()); |
1197 } | 1197 } |
1198 return source_bpt; | 1198 return source_bpt; |
1199 } | 1199 } |
1200 source_bpt = | 1200 source_bpt = |
1201 new SourceBreakpoint(nextId(), target_function, first_token_pos); | 1201 new SourceBreakpoint(nextId(), target_function, first_token_pos); |
1202 RegisterSourceBreakpoint(source_bpt); | 1202 RegisterSourceBreakpoint(source_bpt); |
1203 if (FLAG_verbose_debug) { | 1203 if (FLAG_verbose_debug) { |
1204 OS::Print("Registering pending breakpoint for " | 1204 OS::Print("Registering pending breakpoint for " |
1205 "uncompiled function '%s' at line %"Pd"\n", | 1205 "uncompiled function '%s' at line %" Pd "\n", |
1206 target_function.ToFullyQualifiedCString(), | 1206 target_function.ToFullyQualifiedCString(), |
1207 source_bpt->LineNumber()); | 1207 source_bpt->LineNumber()); |
1208 } | 1208 } |
1209 source_bpt->Enable(); | 1209 source_bpt->Enable(); |
1210 return source_bpt; | 1210 return source_bpt; |
1211 } | 1211 } |
1212 ASSERT(breakpoint_pos != -1); | 1212 ASSERT(breakpoint_pos != -1); |
1213 SourceBreakpoint* source_bpt = | 1213 SourceBreakpoint* source_bpt = |
1214 GetSourceBreakpoint(target_function, breakpoint_pos); | 1214 GetSourceBreakpoint(target_function, breakpoint_pos); |
1215 if (source_bpt != NULL) { | 1215 if (source_bpt != NULL) { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 OS::Print("Failed to find script with url '%s'\n", | 1279 OS::Print("Failed to find script with url '%s'\n", |
1280 script_url.ToCString()); | 1280 script_url.ToCString()); |
1281 } | 1281 } |
1282 return NULL; | 1282 return NULL; |
1283 } | 1283 } |
1284 intptr_t first_token_idx, last_token_idx; | 1284 intptr_t first_token_idx, last_token_idx; |
1285 script.TokenRangeAtLine(line_number, &first_token_idx, &last_token_idx); | 1285 script.TokenRangeAtLine(line_number, &first_token_idx, &last_token_idx); |
1286 if (first_token_idx < 0) { | 1286 if (first_token_idx < 0) { |
1287 // Script does not contain the given line number. | 1287 // Script does not contain the given line number. |
1288 if (FLAG_verbose_debug) { | 1288 if (FLAG_verbose_debug) { |
1289 OS::Print("Script '%s' does not contain line number %"Pd"\n", | 1289 OS::Print("Script '%s' does not contain line number %" Pd "\n", |
1290 script_url.ToCString(), line_number); | 1290 script_url.ToCString(), line_number); |
1291 } | 1291 } |
1292 return NULL; | 1292 return NULL; |
1293 } else if (last_token_idx < 0) { | 1293 } else if (last_token_idx < 0) { |
1294 // Line does not contain any tokens. first_token_index is the first | 1294 // Line does not contain any tokens. first_token_index is the first |
1295 // token after the given line. We check whether that token is | 1295 // token after the given line. We check whether that token is |
1296 // part of a function. | 1296 // part of a function. |
1297 last_token_idx = first_token_idx; | 1297 last_token_idx = first_token_idx; |
1298 } | 1298 } |
1299 | 1299 |
1300 Function& func = Function::Handle(isolate_); | 1300 Function& func = Function::Handle(isolate_); |
1301 while (first_token_idx <= last_token_idx) { | 1301 while (first_token_idx <= last_token_idx) { |
1302 func = lib.LookupFunctionInScript(script, first_token_idx); | 1302 func = lib.LookupFunctionInScript(script, first_token_idx); |
1303 if (!func.IsNull()) { | 1303 if (!func.IsNull()) { |
1304 break; | 1304 break; |
1305 } | 1305 } |
1306 first_token_idx++; | 1306 first_token_idx++; |
1307 } | 1307 } |
1308 if (func.IsNull()) { | 1308 if (func.IsNull()) { |
1309 if (FLAG_verbose_debug) { | 1309 if (FLAG_verbose_debug) { |
1310 OS::Print("No executable code at line %"Pd" in '%s'\n", | 1310 OS::Print("No executable code at line %" Pd " in '%s'\n", |
1311 line_number, script_url.ToCString()); | 1311 line_number, script_url.ToCString()); |
1312 } | 1312 } |
1313 return NULL; | 1313 return NULL; |
1314 } | 1314 } |
1315 if (last_token_idx < 0) { | 1315 if (last_token_idx < 0) { |
1316 // The token at first_token_index is past the requested source line. | 1316 // The token at first_token_index is past the requested source line. |
1317 // Set the breakpoint at the closest position after that line. | 1317 // Set the breakpoint at the closest position after that line. |
1318 last_token_idx = func.end_token_pos(); | 1318 last_token_idx = func.end_token_pos(); |
1319 } | 1319 } |
1320 return SetBreakpoint(func, first_token_idx, last_token_idx); | 1320 return SetBreakpoint(func, first_token_idx, last_token_idx); |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 // Check whether we are in a Dart function that the user is | 1581 // Check whether we are in a Dart function that the user is |
1582 // interested in. | 1582 // interested in. |
1583 ActivationFrame* frame = TopDartFrame(); | 1583 ActivationFrame* frame = TopDartFrame(); |
1584 ASSERT(frame != NULL); | 1584 ASSERT(frame != NULL); |
1585 const Function& func = frame->function(); | 1585 const Function& func = frame->function(); |
1586 if (!IsDebuggable(func)) { | 1586 if (!IsDebuggable(func)) { |
1587 return; | 1587 return; |
1588 } | 1588 } |
1589 | 1589 |
1590 if (FLAG_verbose_debug) { | 1590 if (FLAG_verbose_debug) { |
1591 OS::Print(">>> single step break at %s:%"Pd" (func %s token %"Pd")\n", | 1591 OS::Print(">>> single step break at %s:%" Pd " (func %s token %" Pd ")\n", |
1592 String::Handle(frame->SourceUrl()).ToCString(), | 1592 String::Handle(frame->SourceUrl()).ToCString(), |
1593 frame->LineNumber(), | 1593 frame->LineNumber(), |
1594 String::Handle(frame->QualifiedFunctionName()).ToCString(), | 1594 String::Handle(frame->QualifiedFunctionName()).ToCString(), |
1595 frame->TokenPos()); | 1595 frame->TokenPos()); |
1596 } | 1596 } |
1597 | 1597 |
1598 stack_trace_ = CollectStackTrace(); | 1598 stack_trace_ = CollectStackTrace(); |
1599 SignalPausedEvent(frame); | 1599 SignalPausedEvent(frame); |
1600 | 1600 |
1601 RemoveInternalBreakpoints(); | 1601 RemoveInternalBreakpoints(); |
(...skipping 21 matching lines...) Expand all Loading... |
1623 ActivationFrame* top_frame = stack_trace->ActivationFrameAt(0); | 1623 ActivationFrame* top_frame = stack_trace->ActivationFrameAt(0); |
1624 ASSERT(top_frame != NULL); | 1624 ASSERT(top_frame != NULL); |
1625 CodeBreakpoint* bpt = GetCodeBreakpoint(top_frame->pc()); | 1625 CodeBreakpoint* bpt = GetCodeBreakpoint(top_frame->pc()); |
1626 ASSERT(bpt != NULL); | 1626 ASSERT(bpt != NULL); |
1627 | 1627 |
1628 bool report_bp = true; | 1628 bool report_bp = true; |
1629 if (bpt->IsInternal() && !IsDebuggable(top_frame->function())) { | 1629 if (bpt->IsInternal() && !IsDebuggable(top_frame->function())) { |
1630 report_bp = false; | 1630 report_bp = false; |
1631 } | 1631 } |
1632 if (FLAG_verbose_debug) { | 1632 if (FLAG_verbose_debug) { |
1633 OS::Print(">>> %s %s breakpoint at %s:%"Pd" " | 1633 OS::Print(">>> %s %s breakpoint at %s:%" Pd " " |
1634 "(token %"Pd") (address %#"Px")\n", | 1634 "(token %" Pd ") (address %#" Px ")\n", |
1635 report_bp ? "hit" : "ignore", | 1635 report_bp ? "hit" : "ignore", |
1636 bpt->IsInternal() ? "internal" : "user", | 1636 bpt->IsInternal() ? "internal" : "user", |
1637 String::Handle(bpt->SourceUrl()).ToCString(), | 1637 String::Handle(bpt->SourceUrl()).ToCString(), |
1638 bpt->LineNumber(), | 1638 bpt->LineNumber(), |
1639 bpt->token_pos(), | 1639 bpt->token_pos(), |
1640 top_frame->pc()); | 1640 top_frame->pc()); |
1641 } | 1641 } |
1642 | 1642 |
1643 if (report_bp && (event_handler_ != NULL)) { | 1643 if (report_bp && (event_handler_ != NULL)) { |
1644 stack_trace_ = stack_trace; | 1644 stack_trace_ = stack_trace; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1865 } | 1865 } |
1866 | 1866 |
1867 | 1867 |
1868 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 1868 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
1869 ASSERT(bpt->next() == NULL); | 1869 ASSERT(bpt->next() == NULL); |
1870 bpt->set_next(code_breakpoints_); | 1870 bpt->set_next(code_breakpoints_); |
1871 code_breakpoints_ = bpt; | 1871 code_breakpoints_ = bpt; |
1872 } | 1872 } |
1873 | 1873 |
1874 } // namespace dart | 1874 } // namespace dart |
OLD | NEW |