| 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 "vm/code_generator.h" | 7 #include "vm/code_generator.h" |
| 8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 } | 864 } |
| 865 if (best_fit_index >= 0) { | 865 if (best_fit_index >= 0) { |
| 866 CodeBreakpoint* bpt = GetCodeBreakpoint(desc.PC(best_fit_index)); | 866 CodeBreakpoint* bpt = GetCodeBreakpoint(desc.PC(best_fit_index)); |
| 867 // We should only ever have one code breakpoint at the same address. | 867 // We should only ever have one code breakpoint at the same address. |
| 868 if (bpt != NULL) { | 868 if (bpt != NULL) { |
| 869 return bpt; | 869 return bpt; |
| 870 } | 870 } |
| 871 | 871 |
| 872 bpt = new CodeBreakpoint(func, best_fit_index); | 872 bpt = new CodeBreakpoint(func, best_fit_index); |
| 873 if (FLAG_verbose_debug) { | 873 if (FLAG_verbose_debug) { |
| 874 OS::Print("Setting breakpoint in function '%s' (%s:%d) (PC %p)\n", | 874 OS::Print("Setting breakpoint in function '%s' " |
| 875 "(%s:%"Pd") (PC %#"Px")\n", |
| 875 String::Handle(func.name()).ToCString(), | 876 String::Handle(func.name()).ToCString(), |
| 876 String::Handle(bpt->SourceUrl()).ToCString(), | 877 String::Handle(bpt->SourceUrl()).ToCString(), |
| 877 bpt->LineNumber(), | 878 bpt->LineNumber(), |
| 878 bpt->pc()); | 879 bpt->pc()); |
| 879 } | 880 } |
| 880 RegisterCodeBreakpoint(bpt); | 881 RegisterCodeBreakpoint(bpt); |
| 881 return bpt; | 882 return bpt; |
| 882 } | 883 } |
| 883 return NULL; | 884 return NULL; |
| 884 } | 885 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 if (bpt != NULL) { | 917 if (bpt != NULL) { |
| 917 // A source breakpoint for this uncompiled location already | 918 // A source breakpoint for this uncompiled location already |
| 918 // exists. | 919 // exists. |
| 919 return bpt; | 920 return bpt; |
| 920 } | 921 } |
| 921 } | 922 } |
| 922 bpt = new SourceBreakpoint(nextId(), target_function, first_token_pos); | 923 bpt = new SourceBreakpoint(nextId(), target_function, first_token_pos); |
| 923 RegisterSourceBreakpoint(bpt); | 924 RegisterSourceBreakpoint(bpt); |
| 924 if (FLAG_verbose_debug && !target_function.HasCode()) { | 925 if (FLAG_verbose_debug && !target_function.HasCode()) { |
| 925 OS::Print("Registering breakpoint for " | 926 OS::Print("Registering breakpoint for " |
| 926 "uncompiled function '%s' at line %d\n", | 927 "uncompiled function '%s' at line %"Pd"\n", |
| 927 target_function.ToFullyQualifiedCString(), | 928 target_function.ToFullyQualifiedCString(), |
| 928 bpt->LineNumber()); | 929 bpt->LineNumber()); |
| 929 } | 930 } |
| 930 | 931 |
| 931 if (cbpt != NULL) { | 932 if (cbpt != NULL) { |
| 932 ASSERT(cbpt->src_bpt() == NULL); | 933 ASSERT(cbpt->src_bpt() == NULL); |
| 933 cbpt->set_src_bpt(bpt); | 934 cbpt->set_src_bpt(bpt); |
| 934 SignalBpResolved(bpt); | 935 SignalBpResolved(bpt); |
| 935 } else { | 936 } else { |
| 936 if (FLAG_verbose_debug) { | 937 if (FLAG_verbose_debug) { |
| 937 OS::Print("Failed to set breakpoint at '%s' line %d\n", | 938 OS::Print("Failed to set breakpoint at '%s' line %"Pd"\n", |
| 938 String::Handle(bpt->SourceUrl()).ToCString(), | 939 String::Handle(bpt->SourceUrl()).ToCString(), |
| 939 bpt->LineNumber()); | 940 bpt->LineNumber()); |
| 940 } | 941 } |
| 941 } | 942 } |
| 942 bpt->Enable(); | 943 bpt->Enable(); |
| 943 return bpt; | 944 return bpt; |
| 944 } | 945 } |
| 945 | 946 |
| 946 | 947 |
| 947 // Synchronize the enabled/disabled state of all code breakpoints | 948 // Synchronize the enabled/disabled state of all code breakpoints |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 OS::Print("Failed to find script with url '%s'\n", | 989 OS::Print("Failed to find script with url '%s'\n", |
| 989 script_url.ToCString()); | 990 script_url.ToCString()); |
| 990 } | 991 } |
| 991 return NULL; | 992 return NULL; |
| 992 } | 993 } |
| 993 intptr_t first_token_idx, last_token_idx; | 994 intptr_t first_token_idx, last_token_idx; |
| 994 script.TokenRangeAtLine(line_number, &first_token_idx, &last_token_idx); | 995 script.TokenRangeAtLine(line_number, &first_token_idx, &last_token_idx); |
| 995 if (first_token_idx < 0) { | 996 if (first_token_idx < 0) { |
| 996 // Script does not contain the given line number. | 997 // Script does not contain the given line number. |
| 997 if (FLAG_verbose_debug) { | 998 if (FLAG_verbose_debug) { |
| 998 OS::Print("Script '%s' does not contain line number %d\n", | 999 OS::Print("Script '%s' does not contain line number %"Pd"\n", |
| 999 script_url.ToCString(), line_number); | 1000 script_url.ToCString(), line_number); |
| 1000 } | 1001 } |
| 1001 return NULL; | 1002 return NULL; |
| 1002 } | 1003 } |
| 1003 const Function& func = | 1004 const Function& func = |
| 1004 Function::Handle(lib.LookupFunctionInScript(script, first_token_idx)); | 1005 Function::Handle(lib.LookupFunctionInScript(script, first_token_idx)); |
| 1005 if (func.IsNull()) { | 1006 if (func.IsNull()) { |
| 1006 if (FLAG_verbose_debug) { | 1007 if (FLAG_verbose_debug) { |
| 1007 OS::Print("No executable code at line %d in '%s'\n", | 1008 OS::Print("No executable code at line %"Pd" in '%s'\n", |
| 1008 line_number, script_url.ToCString()); | 1009 line_number, script_url.ToCString()); |
| 1009 } | 1010 } |
| 1010 return NULL; | 1011 return NULL; |
| 1011 } | 1012 } |
| 1012 if (last_token_idx < 0) { | 1013 if (last_token_idx < 0) { |
| 1013 // The token at first_token_index is past the requested source line. | 1014 // The token at first_token_index is past the requested source line. |
| 1014 // Set the breakpoint at the closest position after that line. | 1015 // Set the breakpoint at the closest position after that line. |
| 1015 last_token_idx = func.end_token_pos(); | 1016 last_token_idx = func.end_token_pos(); |
| 1016 } | 1017 } |
| 1017 return SetBreakpoint(func, first_token_idx, last_token_idx); | 1018 return SetBreakpoint(func, first_token_idx, last_token_idx); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1232 } | 1233 } |
| 1233 } | 1234 } |
| 1234 | 1235 |
| 1235 | 1236 |
| 1236 static void DefaultBreakpointHandler(SourceBreakpoint* bpt, | 1237 static void DefaultBreakpointHandler(SourceBreakpoint* bpt, |
| 1237 DebuggerStackTrace* stack) { | 1238 DebuggerStackTrace* stack) { |
| 1238 String& var_name = String::Handle(); | 1239 String& var_name = String::Handle(); |
| 1239 Instance& value = Instance::Handle(); | 1240 Instance& value = Instance::Handle(); |
| 1240 for (intptr_t i = 0; i < stack->Length(); i++) { | 1241 for (intptr_t i = 0; i < stack->Length(); i++) { |
| 1241 ActivationFrame* frame = stack->ActivationFrameAt(i); | 1242 ActivationFrame* frame = stack->ActivationFrameAt(i); |
| 1242 OS::Print(" %d. %s\n", | 1243 OS::Print(" %"Pd". %s\n", |
| 1243 i + 1, frame->ToCString()); | 1244 i + 1, frame->ToCString()); |
| 1244 intptr_t num_locals = frame->NumLocalVariables(); | 1245 intptr_t num_locals = frame->NumLocalVariables(); |
| 1245 for (intptr_t i = 0; i < num_locals; i++) { | 1246 for (intptr_t i = 0; i < num_locals; i++) { |
| 1246 intptr_t token_pos, end_pos; | 1247 intptr_t token_pos, end_pos; |
| 1247 frame->VariableAt(i, &var_name, &token_pos, &end_pos, &value); | 1248 frame->VariableAt(i, &var_name, &token_pos, &end_pos, &value); |
| 1248 OS::Print(" var %s (pos %d) = %s\n", | 1249 OS::Print(" var %s (pos %"Pd") = %s\n", |
| 1249 var_name.ToCString(), token_pos, value.ToCString()); | 1250 var_name.ToCString(), token_pos, value.ToCString()); |
| 1250 } | 1251 } |
| 1251 } | 1252 } |
| 1252 } | 1253 } |
| 1253 | 1254 |
| 1254 | 1255 |
| 1255 void Debugger::SetBreakpointHandler(BreakpointHandler* handler) { | 1256 void Debugger::SetBreakpointHandler(BreakpointHandler* handler) { |
| 1256 bp_handler_ = handler; | 1257 bp_handler_ = handler; |
| 1257 if (bp_handler_ == NULL) { | 1258 if (bp_handler_ == NULL) { |
| 1258 bp_handler_ = &DefaultBreakpointHandler; | 1259 bp_handler_ = &DefaultBreakpointHandler; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1282 if (ignore_breakpoints_) { | 1283 if (ignore_breakpoints_) { |
| 1283 return; | 1284 return; |
| 1284 } | 1285 } |
| 1285 DebuggerStackTrace* stack_trace = CollectStackTrace(); | 1286 DebuggerStackTrace* stack_trace = CollectStackTrace(); |
| 1286 ASSERT(stack_trace->Length() > 0); | 1287 ASSERT(stack_trace->Length() > 0); |
| 1287 ActivationFrame* top_frame = stack_trace->ActivationFrameAt(0); | 1288 ActivationFrame* top_frame = stack_trace->ActivationFrameAt(0); |
| 1288 ASSERT(top_frame != NULL); | 1289 ASSERT(top_frame != NULL); |
| 1289 CodeBreakpoint* bpt = GetCodeBreakpoint(top_frame->pc()); | 1290 CodeBreakpoint* bpt = GetCodeBreakpoint(top_frame->pc()); |
| 1290 ASSERT(bpt != NULL); | 1291 ASSERT(bpt != NULL); |
| 1291 if (FLAG_verbose_debug) { | 1292 if (FLAG_verbose_debug) { |
| 1292 OS::Print(">>> hit %s breakpoint at %s:%d (Address %p)\n", | 1293 OS::Print(">>> hit %s breakpoint at %s:%"Pd" (Address %#"Px")\n", |
| 1293 bpt->IsInternal() ? "internal" : "user", | 1294 bpt->IsInternal() ? "internal" : "user", |
| 1294 String::Handle(bpt->SourceUrl()).ToCString(), | 1295 String::Handle(bpt->SourceUrl()).ToCString(), |
| 1295 bpt->LineNumber(), | 1296 bpt->LineNumber(), |
| 1296 top_frame->pc()); | 1297 top_frame->pc()); |
| 1297 } | 1298 } |
| 1298 | 1299 |
| 1299 if (!bpt->IsInternal()) { | 1300 if (!bpt->IsInternal()) { |
| 1300 // This is a user-defined breakpoint so we call the breakpoint | 1301 // This is a user-defined breakpoint so we call the breakpoint |
| 1301 // callback even if it is on the same line as the previous breakpoint. | 1302 // callback even if it is on the same line as the previous breakpoint. |
| 1302 last_bpt_line_ = -1; | 1303 last_bpt_line_ = -1; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1565 } | 1566 } |
| 1566 | 1567 |
| 1567 | 1568 |
| 1568 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 1569 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
| 1569 ASSERT(bpt->next() == NULL); | 1570 ASSERT(bpt->next() == NULL); |
| 1570 bpt->set_next(code_breakpoints_); | 1571 bpt->set_next(code_breakpoints_); |
| 1571 code_breakpoints_ = bpt; | 1572 code_breakpoints_ = bpt; |
| 1572 } | 1573 } |
| 1573 | 1574 |
| 1574 } // namespace dart | 1575 } // namespace dart |
| OLD | NEW |