Chromium Code Reviews| Index: src/debug/debug.cc |
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
| index 42192b0b5340bebf36e94fadd38b1862c2241831..718bb2d097c4865e5aa99855726955306c5ed51c 100644 |
| --- a/src/debug/debug.cc |
| +++ b/src/debug/debug.cc |
| @@ -1853,6 +1853,10 @@ void Debug::OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue) { |
| // Bail out if there is no listener for this event |
| if (ignore_events()) return; |
| +#ifdef DEBUG |
| + PrintBreakLocation(); |
| +#endif // DEBUG |
| + |
| HandleScope scope(isolate_); |
| // Create the event data object. |
| Handle<Object> event_data; |
| @@ -2314,6 +2318,45 @@ void Debug::ProcessDebugMessages(bool debug_command_only) { |
| OnDebugBreak(isolate_->factory()->undefined_value(), debug_command_only); |
| } |
| +#ifdef DEBUG |
| +void Debug::PrintBreakLocation() { |
| + if (!FLAG_print_break_location) return; |
| + HandleScope scope(isolate_); |
| + JavaScriptFrameIterator iterator(isolate_); |
| + if (iterator.done()) return; |
| + JavaScriptFrame* frame = iterator.frame(); |
| + FrameSummary summary = GetFirstFrameSummary(frame); |
| + int source_position = |
| + summary.abstract_code()->SourcePosition(summary.code_offset()); |
| + Handle<Object> script_obj(summary.function()->shared()->script(), isolate_); |
| + PrintF("[debug] break in function '"); |
| + summary.function()->PrintName(); |
| + PrintF("'.\n"); |
| + if (script_obj->IsScript()) { |
| + Handle<Script> script = Handle<Script>::cast(script_obj); |
| + Handle<String> source(String::cast(script->source())); |
| + Script::InitLineEnds(script); |
| + int line = Script::GetLineNumber(script, source_position); |
| + int column = Script::GetColumnNumber(script, source_position); |
| + Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends())); |
| + int line_start = |
| + line == 0 ? 0 : Smi::cast(line_ends->get(line - 1))->value(); |
| + int line_end = Smi::cast(line_ends->get(line))->value(); |
| + DisallowHeapAllocation no_gc; |
| + String::FlatContent content = source->GetFlatContent(); |
| + if (content.IsOneByte()) { |
| + PrintF("[debug] %.*s\n", line_end - line_start, |
| + content.ToOneByteVector().start() + line_start); |
| + PrintF("[debug] "); |
| + for (int i = 0; i < column; i++) PrintF(" "); |
| + PrintF("^\n"); |
| + return; |
|
vogelheim
2016/02/25 10:42:47
super nitpick: Maybe remove? return in this branch
|
| + } else { |
| + PrintF("[debug] at line %d column %d\n", line, column); |
| + } |
| + } |
| +} |
| +#endif // DEBUG |
| DebugScope::DebugScope(Debug* debug) |
| : debug_(debug), |