viztracer 1.1.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of viztracer might be problematic. Click here for more details.
- viztracer/__init__.py +19 -0
- viztracer/__main__.py +8 -0
- viztracer/attach.py +67 -0
- viztracer/attach_process/LICENSE +203 -0
- viztracer/attach_process/__init__.py +0 -0
- viztracer/attach_process/add_code_to_python_process.py +582 -0
- viztracer/attach_process/attach_x86.dll +0 -0
- viztracer/attach_process/inject_dll_amd64.exe +0 -0
- viztracer/attach_process/linux_and_mac/lldb_prepare.py +54 -0
- viztracer/attach_process/run_code_on_dllmain_amd64.dll +0 -0
- viztracer/attach_process/run_code_on_dllmain_x86.dll +0 -0
- viztracer/cellmagic.py +70 -0
- viztracer/code_monkey.py +353 -0
- viztracer/decorator.py +164 -0
- viztracer/event_base.py +81 -0
- viztracer/functree.py +135 -0
- viztracer/html/flamegraph.html +34 -0
- viztracer/html/trace_viewer_embedder.html +203 -0
- viztracer/html/trace_viewer_full.html +10207 -0
- viztracer/main.py +699 -0
- viztracer/modules/eventnode.c +172 -0
- viztracer/modules/eventnode.h +73 -0
- viztracer/modules/pythoncapi_compat.h +1726 -0
- viztracer/modules/quicktime.c +177 -0
- viztracer/modules/quicktime.h +104 -0
- viztracer/modules/snaptrace.c +2205 -0
- viztracer/modules/snaptrace.h +134 -0
- viztracer/modules/snaptrace_member.c +483 -0
- viztracer/modules/util.c +45 -0
- viztracer/modules/util.h +22 -0
- viztracer/modules/vcompressor/vc_dump.c +1131 -0
- viztracer/modules/vcompressor/vc_dump.h +49 -0
- viztracer/modules/vcompressor/vcompressor.c +396 -0
- viztracer/modules/vcompressor/vcompressor.h +15 -0
- viztracer/patch.py +307 -0
- viztracer/report_builder.py +311 -0
- viztracer/snaptrace.cp314-win_amd64.pyd +0 -0
- viztracer/snaptrace.pyi +77 -0
- viztracer/util.py +196 -0
- viztracer/vcompressor.cp314-win_amd64.pyd +0 -0
- viztracer/vcompressor.pyi +10 -0
- viztracer/viewer.py +528 -0
- viztracer/vizcounter.py +20 -0
- viztracer/vizevent.py +31 -0
- viztracer/vizlogging.py +20 -0
- viztracer/vizobject.py +28 -0
- viztracer/vizplugin.py +143 -0
- viztracer/viztracer.py +472 -0
- viztracer/web_dist/LICENSE +189 -0
- viztracer/web_dist/index.html +127 -0
- viztracer/web_dist/service_worker.js +279 -0
- viztracer/web_dist/trace_processor +300 -0
- viztracer/web_dist/v52.0-6b9586def/assets/MaterialSymbolsOutlined.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/Roboto-100.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/Roboto-300.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/Roboto-400.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/Roboto-500.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Light.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Regular.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/RobotoMono-Regular.woff2 +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/brand.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.html +3946 -0
- viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.js +7539 -0
- viztracer/web_dist/v52.0-6b9586def/assets/favicon.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/logo-128.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/logo-3d.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_atrace.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_battery_counters.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_board_voltage.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_coarse.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_fine.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_freq.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_voltage.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_frame_timeline.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_ftrace.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_gpu_mem_total.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_java_heap_dump.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_lmk.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_logcat.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_long_trace.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_mem_hifreq.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_meminfo.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_native_heap_profiler.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_one_shot.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_profiling.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_ps_stats.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_ring_buf.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_syscalls.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/rec_vmstat.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/scheduling_latency.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/assets/vscode-icon.png +0 -0
- viztracer/web_dist/v52.0-6b9586def/engine_bundle.js +3 -0
- viztracer/web_dist/v52.0-6b9586def/frontend_bundle.js +5495 -0
- viztracer/web_dist/v52.0-6b9586def/index.html +127 -0
- viztracer/web_dist/v52.0-6b9586def/manifest.json +52 -0
- viztracer/web_dist/v52.0-6b9586def/perfetto.css +5737 -0
- viztracer/web_dist/v52.0-6b9586def/stdlib_docs.json +1 -0
- viztracer/web_dist/v52.0-6b9586def/trace_config_utils.wasm +0 -0
- viztracer/web_dist/v52.0-6b9586def/trace_processor.wasm +0 -0
- viztracer/web_dist/v52.0-6b9586def/trace_processor_memory64.wasm +0 -0
- viztracer/web_dist/v52.0-6b9586def/traceconv.wasm +0 -0
- viztracer/web_dist/v52.0-6b9586def/traceconv_bundle.js +2 -0
- viztracer-1.1.0.dist-info/METADATA +316 -0
- viztracer-1.1.0.dist-info/RECORD +109 -0
- viztracer-1.1.0.dist-info/WHEEL +5 -0
- viztracer-1.1.0.dist-info/entry_points.txt +3 -0
- viztracer-1.1.0.dist-info/licenses/LICENSE +222 -0
- viztracer-1.1.0.dist-info/licenses/NOTICE.txt +27 -0
- viztracer-1.1.0.dist-info/top_level.txt +1 -0
viztracer/functree.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
|
2
|
+
# For details: https://github.com/gaogaotiantian/viztracer/blob/master/NOTICE.txt
|
|
3
|
+
|
|
4
|
+
import bisect
|
|
5
|
+
import copy
|
|
6
|
+
import re
|
|
7
|
+
from typing import Any, Generator
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FuncTreeNode:
|
|
11
|
+
name_regex = r"(.*) \((.*?):([0-9]+)\)"
|
|
12
|
+
|
|
13
|
+
def __init__(self, event: dict[str, Any] | None = None) -> None:
|
|
14
|
+
self.filename: str | None = None
|
|
15
|
+
self.lineno: int | None = None
|
|
16
|
+
self.is_python: bool | None = False
|
|
17
|
+
self.funcname: str | None = None
|
|
18
|
+
self.parent: FuncTreeNode | None = None
|
|
19
|
+
self.children: list[FuncTreeNode] = []
|
|
20
|
+
self.start: float = - (2 ** 64)
|
|
21
|
+
self.end: float = 2 ** 64
|
|
22
|
+
self.event: dict[str, Any] = {}
|
|
23
|
+
if event is None:
|
|
24
|
+
self.event = {"name": "__ROOT__"}
|
|
25
|
+
self.fullname = "__ROOT__"
|
|
26
|
+
else:
|
|
27
|
+
self.event = copy.copy(event)
|
|
28
|
+
self.start = self.event["ts"]
|
|
29
|
+
self.end = self.event["ts"] + self.event["dur"]
|
|
30
|
+
self.fullname = self.event["name"]
|
|
31
|
+
m = re.match(self.name_regex, self.fullname)
|
|
32
|
+
if m:
|
|
33
|
+
self.is_python = True
|
|
34
|
+
self.funcname = m.group(1)
|
|
35
|
+
self.filename = m.group(2)
|
|
36
|
+
self.lineno = int(m.group(3))
|
|
37
|
+
|
|
38
|
+
def is_ancestor(self, other: "FuncTreeNode") -> bool:
|
|
39
|
+
return self.start < other.start and self.end > other.end
|
|
40
|
+
|
|
41
|
+
def is_same(self, other: "FuncTreeNode") -> bool:
|
|
42
|
+
return (self.fullname == other.fullname
|
|
43
|
+
and len(self.children) == len(other.children)
|
|
44
|
+
and all(t[0].is_same(t[1]) for t in zip(self.children, other.children)))
|
|
45
|
+
|
|
46
|
+
def adopt(self, other: "FuncTreeNode") -> None:
|
|
47
|
+
new_children = []
|
|
48
|
+
if self.is_ancestor(other):
|
|
49
|
+
# Build a list is slow
|
|
50
|
+
# In almost all cases, end_idx should be the last, because that's
|
|
51
|
+
# how we record entries.
|
|
52
|
+
# In many cases, if two entries are siblings, start_idx is the
|
|
53
|
+
# last too.
|
|
54
|
+
# Try to skip building the list by checking these common situations
|
|
55
|
+
# first.
|
|
56
|
+
if not self.children:
|
|
57
|
+
# if it's empty, then both indexes are 0
|
|
58
|
+
start_idx = end_idx = 0
|
|
59
|
+
else:
|
|
60
|
+
if other.start > self.children[-1].start:
|
|
61
|
+
start_idx = len(self.children)
|
|
62
|
+
elif other.start < self.children[0].start:
|
|
63
|
+
start_idx = 0
|
|
64
|
+
else:
|
|
65
|
+
start_array = [n.start for n in self.children]
|
|
66
|
+
start_idx = bisect.bisect(start_array, other.start)
|
|
67
|
+
if other.end > self.children[-1].end:
|
|
68
|
+
end_idx = len(self.children)
|
|
69
|
+
else:
|
|
70
|
+
end_array = [n.end for n in self.children]
|
|
71
|
+
end_idx = bisect.bisect(end_array, other.end)
|
|
72
|
+
if (start_idx == end_idx + 1):
|
|
73
|
+
self.children[end_idx].adopt(other)
|
|
74
|
+
elif (start_idx == end_idx):
|
|
75
|
+
other.parent = self
|
|
76
|
+
self.children.insert(start_idx, other)
|
|
77
|
+
elif (start_idx < end_idx):
|
|
78
|
+
def change_parent(node):
|
|
79
|
+
node.parent = other
|
|
80
|
+
new_children = self.children[start_idx:end_idx]
|
|
81
|
+
# force map to run
|
|
82
|
+
list(map(change_parent, new_children))
|
|
83
|
+
other.children = new_children
|
|
84
|
+
other.parent = self
|
|
85
|
+
self.children = self.children[:start_idx] + [other] + self.children[end_idx:]
|
|
86
|
+
else: # pragma: no cover
|
|
87
|
+
raise Exception("This should not be possible")
|
|
88
|
+
elif self.parent is not None:
|
|
89
|
+
self.parent.adopt(other)
|
|
90
|
+
else: # pragma: no cover
|
|
91
|
+
raise Exception("This should not be possible")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class FuncTree: # pragma: no cover
|
|
95
|
+
def __init__(self, pid: int = 0, tid: int = 0) -> None:
|
|
96
|
+
self.root: FuncTreeNode = FuncTreeNode()
|
|
97
|
+
self.curr: FuncTreeNode = self.root
|
|
98
|
+
self.pid: int = pid
|
|
99
|
+
self.tid: int = tid
|
|
100
|
+
|
|
101
|
+
def is_same(self, other: "FuncTree") -> bool:
|
|
102
|
+
return self.root.is_same(other.root)
|
|
103
|
+
|
|
104
|
+
def add_event(self, event: dict[str, Any]) -> None:
|
|
105
|
+
node = FuncTreeNode(event)
|
|
106
|
+
|
|
107
|
+
self.curr.adopt(node)
|
|
108
|
+
self.curr = node
|
|
109
|
+
|
|
110
|
+
def first_ts(self) -> float:
|
|
111
|
+
return self.root.children[0].event["ts"]
|
|
112
|
+
|
|
113
|
+
def first_node(self) -> FuncTreeNode:
|
|
114
|
+
return self.root.children[0]
|
|
115
|
+
|
|
116
|
+
def node_by_timestamp(self, ts: float) -> FuncTreeNode:
|
|
117
|
+
starts = [node.start for node in self.root.children]
|
|
118
|
+
idx = bisect.bisect(starts, ts)
|
|
119
|
+
if idx == 0:
|
|
120
|
+
return self.root.children[0]
|
|
121
|
+
else:
|
|
122
|
+
return self.root.children[idx - 1]
|
|
123
|
+
|
|
124
|
+
def normalize(self, first_ts: float) -> None:
|
|
125
|
+
for node in self.inorder_traverse():
|
|
126
|
+
node.start -= first_ts
|
|
127
|
+
node.end -= first_ts
|
|
128
|
+
|
|
129
|
+
def inorder_traverse(self) -> Generator[FuncTreeNode, None, None]:
|
|
130
|
+
lst = [self.root]
|
|
131
|
+
while lst:
|
|
132
|
+
ret = lst.pop()
|
|
133
|
+
lst.extend(ret.children[::-1])
|
|
134
|
+
yield ret
|
|
135
|
+
return
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/d3-flame-graph@3.1.1/dist/d3-flamegraph.css">
|
|
3
|
+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
|
|
4
|
+
</head>
|
|
5
|
+
<body>
|
|
6
|
+
<div id="chart" class="container text-center"></div>
|
|
7
|
+
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
|
|
8
|
+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
|
|
9
|
+
<script type="text/javascript" src="https://d3js.org/d3.v4.min.js"></script>
|
|
10
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/d3-flame-graph@3.1.1/dist/d3-flamegraph.min.js"></script>
|
|
11
|
+
<script type="text/javascript">
|
|
12
|
+
var data = $data;
|
|
13
|
+
|
|
14
|
+
var charts = [];
|
|
15
|
+
for (var thread in data) {
|
|
16
|
+
var chart = flamegraph()
|
|
17
|
+
.width(1000)
|
|
18
|
+
.title(thread)
|
|
19
|
+
.minFrameSize(5)
|
|
20
|
+
.resetHeightOnZoom(true)
|
|
21
|
+
.setColorMapper((d, originalColor) =>
|
|
22
|
+
d.highlight ? "#6aff8f" : originalColor)
|
|
23
|
+
.label(function(d) {
|
|
24
|
+
return "name: " + d.data.name + " time: " + d.data.value.toString() + " ns"
|
|
25
|
+
});
|
|
26
|
+
var div = document.createElement("div");
|
|
27
|
+
div.setAttribute("id", thread);
|
|
28
|
+
document.getElementById("chart").appendChild(div);
|
|
29
|
+
d3.select("#" + thread)
|
|
30
|
+
.datum(data[thread])
|
|
31
|
+
.call(chart);
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
</body>
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<!--
|
|
3
|
+
Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
|
4
|
+
Use of this source code is governed by a BSD-style license that can be
|
|
5
|
+
found in the LICENSE file.
|
|
6
|
+
Original LICENSE file:
|
|
7
|
+
https://github.com/catapult-project/catapult/blob/master/tracing/LICENSE
|
|
8
|
+
-->
|
|
9
|
+
<head>
|
|
10
|
+
<!-- WebComponent V0 polyfill. You may want to host this in a more suitable
|
|
11
|
+
place. See https://crbug.com/1036492 -->
|
|
12
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/0.7.24/webcomponents.min.js"></script>
|
|
13
|
+
|
|
14
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/components/prism-core.min.js" integrity="sha512-hqRrGU7ys5tkcqxx5FIZTBb7PkO2o3mU6U5+qB9b55kgMlBUT4J2wPwQfMCxeJW1fC8pBxuatxoH//z0FInhrA==" crossorigin="anonymous"></script>
|
|
15
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/components/prism-python.min.js" integrity="sha512-EXseTM1JV8e3AonU5PfOUmzbPkUTRm4c4hVxv206gVeWZE/FwzSQBNWrUBaHsN3Idq9k76BEjUlXpluX1UFx6Q==" crossorigin="anonymous"></script>
|
|
16
|
+
<script>
|
|
17
|
+
'use strict';
|
|
18
|
+
|
|
19
|
+
function onTraceViewerImportFail() {
|
|
20
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
21
|
+
document.body.textContent =
|
|
22
|
+
'tracing/bin/trace_viewer_full.html is missing. ' +
|
|
23
|
+
'Run vulcanize_trace_viewer from $$TRACE_VIEWER and reload.';
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
</script>
|
|
27
|
+
<!-- <link rel="import" href="trace_viewer_full.html"
|
|
28
|
+
onerror="onTraceViewerImportFail(event)"> -->
|
|
29
|
+
|
|
30
|
+
$trace_viewer_full
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
<style>
|
|
34
|
+
html, body {
|
|
35
|
+
box-sizing: border-box;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
margin: 0px;
|
|
38
|
+
padding: 0;
|
|
39
|
+
width: 100%;
|
|
40
|
+
height: 100%;
|
|
41
|
+
}
|
|
42
|
+
#trace-viewer {
|
|
43
|
+
width: 100%;
|
|
44
|
+
height: 100%;
|
|
45
|
+
}
|
|
46
|
+
#trace-viewer:focus {
|
|
47
|
+
outline: none;
|
|
48
|
+
}
|
|
49
|
+
</style>
|
|
50
|
+
<script>
|
|
51
|
+
'use strict';
|
|
52
|
+
|
|
53
|
+
var json_data;
|
|
54
|
+
(function() {
|
|
55
|
+
let viewer;
|
|
56
|
+
let url;
|
|
57
|
+
let model;
|
|
58
|
+
|
|
59
|
+
// You can set this to true if you want to hide the WebComponentsV0 polyfill
|
|
60
|
+
// warning.
|
|
61
|
+
window.__hideTraceViewerPolyfillWarning = true;
|
|
62
|
+
json_data = $json_data
|
|
63
|
+
|
|
64
|
+
function load() {
|
|
65
|
+
const req = new XMLHttpRequest();
|
|
66
|
+
const isBinary = /[.]gz$$/.test(url) || /[.]zip$$/.test(url);
|
|
67
|
+
req.overrideMimeType('text/plain; charset=x-user-defined');
|
|
68
|
+
req.open('GET', url, true);
|
|
69
|
+
if (isBinary) req.responseType = 'arraybuffer';
|
|
70
|
+
|
|
71
|
+
req.onreadystatechange = function(event) {
|
|
72
|
+
if (req.readyState !== 4) return;
|
|
73
|
+
|
|
74
|
+
window.setTimeout(function() {
|
|
75
|
+
if (req.status === 200) {
|
|
76
|
+
onResult(isBinary ? req.response : req.responseText);
|
|
77
|
+
} else {
|
|
78
|
+
onResultFail(req.status);
|
|
79
|
+
}
|
|
80
|
+
}, 0);
|
|
81
|
+
};
|
|
82
|
+
req.send(null);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function onResultFail(err) {
|
|
86
|
+
const overlay = new tr.ui.b.Overlay();
|
|
87
|
+
overlay.textContent = err + ': ' + url + ' could not be loaded';
|
|
88
|
+
overlay.title = 'Failed to fetch data';
|
|
89
|
+
overlay.visible = true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function onResult(result) {
|
|
93
|
+
model = new tr.Model();
|
|
94
|
+
const i = new tr.importer.Import(model);
|
|
95
|
+
const p = i.importTracesWithProgressDialog([result]);
|
|
96
|
+
p.then(onModelLoaded, onImportFail);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function onModelLoaded() {
|
|
100
|
+
viewer.model = model;
|
|
101
|
+
viewer.viewTitle = url;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function onImportFail(err) {
|
|
105
|
+
const overlay = new tr.ui.b.Overlay();
|
|
106
|
+
overlay.textContent = tr.b.normalizeException(err).message;
|
|
107
|
+
overlay.title = 'Import error';
|
|
108
|
+
overlay.visible = true;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
document.addEventListener('WebComponentsReady', function() {
|
|
112
|
+
const container = document.createElement('track-view-container');
|
|
113
|
+
container.id = 'track_view_container';
|
|
114
|
+
|
|
115
|
+
viewer = document.createElement('tr-ui-timeline-view');
|
|
116
|
+
viewer.track_view_container = container;
|
|
117
|
+
Polymer.dom(viewer).appendChild(container);
|
|
118
|
+
|
|
119
|
+
viewer.id = 'trace-viewer';
|
|
120
|
+
viewer.globalMode = true;
|
|
121
|
+
Polymer.dom(document.body).appendChild(viewer);
|
|
122
|
+
|
|
123
|
+
//url = '../test_data/big_trace.json';
|
|
124
|
+
//load();
|
|
125
|
+
model = new tr.Model();
|
|
126
|
+
const i = new tr.importer.Import(model);
|
|
127
|
+
const p = i.importTracesWithProgressDialog([json_data]);
|
|
128
|
+
p.then(onModelLoaded, onImportFail);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
}());
|
|
132
|
+
|
|
133
|
+
function updateCodeSection() {
|
|
134
|
+
try {
|
|
135
|
+
var viewer = document.getElementById("trace-viewer");
|
|
136
|
+
if (viewer.shadowRoot) {
|
|
137
|
+
var tabRoot = viewer.shadowRoot
|
|
138
|
+
.getElementById("analysis")
|
|
139
|
+
.getElementsByTagName("tr-ui-b-tab-view")[0]
|
|
140
|
+
.shadowRoot
|
|
141
|
+
var threadRoot = tabRoot.getElementById("subView")
|
|
142
|
+
.getElementsByTagName("tr-ui-a-single-thread-slice-sub-view")[0]
|
|
143
|
+
.shadowRoot;
|
|
144
|
+
var table = threadRoot.getElementById("content")
|
|
145
|
+
.shadowRoot
|
|
146
|
+
.getElementById("table")
|
|
147
|
+
var codeViewNode = threadRoot.getElementById("codeView");
|
|
148
|
+
var codeNode = threadRoot.getElementById("code-viewer");
|
|
149
|
+
|
|
150
|
+
var funcName = table.tableRows_[0].value.textContent;
|
|
151
|
+
} else {
|
|
152
|
+
var codeViewNode = document.getElementById("codeView");
|
|
153
|
+
var codeNode = document.getElementById("code-viewer");
|
|
154
|
+
var funcName = document.getElementById("table").tableRows_[0].value.textContent.split("\n")[0];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
resizeCodeSection();
|
|
158
|
+
|
|
159
|
+
codeNode.innerHTML = "Unable to locate the source code";
|
|
160
|
+
var file_data = json_data["file_info"]["functions"][funcName];
|
|
161
|
+
if (file_data) {
|
|
162
|
+
var file_name = file_data[0];
|
|
163
|
+
var lineno = file_data[1];
|
|
164
|
+
var raw_code = json_data["file_info"]["files"][file_name][0];
|
|
165
|
+
var total_lineno = json_data["file_info"]["files"][file_name][1];
|
|
166
|
+
codeNode.innerHTML = raw_code;
|
|
167
|
+
Prism.highlightAll()
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
var portion = 5 + codeNode.offsetHeight * (lineno-1) / total_lineno;
|
|
170
|
+
codeViewNode.scrollTo(0, portion);
|
|
171
|
+
}, 100);
|
|
172
|
+
}
|
|
173
|
+
} catch (error) {
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function resizeCodeSection() {
|
|
178
|
+
try {
|
|
179
|
+
var viewer = document.getElementById("trace-viewer");
|
|
180
|
+
if (viewer.shadowRoot) {
|
|
181
|
+
var tabRoot = viewer.shadowRoot
|
|
182
|
+
.getElementById("analysis")
|
|
183
|
+
.getElementsByTagName("tr-ui-b-tab-view")[0]
|
|
184
|
+
.shadowRoot
|
|
185
|
+
var threadRoot = tabRoot.getElementById("subView")
|
|
186
|
+
.getElementsByTagName("tr-ui-a-single-thread-slice-sub-view")[0]
|
|
187
|
+
.shadowRoot;
|
|
188
|
+
|
|
189
|
+
var height = viewer.shadowRoot.getElementById("analysis").offsetHeight - tabRoot.getElementById("tabs").offsetHeight - 7;
|
|
190
|
+
threadRoot.getElementById("codeView").style.height = height.toString() + "px";
|
|
191
|
+
} else {
|
|
192
|
+
var height = document.getElementById("analysis").offsetHeight - document.getElementById("tabs").offsetHeight - 7;
|
|
193
|
+
document.getElementById("codeView").style.height = height.toString() + "px";
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
</script>
|
|
200
|
+
</head>
|
|
201
|
+
<body>
|
|
202
|
+
</body>
|
|
203
|
+
</html>
|