Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(601)

Unified Diff: src/inspector/v8-debugger.cc

Issue 2648873002: [inspector] added creation frame for async call chains for promises (Closed)
Patch Set: add test for setTimeout Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/inspector/v8-debugger.h ('k') | src/inspector/v8-stack-trace-impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/inspector/v8-debugger.cc
diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc
index 8fa5245b3557a844245e7607d9f4e3d83930f07c..5c26db3473b4f8760afa7ee133d1d029c3223977 100644
--- a/src/inspector/v8-debugger.cc
+++ b/src/inspector/v8-debugger.cc
@@ -858,9 +858,32 @@ void V8Debugger::setAsyncCallStackDepth(V8DebuggerAgentImpl* agent, int depth) {
if (!maxAsyncCallStackDepth) allAsyncTasksCanceled();
}
+void V8Debugger::registerAsyncTaskIfNeeded(void* task) {
+ if (m_taskToId.find(task) != m_taskToId.end()) return;
+
+ int id = ++m_lastTaskId;
+ m_taskToId[task] = id;
+ m_idToTask[id] = task;
+ if (static_cast<int>(m_idToTask.size()) > m_maxAsyncCallStacks) {
+ void* taskToRemove = m_idToTask.begin()->second;
+ asyncTaskCanceled(taskToRemove);
+ }
+}
+
void V8Debugger::asyncTaskCreated(void* task, void* parentTask) {
if (!m_maxAsyncCallStackDepth) return;
if (parentTask) m_parentTask[task] = parentTask;
+ v8::HandleScope scope(m_isolate);
+ // We don't need to pass context group id here because we gets this callback
+ // from V8 for promise events only.
+ // Passing one as maxStackSize forces no async chain for the new stack and
+ // allows us to not grow exponentially.
+ std::unique_ptr<V8StackTraceImpl> creationStack =
+ V8StackTraceImpl::capture(this, 0, 1, String16());
+ if (creationStack && !creationStack->isEmpty()) {
+ m_asyncTaskCreationStacks[task] = std::move(creationStack);
+ registerAsyncTaskIfNeeded(task);
+ }
}
void V8Debugger::asyncTaskScheduled(const StringView& taskName, void* task,
@@ -883,13 +906,7 @@ void V8Debugger::asyncTaskScheduled(const String16& taskName, void* task,
if (chain) {
m_asyncTaskStacks[task] = std::move(chain);
if (recurring) m_recurringTasks.insert(task);
- int id = ++m_lastTaskId;
- m_taskToId[task] = id;
- m_idToTask[id] = task;
- if (static_cast<int>(m_idToTask.size()) > m_maxAsyncCallStacks) {
- void* taskToRemove = m_idToTask.begin()->second;
- asyncTaskCanceled(taskToRemove);
- }
+ registerAsyncTaskIfNeeded(task);
}
}
@@ -898,6 +915,7 @@ void V8Debugger::asyncTaskCanceled(void* task) {
m_asyncTaskStacks.erase(task);
m_recurringTasks.erase(task);
m_parentTask.erase(task);
+ m_asyncTaskCreationStacks.erase(task);
auto it = m_taskToId.find(task);
if (it == m_taskToId.end()) return;
m_idToTask.erase(it->second);
@@ -920,6 +938,10 @@ void V8Debugger::asyncTaskStarted(void* task) {
std::unique_ptr<V8StackTraceImpl> stack;
if (stackIt != m_asyncTaskStacks.end() && stackIt->second)
stack = stackIt->second->cloneImpl();
+ auto itCreation = m_asyncTaskCreationStacks.find(task);
+ if (stack && itCreation != m_asyncTaskCreationStacks.end()) {
+ stack->setCreation(itCreation->second->cloneImpl());
+ }
m_currentStacks.push_back(std::move(stack));
}
@@ -943,6 +965,7 @@ void V8Debugger::allAsyncTasksCanceled() {
m_currentStacks.clear();
m_currentTasks.clear();
m_parentTask.clear();
+ m_asyncTaskCreationStacks.clear();
m_idToTask.clear();
m_taskToId.clear();
m_lastTaskId = 0;
« no previous file with comments | « src/inspector/v8-debugger.h ('k') | src/inspector/v8-stack-trace-impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698