Index: tracing/tracing/extras/importer/trace_event_importer.html |
diff --git a/tracing/tracing/extras/importer/trace_event_importer.html b/tracing/tracing/extras/importer/trace_event_importer.html |
index 6e24d4ac0866eb3fad6c2f5bbdfea7075e3e0f15..9080267565038abad8c2de708a9ef6ad6907d705 100644 |
--- a/tracing/tracing/extras/importer/trace_event_importer.html |
+++ b/tracing/tracing/extras/importer/trace_event_importer.html |
@@ -5,11 +5,12 @@ Use of this source code is governed by a BSD-style license that can be |
found in the LICENSE file. |
--> |
-<link rel="import" href="/tracing/ui/base/color_scheme.html"> |
<link rel="import" href="/tracing/base/quad.html"> |
<link rel="import" href="/tracing/base/range.html"> |
<link rel="import" href="/tracing/base/utils.html"> |
<link rel="import" href="/tracing/base/units/time.html"> |
+<link rel="import" href="/tracing/extras/importer/trace_code_entry.html"> |
+<link rel="import" href="/tracing/extras/importer/v8/codemap.html"> |
<link rel="import" href="/tracing/importer/importer.html"> |
<link rel="import" href="/tracing/model/attribute.html"> |
<link rel="import" href="/tracing/model/comment_box_annotation.html"> |
@@ -23,6 +24,7 @@ found in the LICENSE file. |
<link rel="import" href="/tracing/model/rect_annotation.html"> |
<link rel="import" href="/tracing/model/x_marker_annotation.html"> |
<link rel="import" href="/tracing/model/model.html"> |
+<link rel="import" href="/tracing/ui/base/color_scheme.html"> |
<script> |
'use strict'; |
@@ -32,9 +34,7 @@ found in the LICENSE file. |
* into the provided model. |
*/ |
tr.exportTo('tr.e.importer', function() { |
- |
var Importer = tr.importer.Importer; |
- |
var deepCopy = tr.b.deepCopy; |
function getEventColor(event, opt_customName) { |
@@ -59,11 +59,16 @@ tr.exportTo('tr.e.importer', function() { |
this.battorData_ = undefined; |
this.eventsWereFromString_ = false; |
this.softwareMeasuredCpuCount_ = undefined; |
+ |
this.allAsyncEvents_ = []; |
this.allFlowEvents_ = []; |
this.allObjectEvents_ = []; |
+ |
this.traceEventSampleStackFramesByName_ = {}; |
+ this.v8ProcessCodeMaps_ = {}; |
+ this.v8ProcessRootStackFrame_ = {}; |
+ |
// Dump ID -> {global: (event | undefined), process: [events]} |
this.allMemoryDumpEvents_ = {}; |
@@ -402,6 +407,32 @@ tr.exportTo('tr.e.importer', function() { |
}, |
processInstantEvent: function(event) { |
+ // V8 JIT events are logged as phase 'I' so we need to separate them out |
nduca
2015/08/12 00:22:09
can we file a chromium bug to rename them and assi
nduca
2015/08/12 00:22:09
hoist to its own function?
dsinclair
2015/08/13 14:55:32
Done.
dsinclair
2015/08/13 14:55:33
Rename which, the V8 events? I think JitCodeAdded
|
+ // and handle specially. |
+ if (event.name === 'JitCodeAdded' || event.name === 'JitCodeMoved') { |
+ if (this.v8ProcessCodeMaps_[event.pid] === undefined) |
+ this.v8ProcessCodeMaps_[event.pid] = new tr.e.importer.v8.CodeMap(); |
+ var map = this.v8ProcessCodeMaps_[event.pid]; |
+ |
+ var data = event.args.data; |
+ var start_addr = parseInt(data.code_start, 16); |
+ if (event.name === 'JitCodeMoved') { |
+ try { |
+ map.moveCode(start_addr, parseInt(data.new_code_start, 16)); |
+ } catch (err) { |
+ // Ignore moved error. Means we didn't find the original block. |
+ // We won't know the name in if we try to insert the code here. |
petrcermak
2015/08/12 10:53:24
nit: I don't understand what you mean by "the name
dsinclair
2015/08/13 14:55:32
Done. s/in//
|
+ } |
+ } else { |
+ map.addCode(start_addr, |
+ new tr.e.importer.TraceCodeEntry(data.code_len, data.name)); |
+ } |
+ |
+ // TODO(dsinclair): There are _a lot_ of these so I'm skipping the |
petrcermak
2015/08/12 10:53:24
nit: What do you mean by "these"? "V8 JIT events"?
dsinclair
2015/08/13 14:55:32
Done. Yes, was implying the jit code events that I
|
+ // display for now. Can revisit later if we want to show them. |
petrcermak
2015/08/12 10:53:24
nit: It seems to me (https://code.google.com/p/chr
dsinclair
2015/08/13 14:55:33
Done.
|
+ return; |
+ } |
+ |
// Thread-level instant events are treated as zero-duration slices. |
if (event.s == 't' || event.s === undefined) { |
this.processDurationEvent(event); |
@@ -447,6 +478,92 @@ tr.exportTo('tr.e.importer', function() { |
var thread = this.model_.getOrCreateProcess(event.pid) |
.getOrCreateThread(event.tid); |
+ if (event.name === 'V8Sample') { |
+ var stack = []; |
+ var data = event.args.data; |
+ |
+ var rootStackFrame = this.v8ProcessRootStackFrame_[event.pid]; |
+ if (!rootStackFrame) { |
+ rootStackFrame = new tr.model.StackFrame( |
+ undefined, 'v8-root-stack-frame', |
petrcermak
2015/08/12 10:53:24
Could you please add inline comments to the litera
dsinclair
2015/08/13 14:55:33
Done.
|
+ 'v8', 'v8-root-stack-frame', 0); |
+ this.v8ProcessRootStackFrame_[event.pid] = rootStackFrame; |
+ } |
+ |
+ function findChildWithEntryID(stackFrame, entryID) { |
+ for (var i = 0; i < stackFrame.children.length; i++) { |
petrcermak
2015/08/12 10:53:24
Unless you do this for performance reasons, you co
dsinclair
2015/08/13 14:55:32
I did it for copy-pasta reasons. This is from the
|
+ if (stackFrame.children[i].entryID == entryID) |
petrcermak
2015/08/12 10:53:24
===
dsinclair
2015/08/13 14:55:32
Acknowledged.
|
+ return stackFrame.children[i]; |
+ } |
+ return undefined; |
+ } |
+ |
+ var lastStackFrame = rootStackFrame; |
+ if (data.stack.length > 0 && |
+ this.v8ProcessCodeMaps_[event.pid]) { |
petrcermak
2015/08/12 10:53:24
Could you perhaps add a short comment explaining w
dsinclair
2015/08/13 14:55:33
Done.
|
+ |
+ var map = this.v8ProcessCodeMaps_[event.pid]; |
+ |
+ // Stacks have the leaf node first, flip them around so the root |
+ // comes first. |
+ data.stack = data.stack.reverse(); |
petrcermak
2015/08/12 10:53:24
According to https://developer.mozilla.org/en/docs
dsinclair
2015/08/13 14:55:32
Done.
|
+ for (var i in data.stack) { |
petrcermak
2015/08/12 10:53:24
I think that for ... in ... over arrays is general
dsinclair
2015/08/13 14:55:32
Done.
|
+ var addr = parseInt(data.stack[i], 16); |
+ var entry = map.findEntry(addr); |
+ |
+ if (entry === null) { |
+ entry = { |
+ id: 'unknown', |
+ name: 'unknown', |
+ sourceInfo: undefined |
+ }; |
+ } |
+ |
+ var childFrame = findChildWithEntryID(lastStackFrame, entry.id); |
+ if (!childFrame) { |
+ lastStackFrame = new tr.model.StackFrame( |
+ lastStackFrame, tr.b.GUID.allocate(), |
+ 'v8', entry.name, |
+ tr.ui.b.getColorIdForGeneralPurposeString(entry.name), |
+ entry.sourceInfo); |
+ |
+ lastStackFrame.entryID = entry.id; |
+ |
+ this.model_.addStackFrame(lastStackFrame); |
+ } else { |
+ lastStackFrame = childFrame; |
+ } |
+ |
+ stack.push(entry); |
+ } |
+ } else { |
+ var entry = { |
+ id: data.vm_state, |
+ name: data.vm_state |
+ }; |
+ var childFrame = findChildWithEntryID(lastStackFrame, entry.id); |
petrcermak
2015/08/12 10:53:24
Lines 522-535 and 544-555 seem identical (bar one
dsinclair
2015/08/13 14:55:33
Done.
|
+ if (!childFrame) { |
+ lastStackFrame = new tr.model.StackFrame( |
+ lastStackFrame, tr.b.GUID.allocate(), |
+ 'v8', entry.name, |
+ tr.ui.b.getColorIdForGeneralPurposeString(entry.name)); |
+ lastStackFrame.entryID = entry.id; |
+ |
+ this.model_.addStackFrame(lastStackFrame); |
+ } else { |
+ lastStackFrame = childFrame; |
+ } |
+ } |
+ |
+ var sample = new tr.model.Sample( |
+ undefined /* cpu */, thread, 'V8 Sample', |
+ timestampFromUs(event.ts), lastStackFrame, 1 /* weight */, |
+ this.deepCopyIfNeeded_(event.args)); |
+ this.model_.samples.push(sample); |
+ |
+ return; |
+ } |
+ |
var stackFrame = this.getStackFrameForEvent_(event); |
if (stackFrame === undefined) { |
stackFrame = this.traceEventSampleStackFramesByName_[ |
@@ -463,7 +580,7 @@ tr.exportTo('tr.e.importer', function() { |
} |
var sample = new tr.model.Sample( |
- undefined, thread, 'TRACE_EVENT_SAMPLE', |
+ undefined, thread, 'Trace Event Sample', |
timestampFromUs(event.ts), stackFrame, 1, |
this.deepCopyIfNeeded_(event.args)); |
this.model_.samples.push(sample); |
@@ -570,6 +687,12 @@ tr.exportTo('tr.e.importer', function() { |
}); |
} |
} |
+ |
+ // Remove all the root stack frame children as they should |
+ // already be added. |
+ var keys = Object.keys(this.v8ProcessRootStackFrame_); |
petrcermak
2015/08/12 10:53:24
nit: this is the same as:
tr.b.iterItems(this.v8P
dsinclair
2015/08/13 14:55:33
Done.
|
+ for (var i = 0; i < keys.length; i++) |
+ this.v8ProcessRootStackFrame_[keys[i]].removeAllChildren(); |
}, |
importStackFrames_: function() { |