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

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

Issue 2648873002: [inspector] added creation frame for async call chains for promises (Closed)
Patch Set: fixed usage of external reference 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
Index: src/inspector/v8-debugger.cc
diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc
index 0f8eaf640f32582219e7a98f5aa4eb393c3d9216..b764dd5aa5c7bee9163b3238d75f76f891df0051 100644
--- a/src/inspector/v8-debugger.cc
+++ b/src/inspector/v8-debugger.cc
@@ -571,6 +571,9 @@ void V8Debugger::PromiseEventOccurred(v8::debug::PromiseDebugActionType type,
// namespace of such ids, managed by src/js/promise.js.
void* ptr = reinterpret_cast<void*>(id * 2 + 1);
switch (type) {
+ case v8::debug::kDebugPromiseCreated:
+ asyncTaskCreated(ptr);
+ break;
case v8::debug::kDebugEnqueueAsyncFunction:
asyncTaskScheduled("async function", ptr, true);
break;
@@ -858,6 +861,30 @@ 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) {
+ if (!m_maxAsyncCallStackDepth) return;
+ v8::HandleScope scope(m_isolate);
+ std::unique_ptr<V8StackTraceImpl> chain =
+ V8StackTraceImpl::capture(this, 0, 1, String16());
dgozman 2017/01/24 01:02:41 Comment that we don't need contextgroupid.
kozy 2017/01/24 21:43:39 Done.
+ if (chain) {
+ String16 s = chain->buildInspectorObjectImpl()->serialize();
dgozman 2017/01/24 01:02:41 Remove.
kozy 2017/01/24 21:43:39 Done.
+ m_asyncTaskCreatedStacks[task] = std::move(chain);
dgozman 2017/01/24 01:02:41 Should we do this after registering?
kozy 2017/01/24 21:43:39 it should be called after, otherwise we could canc
+ registerAsyncTaskIfNeeded(task);
+ }
+}
+
void V8Debugger::asyncTaskScheduled(const StringView& taskName, void* task,
bool recurring) {
if (!m_maxAsyncCallStackDepth) return;
@@ -872,25 +899,23 @@ void V8Debugger::asyncTaskScheduled(const String16& taskName, void* task,
m_isolate->InContext()
? m_inspector->contextGroupId(m_isolate->GetCurrentContext())
: 0;
+ auto itCreation = m_asyncTaskCreatedStacks.find(task);
std::unique_ptr<V8StackTraceImpl> chain = V8StackTraceImpl::capture(
this, contextGroupId, V8StackTraceImpl::maxCallStackSizeToCapture,
- taskName);
+ taskName, itCreation != m_asyncTaskCreatedStacks.end()
+ ? itCreation->second->cloneImpl()
+ : nullptr);
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);
}
}
void V8Debugger::asyncTaskCanceled(void* task) {
if (!m_maxAsyncCallStackDepth) return;
m_asyncTaskStacks.erase(task);
+ m_asyncTaskCreatedStacks.erase(task);
m_recurringTasks.erase(task);
auto it = m_taskToId.find(task);
if (it == m_taskToId.end()) return;
@@ -926,6 +951,7 @@ void V8Debugger::asyncTaskFinished(void* task) {
m_currentStacks.pop_back();
if (m_recurringTasks.find(task) == m_recurringTasks.end()) {
m_asyncTaskStacks.erase(task);
+ m_asyncTaskCreatedStacks.erase(task);
dgozman 2017/01/24 01:02:41 Let's call asyncTaskCanceled here?
kozy 2017/01/24 21:43:39 Done.
auto it = m_taskToId.find(task);
if (it == m_taskToId.end()) return;
m_idToTask.erase(it->second);
@@ -935,6 +961,7 @@ void V8Debugger::asyncTaskFinished(void* task) {
void V8Debugger::allAsyncTasksCanceled() {
m_asyncTaskStacks.clear();
+ m_asyncTaskCreatedStacks.clear();
m_recurringTasks.clear();
m_currentStacks.clear();
m_currentTasks.clear();

Powered by Google App Engine
This is Rietveld 408576698