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 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 v8::debug::BreakRightNow(m_isolate); | 356 v8::debug::BreakRightNow(m_isolate); |
357 } | 357 } |
358 | 358 |
359 void V8Debugger::continueProgram(int targetContextGroupId) { | 359 void V8Debugger::continueProgram(int targetContextGroupId) { |
360 if (m_pausedContextGroupId != targetContextGroupId) return; | 360 if (m_pausedContextGroupId != targetContextGroupId) return; |
361 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); | 361 if (isPaused()) m_inspector->client()->quitMessageLoopOnPause(); |
362 m_pausedContext.Clear(); | 362 m_pausedContext.Clear(); |
363 m_executionState.Clear(); | 363 m_executionState.Clear(); |
364 } | 364 } |
365 | 365 |
| 366 void V8Debugger::breakProgramOnAssert(int targetContextGroupId) { |
| 367 if (!enabled()) return; |
| 368 if (m_pauseOnExceptionsState == v8::debug::NoBreakOnException) return; |
| 369 // Don't allow nested breaks. |
| 370 if (isPaused()) return; |
| 371 if (!canBreakProgram()) return; |
| 372 DCHECK(targetContextGroupId); |
| 373 m_targetContextGroupId = targetContextGroupId; |
| 374 m_scheduledAssertBreak = true; |
| 375 v8::debug::BreakRightNow(m_isolate); |
| 376 } |
| 377 |
366 void V8Debugger::stepIntoStatement(int targetContextGroupId) { | 378 void V8Debugger::stepIntoStatement(int targetContextGroupId) { |
367 DCHECK(isPaused()); | 379 DCHECK(isPaused()); |
368 DCHECK(!m_executionState.IsEmpty()); | 380 DCHECK(!m_executionState.IsEmpty()); |
369 DCHECK(targetContextGroupId); | 381 DCHECK(targetContextGroupId); |
370 m_targetContextGroupId = targetContextGroupId; | 382 m_targetContextGroupId = targetContextGroupId; |
371 v8::debug::PrepareStep(m_isolate, v8::debug::StepIn); | 383 v8::debug::PrepareStep(m_isolate, v8::debug::StepIn); |
372 continueProgram(targetContextGroupId); | 384 continueProgram(targetContextGroupId); |
373 } | 385 } |
374 | 386 |
375 void V8Debugger::stepOverStatement(int targetContextGroupId) { | 387 void V8Debugger::stepOverStatement(int targetContextGroupId) { |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 } | 604 } |
593 m_targetContextGroupId = 0; | 605 m_targetContextGroupId = 0; |
594 if (m_stepIntoAsyncCallback) { | 606 if (m_stepIntoAsyncCallback) { |
595 m_stepIntoAsyncCallback->sendFailure( | 607 m_stepIntoAsyncCallback->sendFailure( |
596 Response::Error("No async tasks were scheduled before pause.")); | 608 Response::Error("No async tasks were scheduled before pause.")); |
597 m_stepIntoAsyncCallback.reset(); | 609 m_stepIntoAsyncCallback.reset(); |
598 } | 610 } |
599 m_breakRequested = false; | 611 m_breakRequested = false; |
600 | 612 |
601 bool scheduledOOMBreak = m_scheduledOOMBreak; | 613 bool scheduledOOMBreak = m_scheduledOOMBreak; |
| 614 bool scheduledAssertBreak = m_scheduledAssertBreak; |
602 auto agentCheck = [&scheduledOOMBreak](V8DebuggerAgentImpl* agent) { | 615 auto agentCheck = [&scheduledOOMBreak](V8DebuggerAgentImpl* agent) { |
603 return agent->enabled() && (scheduledOOMBreak || !agent->skipAllPauses()); | 616 return agent->enabled() && (scheduledOOMBreak || !agent->skipAllPauses()); |
604 }; | 617 }; |
605 | 618 |
606 bool hasAgents = false; | 619 bool hasAgents = false; |
607 m_inspector->forEachSession( | 620 m_inspector->forEachSession( |
608 contextGroupId, | 621 contextGroupId, |
609 [&agentCheck, &hasAgents](V8InspectorSessionImpl* session) { | 622 [&agentCheck, &hasAgents](V8InspectorSessionImpl* session) { |
610 if (agentCheck(session->debuggerAgent())) hasAgents = true; | 623 if (agentCheck(session->debuggerAgent())) hasAgents = true; |
611 }); | 624 }); |
(...skipping 17 matching lines...) Expand all Loading... |
629 } | 642 } |
630 clearContinueToLocation(); | 643 clearContinueToLocation(); |
631 | 644 |
632 DCHECK(contextGroupId); | 645 DCHECK(contextGroupId); |
633 m_pausedContext = pausedContext; | 646 m_pausedContext = pausedContext; |
634 m_executionState = executionState; | 647 m_executionState = executionState; |
635 m_pausedContextGroupId = contextGroupId; | 648 m_pausedContextGroupId = contextGroupId; |
636 | 649 |
637 m_inspector->forEachSession( | 650 m_inspector->forEachSession( |
638 contextGroupId, [&agentCheck, &pausedContext, &exception, &breakpointIds, | 651 contextGroupId, [&agentCheck, &pausedContext, &exception, &breakpointIds, |
639 &isPromiseRejection, &isUncaught, | 652 &isPromiseRejection, &isUncaught, &scheduledOOMBreak, |
640 &scheduledOOMBreak](V8InspectorSessionImpl* session) { | 653 &scheduledAssertBreak](V8InspectorSessionImpl* session) { |
641 if (agentCheck(session->debuggerAgent())) { | 654 if (agentCheck(session->debuggerAgent())) { |
642 session->debuggerAgent()->didPause( | 655 session->debuggerAgent()->didPause( |
643 InspectedContext::contextId(pausedContext), exception, | 656 InspectedContext::contextId(pausedContext), exception, |
644 breakpointIds, isPromiseRejection, isUncaught, scheduledOOMBreak); | 657 breakpointIds, isPromiseRejection, isUncaught, scheduledOOMBreak, |
| 658 scheduledAssertBreak); |
645 } | 659 } |
646 }); | 660 }); |
647 { | 661 { |
648 v8::Context::Scope scope(pausedContext); | 662 v8::Context::Scope scope(pausedContext); |
649 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); | 663 v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); |
650 CHECK(!context.IsEmpty() && | 664 CHECK(!context.IsEmpty() && |
651 context != v8::debug::GetDebugContext(m_isolate)); | 665 context != v8::debug::GetDebugContext(m_isolate)); |
652 m_inspector->client()->runMessageLoopOnPause(contextGroupId); | 666 m_inspector->client()->runMessageLoopOnPause(contextGroupId); |
653 m_pausedContextGroupId = 0; | 667 m_pausedContextGroupId = 0; |
654 } | 668 } |
655 m_inspector->forEachSession(contextGroupId, | 669 m_inspector->forEachSession(contextGroupId, |
656 [](V8InspectorSessionImpl* session) { | 670 [](V8InspectorSessionImpl* session) { |
657 if (session->debuggerAgent()->enabled()) | 671 if (session->debuggerAgent()->enabled()) |
658 session->debuggerAgent()->didContinue(); | 672 session->debuggerAgent()->didContinue(); |
659 }); | 673 }); |
660 | 674 |
661 if (m_scheduledOOMBreak) m_isolate->RestoreOriginalHeapLimit(); | 675 if (m_scheduledOOMBreak) m_isolate->RestoreOriginalHeapLimit(); |
662 m_scheduledOOMBreak = false; | 676 m_scheduledOOMBreak = false; |
| 677 m_scheduledAssertBreak = false; |
663 m_pausedContext.Clear(); | 678 m_pausedContext.Clear(); |
664 m_executionState.Clear(); | 679 m_executionState.Clear(); |
665 } | 680 } |
666 | 681 |
667 void V8Debugger::v8OOMCallback(void* data) { | 682 void V8Debugger::v8OOMCallback(void* data) { |
668 V8Debugger* thisPtr = static_cast<V8Debugger*>(data); | 683 V8Debugger* thisPtr = static_cast<V8Debugger*>(data); |
669 thisPtr->m_isolate->IncreaseHeapLimitForDebugging(); | 684 thisPtr->m_isolate->IncreaseHeapLimitForDebugging(); |
670 thisPtr->m_scheduledOOMBreak = true; | 685 thisPtr->m_scheduledOOMBreak = true; |
671 v8::Local<v8::Context> context = thisPtr->m_isolate->GetEnteredContext(); | 686 v8::Local<v8::Context> context = thisPtr->m_isolate->GetEnteredContext(); |
672 DCHECK(!context.IsEmpty()); | 687 DCHECK(!context.IsEmpty()); |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 fprintf(stdout, "Async stacks count: %d\n", m_asyncStacksCount); | 1208 fprintf(stdout, "Async stacks count: %d\n", m_asyncStacksCount); |
1194 fprintf(stdout, "Scheduled async tasks: %zu\n", m_asyncTaskStacks.size()); | 1209 fprintf(stdout, "Scheduled async tasks: %zu\n", m_asyncTaskStacks.size()); |
1195 fprintf(stdout, "Created async tasks: %zu\n", | 1210 fprintf(stdout, "Created async tasks: %zu\n", |
1196 m_asyncTaskCreationStacks.size()); | 1211 m_asyncTaskCreationStacks.size()); |
1197 fprintf(stdout, "Async tasks with parent: %zu\n", m_parentTask.size()); | 1212 fprintf(stdout, "Async tasks with parent: %zu\n", m_parentTask.size()); |
1198 fprintf(stdout, "Recurring async tasks: %zu\n", m_recurringTasks.size()); | 1213 fprintf(stdout, "Recurring async tasks: %zu\n", m_recurringTasks.size()); |
1199 fprintf(stdout, "\n"); | 1214 fprintf(stdout, "\n"); |
1200 } | 1215 } |
1201 | 1216 |
1202 } // namespace v8_inspector | 1217 } // namespace v8_inspector |
OLD | NEW |