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.
Files changed (109) hide show
  1. viztracer/__init__.py +19 -0
  2. viztracer/__main__.py +8 -0
  3. viztracer/attach.py +67 -0
  4. viztracer/attach_process/LICENSE +203 -0
  5. viztracer/attach_process/__init__.py +0 -0
  6. viztracer/attach_process/add_code_to_python_process.py +582 -0
  7. viztracer/attach_process/attach_x86.dll +0 -0
  8. viztracer/attach_process/inject_dll_amd64.exe +0 -0
  9. viztracer/attach_process/linux_and_mac/lldb_prepare.py +54 -0
  10. viztracer/attach_process/run_code_on_dllmain_amd64.dll +0 -0
  11. viztracer/attach_process/run_code_on_dllmain_x86.dll +0 -0
  12. viztracer/cellmagic.py +70 -0
  13. viztracer/code_monkey.py +353 -0
  14. viztracer/decorator.py +164 -0
  15. viztracer/event_base.py +81 -0
  16. viztracer/functree.py +135 -0
  17. viztracer/html/flamegraph.html +34 -0
  18. viztracer/html/trace_viewer_embedder.html +203 -0
  19. viztracer/html/trace_viewer_full.html +10207 -0
  20. viztracer/main.py +701 -0
  21. viztracer/modules/eventnode.c +188 -0
  22. viztracer/modules/eventnode.h +73 -0
  23. viztracer/modules/pythoncapi_compat.h +1726 -0
  24. viztracer/modules/quicktime.c +177 -0
  25. viztracer/modules/quicktime.h +104 -0
  26. viztracer/modules/snaptrace.c +2207 -0
  27. viztracer/modules/snaptrace.h +134 -0
  28. viztracer/modules/snaptrace_member.c +483 -0
  29. viztracer/modules/util.c +45 -0
  30. viztracer/modules/util.h +22 -0
  31. viztracer/modules/vcompressor/vc_dump.c +1131 -0
  32. viztracer/modules/vcompressor/vc_dump.h +49 -0
  33. viztracer/modules/vcompressor/vcompressor.c +396 -0
  34. viztracer/modules/vcompressor/vcompressor.h +15 -0
  35. viztracer/patch.py +317 -0
  36. viztracer/report_builder.py +311 -0
  37. viztracer/snaptrace.cp313-win32.pyd +0 -0
  38. viztracer/snaptrace.pyi +77 -0
  39. viztracer/util.py +196 -0
  40. viztracer/vcompressor.cp313-win32.pyd +0 -0
  41. viztracer/vcompressor.pyi +10 -0
  42. viztracer/viewer.py +529 -0
  43. viztracer/vizcounter.py +20 -0
  44. viztracer/vizevent.py +31 -0
  45. viztracer/vizlogging.py +20 -0
  46. viztracer/vizobject.py +28 -0
  47. viztracer/vizplugin.py +143 -0
  48. viztracer/viztracer.py +472 -0
  49. viztracer/web_dist/LICENSE +189 -0
  50. viztracer/web_dist/index.html +127 -0
  51. viztracer/web_dist/service_worker.js +279 -0
  52. viztracer/web_dist/trace_processor +300 -0
  53. viztracer/web_dist/v52.0-6b9586def/assets/MaterialSymbolsOutlined.woff2 +0 -0
  54. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-100.woff2 +0 -0
  55. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-300.woff2 +0 -0
  56. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-400.woff2 +0 -0
  57. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-500.woff2 +0 -0
  58. viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Light.woff2 +0 -0
  59. viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Regular.woff2 +0 -0
  60. viztracer/web_dist/v52.0-6b9586def/assets/RobotoMono-Regular.woff2 +0 -0
  61. viztracer/web_dist/v52.0-6b9586def/assets/brand.png +0 -0
  62. viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.html +3946 -0
  63. viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.js +7539 -0
  64. viztracer/web_dist/v52.0-6b9586def/assets/favicon.png +0 -0
  65. viztracer/web_dist/v52.0-6b9586def/assets/logo-128.png +0 -0
  66. viztracer/web_dist/v52.0-6b9586def/assets/logo-3d.png +0 -0
  67. viztracer/web_dist/v52.0-6b9586def/assets/rec_atrace.png +0 -0
  68. viztracer/web_dist/v52.0-6b9586def/assets/rec_battery_counters.png +0 -0
  69. viztracer/web_dist/v52.0-6b9586def/assets/rec_board_voltage.png +0 -0
  70. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_coarse.png +0 -0
  71. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_fine.png +0 -0
  72. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_freq.png +0 -0
  73. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_voltage.png +0 -0
  74. viztracer/web_dist/v52.0-6b9586def/assets/rec_frame_timeline.png +0 -0
  75. viztracer/web_dist/v52.0-6b9586def/assets/rec_ftrace.png +0 -0
  76. viztracer/web_dist/v52.0-6b9586def/assets/rec_gpu_mem_total.png +0 -0
  77. viztracer/web_dist/v52.0-6b9586def/assets/rec_java_heap_dump.png +0 -0
  78. viztracer/web_dist/v52.0-6b9586def/assets/rec_lmk.png +0 -0
  79. viztracer/web_dist/v52.0-6b9586def/assets/rec_logcat.png +0 -0
  80. viztracer/web_dist/v52.0-6b9586def/assets/rec_long_trace.png +0 -0
  81. viztracer/web_dist/v52.0-6b9586def/assets/rec_mem_hifreq.png +0 -0
  82. viztracer/web_dist/v52.0-6b9586def/assets/rec_meminfo.png +0 -0
  83. viztracer/web_dist/v52.0-6b9586def/assets/rec_native_heap_profiler.png +0 -0
  84. viztracer/web_dist/v52.0-6b9586def/assets/rec_one_shot.png +0 -0
  85. viztracer/web_dist/v52.0-6b9586def/assets/rec_profiling.png +0 -0
  86. viztracer/web_dist/v52.0-6b9586def/assets/rec_ps_stats.png +0 -0
  87. viztracer/web_dist/v52.0-6b9586def/assets/rec_ring_buf.png +0 -0
  88. viztracer/web_dist/v52.0-6b9586def/assets/rec_syscalls.png +0 -0
  89. viztracer/web_dist/v52.0-6b9586def/assets/rec_vmstat.png +0 -0
  90. viztracer/web_dist/v52.0-6b9586def/assets/scheduling_latency.png +0 -0
  91. viztracer/web_dist/v52.0-6b9586def/assets/vscode-icon.png +0 -0
  92. viztracer/web_dist/v52.0-6b9586def/engine_bundle.js +3 -0
  93. viztracer/web_dist/v52.0-6b9586def/frontend_bundle.js +5495 -0
  94. viztracer/web_dist/v52.0-6b9586def/index.html +127 -0
  95. viztracer/web_dist/v52.0-6b9586def/manifest.json +52 -0
  96. viztracer/web_dist/v52.0-6b9586def/perfetto.css +5737 -0
  97. viztracer/web_dist/v52.0-6b9586def/stdlib_docs.json +1 -0
  98. viztracer/web_dist/v52.0-6b9586def/trace_config_utils.wasm +0 -0
  99. viztracer/web_dist/v52.0-6b9586def/trace_processor.wasm +0 -0
  100. viztracer/web_dist/v52.0-6b9586def/trace_processor_memory64.wasm +0 -0
  101. viztracer/web_dist/v52.0-6b9586def/traceconv.wasm +0 -0
  102. viztracer/web_dist/v52.0-6b9586def/traceconv_bundle.js +2 -0
  103. viztracer-1.1.1.dist-info/METADATA +326 -0
  104. viztracer-1.1.1.dist-info/RECORD +109 -0
  105. viztracer-1.1.1.dist-info/WHEEL +5 -0
  106. viztracer-1.1.1.dist-info/entry_points.txt +3 -0
  107. viztracer-1.1.1.dist-info/licenses/LICENSE +222 -0
  108. viztracer-1.1.1.dist-info/licenses/NOTICE.txt +27 -0
  109. 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