Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium 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 | 5 |
| 6 WebInspector.TimelineJSProfileProcessor = { }; | 6 WebInspector.TimelineJSProfileProcessor = { }; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * @param {!ProfilerAgent.CPUProfile} jsProfile | 9 * @param {!ProfilerAgent.CPUProfile} jsProfile |
| 10 * @param {!WebInspector.TracingModel.Thread} thread | 10 * @param {!WebInspector.TracingModel.Thread} thread |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 if (depth < lockedDepth) { | 147 if (depth < lockedDepth) { |
| 148 console.error("Child stack is shallower (" + depth + ") than the parent stack (" + lockedDepth + ") at " + time); | 148 console.error("Child stack is shallower (" + depth + ") than the parent stack (" + lockedDepth + ") at " + time); |
| 149 depth = lockedDepth; | 149 depth = lockedDepth; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 if (jsFramesStack.length < depth) { | 152 if (jsFramesStack.length < depth) { |
| 153 console.error("Trying to truncate higher than the current stack size at " + time); | 153 console.error("Trying to truncate higher than the current stack size at " + time); |
| 154 depth = jsFramesStack.length; | 154 depth = jsFramesStack.length; |
| 155 } | 155 } |
| 156 var minFrameDurationMs = currentSamplingIntervalMs / 2; | 156 var minFrameDurationMs = currentSamplingIntervalMs / 2; |
| 157 for (var k = 0; k < depth; ++k) | |
| 158 jsFramesStack[k].setEndTime(time); | |
| 157 for (var k = depth; k < jsFramesStack.length; ++k) | 159 for (var k = depth; k < jsFramesStack.length; ++k) |
| 158 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k]) + minFrameDurationMs, time)); | 160 jsFramesStack[k].setEndTime(Math.min(eventEndTime(jsFramesStack[k]) + minFrameDurationMs, time)); |
| 159 jsFramesStack.length = depth; | 161 jsFramesStack.length = depth; |
| 160 } | 162 } |
| 161 | 163 |
| 162 /** | 164 /** |
| 163 * @param {!Array<!ConsoleAgent.CallFrame>} stack | 165 * @param {!Array<!ConsoleAgent.CallFrame>} stack |
| 164 */ | 166 */ |
| 165 function filterStackFrames(stack) | 167 function filterStackFrames(stack) |
| 166 { | 168 { |
| 167 for (var i = 0, j = 0; i < stack.length; ++i) { | 169 for (var i = 0, j = 0; i < stack.length; ++i) { |
| 168 var url = stack[i].url; | 170 var url = stack[i].url; |
| 169 if (url && url.startsWith("native ")) | 171 if (url && url.startsWith("native ")) |
| 170 continue; | 172 continue; |
| 171 stack[j++] = stack[i]; | 173 stack[j++] = stack[i]; |
| 172 } | 174 } |
| 173 stack.length = j; | 175 stack.length = j; |
| 174 } | 176 } |
| 175 | 177 |
| 176 /** | 178 /** |
| 177 * @param {!WebInspector.TracingModel.Event} e | 179 * @param {!WebInspector.TracingModel.Event} e |
| 178 */ | 180 */ |
| 179 function extractStackTrace(e) | 181 function extractStackTrace(e) |
| 180 { | 182 { |
| 183 var recordTypes = WebInspector.TimelineModel.RecordType; | |
| 181 var eventData = e.args["data"] || e.args["beginData"]; | 184 var eventData = e.args["data"] || e.args["beginData"]; |
| 182 var stackTrace = eventData && eventData["stackTrace"]; | 185 var stackTrace = eventData && eventData["stackTrace"]; |
| 183 var recordTypes = WebInspector.TimelineModel.RecordType; | 186 if (!stackTrace) { |
| 184 // GC events do not hold call stack, so make a copy of the current stack . | 187 stackTrace = jsFramesStack.map(frameEvent => frameEvent.args["data"] ).reverse(); |
| 185 if (e.name === recordTypes.GCEvent || e.name === recordTypes.MajorGC || e.name === recordTypes.MinorGC) | 188 if (eventData && stackTrace.length) |
| 186 stackTrace = jsFramesStack.map(function(frameEvent) { return frameEv ent.args["data"]; }).reverse(); | 189 eventData["stackTrace"] = stackTrace; |
| 187 if (!stackTrace) | 190 } |
| 191 // FIXME(alph): Sometimes there is an extra stack frame with anonymous f unction on top. Remove it. | |
| 192 if (stackTrace.length) { | |
| 193 var topFrame = stackTrace[0]; | |
| 194 if (topFrame.functionName === "" && topFrame.url === "") | |
| 195 stackTrace.splice(0, 1); | |
|
caseq
2016/01/25 19:18:36
stackTrace.shift()? Also, consider moving into the
alph
2016/01/26 00:58:49
Acknowledged.
| |
| 196 } | |
| 197 if (!stackTrace.length) | |
| 188 return; | 198 return; |
| 189 if (filterNativeFunctions) | 199 if (filterNativeFunctions) |
| 190 filterStackFrames(stackTrace); | 200 filterStackFrames(stackTrace); |
| 191 var endTime = eventEndTime(e); | 201 var endTime = eventEndTime(e); |
| 192 var numFrames = stackTrace.length; | 202 var numFrames = stackTrace.length; |
| 193 var minFrames = Math.min(numFrames, jsFramesStack.length); | 203 var minFrames = Math.min(numFrames, jsFramesStack.length); |
| 194 var i; | 204 var i; |
| 195 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { | 205 for (i = lockedJsStackDepth.peekLast() || 0; i < minFrames; ++i) { |
| 196 var newFrame = stackTrace[numFrames - 1 - i]; | 206 var newFrame = stackTrace[numFrames - 1 - i]; |
| 197 var oldFrame = jsFramesStack[i].args["data"]; | 207 var oldFrame = jsFramesStack[i].args["data"]; |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 505 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); | 515 WebInspector.TracingModel.Phase.Instant, e.startTime, e.thread); |
| 506 sampleEvent.ordinal = e.ordinal; | 516 sampleEvent.ordinal = e.ordinal; |
| 507 sampleEvent.args = {"data": {"stackTrace": stack }}; | 517 sampleEvent.args = {"data": {"stackTrace": stack }}; |
| 508 samples.push(sampleEvent); | 518 samples.push(sampleEvent); |
| 509 break; | 519 break; |
| 510 } | 520 } |
| 511 } | 521 } |
| 512 | 522 |
| 513 return samples; | 523 return samples; |
| 514 } | 524 } |
| OLD | NEW |