viztracer 1.1.1__cp313-cp313-win32.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.
- 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 +701 -0
- viztracer/modules/eventnode.c +188 -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 +2207 -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 +317 -0
- viztracer/report_builder.py +311 -0
- viztracer/snaptrace.cp313-win32.pyd +0 -0
- viztracer/snaptrace.pyi +77 -0
- viztracer/util.py +196 -0
- viztracer/vcompressor.cp313-win32.pyd +0 -0
- viztracer/vcompressor.pyi +10 -0
- viztracer/viewer.py +529 -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.1.dist-info/METADATA +326 -0
- viztracer-1.1.1.dist-info/RECORD +109 -0
- viztracer-1.1.1.dist-info/WHEEL +5 -0
- viztracer-1.1.1.dist-info/entry_points.txt +3 -0
- viztracer-1.1.1.dist-info/licenses/LICENSE +222 -0
- viztracer-1.1.1.dist-info/licenses/NOTICE.txt +27 -0
- viztracer-1.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,188 @@
|
|
|
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
|
+
#include <Python.h>
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
|
|
7
|
+
#include "pythoncapi_compat.h"
|
|
8
|
+
#include "eventnode.h"
|
|
9
|
+
|
|
10
|
+
void
|
|
11
|
+
clear_node(struct EventNode* node) {
|
|
12
|
+
switch (node->ntype) {
|
|
13
|
+
case FEE_NODE:
|
|
14
|
+
if (node->data.fee.type == PyTrace_CALL || node->data.fee.type == PyTrace_RETURN) {
|
|
15
|
+
Py_CLEAR(node->data.fee.code);
|
|
16
|
+
Py_CLEAR(node->data.fee.args);
|
|
17
|
+
Py_CLEAR(node->data.fee.retval);
|
|
18
|
+
} else {
|
|
19
|
+
node->data.fee.ml_name = NULL;
|
|
20
|
+
if (node->data.fee.m_module) {
|
|
21
|
+
// The function belongs to a module
|
|
22
|
+
Py_CLEAR(node->data.fee.m_module);
|
|
23
|
+
} else {
|
|
24
|
+
// The function is a class method
|
|
25
|
+
if (node->data.fee.tp_name) {
|
|
26
|
+
// It's not a static method, has __self__
|
|
27
|
+
node->data.fee.tp_name = NULL;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
Py_CLEAR(node->data.fee.asyncio_task);
|
|
32
|
+
break;
|
|
33
|
+
case INSTANT_NODE:
|
|
34
|
+
Py_CLEAR(node->data.instant.name);
|
|
35
|
+
Py_CLEAR(node->data.instant.args);
|
|
36
|
+
Py_CLEAR(node->data.instant.scope);
|
|
37
|
+
break;
|
|
38
|
+
case COUNTER_NODE:
|
|
39
|
+
Py_CLEAR(node->data.counter.name);
|
|
40
|
+
Py_CLEAR(node->data.counter.args);
|
|
41
|
+
break;
|
|
42
|
+
case OBJECT_NODE:
|
|
43
|
+
Py_CLEAR(node->data.object.ph);
|
|
44
|
+
Py_CLEAR(node->data.object.id);
|
|
45
|
+
Py_CLEAR(node->data.object.name);
|
|
46
|
+
Py_CLEAR(node->data.object.args);
|
|
47
|
+
break;
|
|
48
|
+
case RAW_NODE:
|
|
49
|
+
Py_CLEAR(node->data.raw);
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
printf("Unknown Node Type When Clearing!\n");
|
|
53
|
+
exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// This will return a PyUnicode object to the caller
|
|
58
|
+
// The caller is responsible to decrease the reference
|
|
59
|
+
// name_set is an initialized set to keep
|
|
60
|
+
// formatted names to save memory
|
|
61
|
+
PyObject*
|
|
62
|
+
get_name_from_fee_node(struct EventNode* node, PyObject* name_dict)
|
|
63
|
+
{
|
|
64
|
+
assert(PyDict_Check(name_dict));
|
|
65
|
+
|
|
66
|
+
PyObject* name = NULL;
|
|
67
|
+
PyObject* ret = NULL;
|
|
68
|
+
|
|
69
|
+
// We create the name first. However, this name might already exists
|
|
70
|
+
// before. To save memory usage, we check if this name exists in name_dict
|
|
71
|
+
// If it does, we use the one in name_dict and delete this one.
|
|
72
|
+
// This way, for entries that has the same name, we won't create multiple
|
|
73
|
+
// string instances
|
|
74
|
+
if (node->data.fee.type == PyTrace_CALL || node->data.fee.type == PyTrace_RETURN) {
|
|
75
|
+
name = PyUnicode_FromFormat("%s (%s:%d)",
|
|
76
|
+
#if PY_VERSION_HEX >= 0x030B0000
|
|
77
|
+
PyUnicode_AsUTF8(node->data.fee.code->co_qualname),
|
|
78
|
+
#else
|
|
79
|
+
PyUnicode_AsUTF8(node->data.fee.code->co_name),
|
|
80
|
+
#endif
|
|
81
|
+
PyUnicode_AsUTF8(node->data.fee.code->co_filename),
|
|
82
|
+
node->data.fee.code->co_firstlineno);
|
|
83
|
+
} else {
|
|
84
|
+
if (node->data.fee.m_module) {
|
|
85
|
+
// The function belongs to a module
|
|
86
|
+
name = PyUnicode_FromFormat("%s.%s",
|
|
87
|
+
PyUnicode_AsUTF8(node->data.fee.m_module),
|
|
88
|
+
node->data.fee.ml_name);
|
|
89
|
+
} else {
|
|
90
|
+
// The function is a class method
|
|
91
|
+
if (node->data.fee.tp_name) {
|
|
92
|
+
// It's not a static method, has __self__
|
|
93
|
+
name = PyUnicode_FromFormat("%s.%s",
|
|
94
|
+
node->data.fee.tp_name,
|
|
95
|
+
node->data.fee.ml_name);
|
|
96
|
+
} else {
|
|
97
|
+
// It's a static method, does not have __self__
|
|
98
|
+
name = PyUnicode_FromFormat("%s",
|
|
99
|
+
node->data.fee.ml_name);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (PyDict_Contains(name_dict, name)) {
|
|
105
|
+
ret = Py_NewRef(PyDict_GetItem(name_dict, name));
|
|
106
|
+
Py_DECREF(name);
|
|
107
|
+
} else {
|
|
108
|
+
// return name, so don't DECREF it
|
|
109
|
+
PyDict_SetItem(name_dict, name, name);
|
|
110
|
+
ret = name;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return ret;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static void
|
|
117
|
+
fputs_escape(const char* s, FILE* fptr)
|
|
118
|
+
{
|
|
119
|
+
while (*s != 0) {
|
|
120
|
+
if (*s == '\\' || *s == '\"') {
|
|
121
|
+
fputc('\\', fptr);
|
|
122
|
+
}
|
|
123
|
+
fputc(*s, fptr);
|
|
124
|
+
s++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
void
|
|
129
|
+
fprintfeename(FILE* fptr, struct EventNode* node, uint8_t sanitize_function_name)
|
|
130
|
+
{
|
|
131
|
+
if (node->data.fee.type == PyTrace_CALL || node->data.fee.type == PyTrace_RETURN) {
|
|
132
|
+
#if PY_VERSION_HEX >= 0x030B0000
|
|
133
|
+
if (PyUnicode_Check(node->data.fee.code->co_qualname)) {
|
|
134
|
+
fputs(PyUnicode_AsUTF8(node->data.fee.code->co_qualname), fptr);
|
|
135
|
+
} else {
|
|
136
|
+
fputs("<unknown>", fptr);
|
|
137
|
+
}
|
|
138
|
+
#else
|
|
139
|
+
if (PyUnicode_Check(node->data.fee.code->co_name)) {
|
|
140
|
+
fputs(PyUnicode_AsUTF8(node->data.fee.code->co_name), fptr);
|
|
141
|
+
} else {
|
|
142
|
+
fputs("<unknown>", fptr);
|
|
143
|
+
}
|
|
144
|
+
#endif
|
|
145
|
+
fputs(" (", fptr);
|
|
146
|
+
if (PyUnicode_Check(node->data.fee.code->co_filename)) {
|
|
147
|
+
fputs_escape(PyUnicode_AsUTF8(node->data.fee.code->co_filename), fptr);
|
|
148
|
+
} else {
|
|
149
|
+
fputs("<unknown>", fptr);
|
|
150
|
+
}
|
|
151
|
+
fprintf(fptr, ":%d)", node->data.fee.code->co_firstlineno);
|
|
152
|
+
} else {
|
|
153
|
+
const char* ml_name = node->data.fee.ml_name;
|
|
154
|
+
|
|
155
|
+
if (sanitize_function_name) {
|
|
156
|
+
const char *c = ml_name;
|
|
157
|
+
while (*c != '\0') {
|
|
158
|
+
if(!Py_UNICODE_ISPRINTABLE(*c)) {
|
|
159
|
+
ml_name = NULL;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
c ++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (node->data.fee.m_module) {
|
|
166
|
+
// The function belongs to a module
|
|
167
|
+
if (PyUnicode_Check(node->data.fee.m_module)) {
|
|
168
|
+
fputs(PyUnicode_AsUTF8(node->data.fee.m_module), fptr);
|
|
169
|
+
} else {
|
|
170
|
+
fputs("<unknown>", fptr);
|
|
171
|
+
}
|
|
172
|
+
fputc('.', fptr);
|
|
173
|
+
} else {
|
|
174
|
+
// The function is a class method
|
|
175
|
+
if (node->data.fee.tp_name) {
|
|
176
|
+
// It's not a static method, has __self__
|
|
177
|
+
fputs(node->data.fee.tp_name, fptr);
|
|
178
|
+
fputc('.', fptr);
|
|
179
|
+
} else {
|
|
180
|
+
// It's a static method, does not have __self__
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// We will have to put ml_name at the end anyway.
|
|
184
|
+
if (ml_name) {
|
|
185
|
+
fputs(ml_name, fptr);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
#ifndef __EVENTNODE_H__
|
|
5
|
+
#define __EVENTNODE_H__
|
|
6
|
+
|
|
7
|
+
#include <Python.h>
|
|
8
|
+
|
|
9
|
+
typedef enum _NodeType {
|
|
10
|
+
EVENT_NODE = 0,
|
|
11
|
+
FEE_NODE = 1,
|
|
12
|
+
INSTANT_NODE = 2,
|
|
13
|
+
COUNTER_NODE = 3,
|
|
14
|
+
OBJECT_NODE = 4,
|
|
15
|
+
RAW_NODE = 5
|
|
16
|
+
} NodeType;
|
|
17
|
+
|
|
18
|
+
struct FEEData {
|
|
19
|
+
PyObject* args;
|
|
20
|
+
PyObject* retval;
|
|
21
|
+
union {
|
|
22
|
+
struct {
|
|
23
|
+
PyObject* m_module;
|
|
24
|
+
const char* ml_name;
|
|
25
|
+
const char* tp_name;
|
|
26
|
+
};
|
|
27
|
+
PyCodeObject* code;
|
|
28
|
+
};
|
|
29
|
+
int type;
|
|
30
|
+
int64_t dur;
|
|
31
|
+
PyObject* asyncio_task;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
struct InstantData {
|
|
35
|
+
PyObject* name;
|
|
36
|
+
PyObject* args;
|
|
37
|
+
PyObject* scope;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
struct CounterData {
|
|
41
|
+
PyObject* name;
|
|
42
|
+
PyObject* args;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
struct ObjectData {
|
|
46
|
+
PyObject* name;
|
|
47
|
+
PyObject* args;
|
|
48
|
+
PyObject* id;
|
|
49
|
+
PyObject* ph;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
struct EventNode {
|
|
53
|
+
NodeType ntype;
|
|
54
|
+
int64_t ts;
|
|
55
|
+
unsigned long tid;
|
|
56
|
+
union {
|
|
57
|
+
struct FEEData fee;
|
|
58
|
+
struct InstantData instant;
|
|
59
|
+
struct CounterData counter;
|
|
60
|
+
struct ObjectData object;
|
|
61
|
+
PyObject* raw;
|
|
62
|
+
} data;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// ==== Functions ====
|
|
66
|
+
|
|
67
|
+
// Clear the node, release reference
|
|
68
|
+
void clear_node(struct EventNode* node);
|
|
69
|
+
|
|
70
|
+
// get name from FEE node, passing in a dictionary for name cache
|
|
71
|
+
PyObject* get_name_from_fee_node(struct EventNode* node, PyObject* name_dict);
|
|
72
|
+
void fprintfeename(FILE*, struct EventNode* node, uint8_t sanitize_function_name);
|
|
73
|
+
#endif
|