OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/inspector/v8-debugger.h" | 5 #include "src/inspector/v8-debugger.h" |
6 | 6 |
7 #include "src/inspector/debugger-script.h" | 7 #include "src/inspector/debugger-script.h" |
8 #include "src/inspector/inspected-context.h" | 8 #include "src/inspector/inspected-context.h" |
9 #include "src/inspector/protocol/Protocol.h" | 9 #include "src/inspector/protocol/Protocol.h" |
10 #include "src/inspector/script-breakpoint.h" | 10 #include "src/inspector/script-breakpoint.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 return function->Call(context, debuggerScript, argc, argv); | 165 return function->Call(context, debuggerScript, argc, argv); |
166 } | 166 } |
167 return function->Call(context, debuggerScript, argc, argv); | 167 return function->Call(context, debuggerScript, argc, argv); |
168 } | 168 } |
169 | 169 |
170 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) | 170 V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) |
171 : m_isolate(isolate), | 171 : m_isolate(isolate), |
172 m_inspector(inspector), | 172 m_inspector(inspector), |
173 m_enableCount(0), | 173 m_enableCount(0), |
174 m_breakpointsActivated(true), | 174 m_breakpointsActivated(true), |
175 m_runningNestedMessageLoop(false), | |
176 m_ignoreScriptParsedEventsCounter(0), | 175 m_ignoreScriptParsedEventsCounter(0), |
177 m_maxAsyncCallStacks(kMaxAsyncTaskStacks), | 176 m_maxAsyncCallStacks(kMaxAsyncTaskStacks), |
178 m_maxAsyncCallStackDepth(0), | 177 m_maxAsyncCallStackDepth(0), |
179 m_pauseOnExceptionsState(v8::debug::NoBreakOnException), | 178 m_pauseOnExceptionsState(v8::debug::NoBreakOnException), |
180 m_wasmTranslation(isolate) {} | 179 m_wasmTranslation(isolate) {} |
181 | 180 |
182 V8Debugger::~V8Debugger() {} | 181 V8Debugger::~V8Debugger() {} |
183 | 182 |
184 void V8Debugger::enable() { | 183 void V8Debugger::enable() { |
185 if (m_enableCount++) return; | 184 if (m_enableCount++) return; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 return !v8::debug::AllFramesOnStackAreBlackboxed(m_isolate); | 354 return !v8::debug::AllFramesOnStackAreBlackboxed(m_isolate); |
356 } | 355 } |
357 | 356 |
358 void V8Debugger::breakProgram() { | 357 void V8Debugger::breakProgram() { |
359 // Don't allow nested breaks. | 358 // Don't allow nested breaks. |
360 if (isPaused()) return; | 359 if (isPaused()) return; |
361 if (!canBreakProgram()) return; | 360 if (!canBreakProgram()) return; |
362 v8::debug::BreakRightNow(m_isolate); | 361 v8::debug::BreakRightNow(m_isolate); |
363 } | 362 } |
364 | 363 |
365 void V8Debugger::continueProgram() { | 364 void V8Debugger::continueProgram(int targetContextGroupId) { |
| 365 if (m_pausedContextGroupId != targetContextGroupId) return; |
366 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); | 366 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); |
367 m_pausedContext.Clear(); | 367 m_pausedContext.Clear(); |
368 m_executionState.Clear(); | 368 m_executionState.Clear(); |
369 } | 369 } |
370 | 370 |
371 void V8Debugger::stepIntoStatement(int targetContextGroupId) { | 371 void V8Debugger::stepIntoStatement(int targetContextGroupId) { |
372 DCHECK(isPaused()); | 372 DCHECK(isPaused()); |
373 DCHECK(!m_executionState.IsEmpty()); | 373 DCHECK(!m_executionState.IsEmpty()); |
374 DCHECK(targetContextGroupId); | 374 DCHECK(targetContextGroupId); |
375 m_targetContextGroupId = targetContextGroupId; | 375 m_targetContextGroupId = targetContextGroupId; |
376 v8::debug::PrepareStep(m_isolate, v8::debug::StepIn); | 376 v8::debug::PrepareStep(m_isolate, v8::debug::StepIn); |
377 continueProgram(); | 377 continueProgram(targetContextGroupId); |
378 } | 378 } |
379 | 379 |
380 void V8Debugger::stepOverStatement(int targetContextGroupId) { | 380 void V8Debugger::stepOverStatement(int targetContextGroupId) { |
381 DCHECK(isPaused()); | 381 DCHECK(isPaused()); |
382 DCHECK(!m_executionState.IsEmpty()); | 382 DCHECK(!m_executionState.IsEmpty()); |
383 DCHECK(targetContextGroupId); | 383 DCHECK(targetContextGroupId); |
384 m_targetContextGroupId = targetContextGroupId; | 384 m_targetContextGroupId = targetContextGroupId; |
385 v8::debug::PrepareStep(m_isolate, v8::debug::StepNext); | 385 v8::debug::PrepareStep(m_isolate, v8::debug::StepNext); |
386 continueProgram(); | 386 continueProgram(targetContextGroupId); |
387 } | 387 } |
388 | 388 |
389 void V8Debugger::stepOutOfFunction(int targetContextGroupId) { | 389 void V8Debugger::stepOutOfFunction(int targetContextGroupId) { |
390 DCHECK(isPaused()); | 390 DCHECK(isPaused()); |
391 DCHECK(!m_executionState.IsEmpty()); | 391 DCHECK(!m_executionState.IsEmpty()); |
392 DCHECK(targetContextGroupId); | 392 DCHECK(targetContextGroupId); |
393 m_targetContextGroupId = targetContextGroupId; | 393 m_targetContextGroupId = targetContextGroupId; |
394 v8::debug::PrepareStep(m_isolate, v8::debug::StepOut); | 394 v8::debug::PrepareStep(m_isolate, v8::debug::StepOut); |
395 continueProgram(); | 395 continueProgram(targetContextGroupId); |
396 } | 396 } |
397 | 397 |
398 void V8Debugger::scheduleStepIntoAsync( | 398 void V8Debugger::scheduleStepIntoAsync( |
399 std::unique_ptr<ScheduleStepIntoAsyncCallback> callback, | 399 std::unique_ptr<ScheduleStepIntoAsyncCallback> callback, |
400 int targetContextGroupId) { | 400 int targetContextGroupId) { |
401 DCHECK(isPaused()); | 401 DCHECK(isPaused()); |
402 DCHECK(!m_executionState.IsEmpty()); | 402 DCHECK(!m_executionState.IsEmpty()); |
403 DCHECK(targetContextGroupId); | 403 DCHECK(targetContextGroupId); |
404 if (m_stepIntoAsyncCallback) { | 404 if (m_stepIntoAsyncCallback) { |
405 m_stepIntoAsyncCallback->sendFailure(Response::Error( | 405 m_stepIntoAsyncCallback->sendFailure(Response::Error( |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 v8::Local<v8::Value> hitBreakpointNumber = | 561 v8::Local<v8::Value> hitBreakpointNumber = |
562 hitBreakpointNumbers->Get(debuggerContext(), i).ToLocalChecked(); | 562 hitBreakpointNumbers->Get(debuggerContext(), i).ToLocalChecked(); |
563 DCHECK(hitBreakpointNumber->IsInt32()); | 563 DCHECK(hitBreakpointNumber->IsInt32()); |
564 breakpointIds.push_back(String16::fromInteger( | 564 breakpointIds.push_back(String16::fromInteger( |
565 hitBreakpointNumber->Int32Value(debuggerContext()).FromJust())); | 565 hitBreakpointNumber->Int32Value(debuggerContext()).FromJust())); |
566 } | 566 } |
567 } | 567 } |
568 | 568 |
569 m_pausedContext = pausedContext; | 569 m_pausedContext = pausedContext; |
570 m_executionState = executionState; | 570 m_executionState = executionState; |
571 m_runningNestedMessageLoop = true; | 571 m_pausedContextGroupId = contextGroupId; |
572 agent->didPause(InspectedContext::contextId(pausedContext), exception, | 572 agent->didPause(InspectedContext::contextId(pausedContext), exception, |
573 breakpointIds, isPromiseRejection, isUncaught, | 573 breakpointIds, isPromiseRejection, isUncaught, |
574 m_scheduledOOMBreak); | 574 m_scheduledOOMBreak); |
575 int groupId = m_inspector->contextGroupId(pausedContext); | 575 int groupId = m_inspector->contextGroupId(pausedContext); |
576 DCHECK(groupId); | 576 DCHECK(groupId); |
577 { | 577 { |
578 v8::Context::Scope scope(pausedContext); | 578 v8::Context::Scope scope(pausedContext); |
579 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); | 579 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); |
580 CHECK(!context.IsEmpty() && | 580 CHECK(!context.IsEmpty() && |
581 context != v8::debug::GetDebugContext(m_isolate)); | 581 context != v8::debug::GetDebugContext(m_isolate)); |
582 m_inspector->client()->runMessageLoopOnPause(groupId); | 582 m_inspector->client()->runMessageLoopOnPause(groupId); |
583 m_runningNestedMessageLoop = false; | 583 m_pausedContextGroupId = 0; |
584 } | 584 } |
585 // The agent may have been removed in the nested loop. | 585 // The agent may have been removed in the nested loop. |
586 agent = m_inspector->enabledDebuggerAgentForGroup(groupId); | 586 agent = m_inspector->enabledDebuggerAgentForGroup(groupId); |
587 if (agent) agent->didContinue(); | 587 if (agent) agent->didContinue(); |
588 if (m_scheduledOOMBreak) m_isolate->RestoreOriginalHeapLimit(); | 588 if (m_scheduledOOMBreak) m_isolate->RestoreOriginalHeapLimit(); |
589 m_scheduledOOMBreak = false; | 589 m_scheduledOOMBreak = false; |
590 m_pausedContext.Clear(); | 590 m_pausedContext.Clear(); |
591 m_executionState.Clear(); | 591 m_executionState.Clear(); |
592 } | 592 } |
593 | 593 |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1077 fprintf(stdout, "Async stacks count: %d\n", m_asyncStacksCount); | 1077 fprintf(stdout, "Async stacks count: %d\n", m_asyncStacksCount); |
1078 fprintf(stdout, "Scheduled async tasks: %zu\n", m_asyncTaskStacks.size()); | 1078 fprintf(stdout, "Scheduled async tasks: %zu\n", m_asyncTaskStacks.size()); |
1079 fprintf(stdout, "Created async tasks: %zu\n", | 1079 fprintf(stdout, "Created async tasks: %zu\n", |
1080 m_asyncTaskCreationStacks.size()); | 1080 m_asyncTaskCreationStacks.size()); |
1081 fprintf(stdout, "Async tasks with parent: %zu\n", m_parentTask.size()); | 1081 fprintf(stdout, "Async tasks with parent: %zu\n", m_parentTask.size()); |
1082 fprintf(stdout, "Recurring async tasks: %zu\n", m_recurringTasks.size()); | 1082 fprintf(stdout, "Recurring async tasks: %zu\n", m_recurringTasks.size()); |
1083 fprintf(stdout, "\n"); | 1083 fprintf(stdout, "\n"); |
1084 } | 1084 } |
1085 | 1085 |
1086 } // namespace v8_inspector | 1086 } // namespace v8_inspector |
OLD | NEW |