| 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 |