From 7b8d16198c56f2b092b31c09fe514d6222e4fe69 Mon Sep 17 00:00:00 2001 From: zhang-zepeng1 Date: Tue, 23 Apr 2024 19:10:27 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=980423=E5=91=8A=E8=AD=A6=E6=B8=85?= =?UTF-8?q?=E7=90=86=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhang-zepeng1 --- ide/server/smarperfServer.py | 37 ++- ide/src/base-ui/select/LitSelect.ts | 15 +- ide/src/base-ui/table/lit-table.ts | 18 +- ide/src/base-ui/tree/LitTree.ts | 54 ++--- ide/src/base-ui/utils/CSVFormater.ts | 15 +- ide/src/base-ui/utils/Template.ts | 1 + ide/src/hdc/HdcDeviceManager.ts | 85 +++---- ide/src/trace/SpApplication.ts | 82 +++---- ide/src/trace/bean/BoxSelection.ts | 5 +- ide/src/trace/component/SpHelp.ts | 11 +- ide/src/trace/component/SpQuerySQL.ts | 27 ++- ide/src/trace/component/SpRecordTrace.ts | 9 +- .../trace/component/SpSystemTrace.event.ts | 7 +- ide/src/trace/component/SpSystemTrace.init.ts | 222 +++++++++++++----- ide/src/trace/component/SpSystemTrace.ts | 1 - ide/src/trace/component/chart/FrameChart.ts | 6 + .../component/chart/SpAbilityMonitorChart.ts | 28 +-- .../trace/component/chart/SpBpftraceChart.ts | 20 +- .../trace/component/chart/SpChartManager.ts | 6 +- ide/src/trace/component/chart/SpClockChart.ts | 8 +- ide/src/trace/component/chart/SpEBPFChart.ts | 24 +- ide/src/trace/component/chart/SpFpsChart.ts | 2 +- ide/src/trace/component/chart/SpFreqChart.ts | 2 +- ide/src/trace/component/chart/SpHiPerf.ts | 5 +- .../component/chart/SpPerfOutputDataChart.ts | 19 +- .../trace/component/chart/SpProcessChart.ts | 8 +- .../TabCpuDetailsThreads.ts | 54 +++-- .../trace/component/setting/SpRecordPerf.ts | 9 +- .../trace/component/setting/SpWebHdcShell.ts | 51 ++-- .../setting/utils/PluginConvertUtils.ts | 18 +- ide/src/trace/component/trace/SpChartList.ts | 9 +- .../component/trace/TimerShaftElement.ts | 3 +- .../trace/component/trace/base/Extension.ts | 7 + .../trace/component/trace/base/RangeSelect.ts | 7 +- .../trace/component/trace/base/TraceRow.ts | 24 +- .../component/trace/base/TraceRowConfig.ts | 2 +- .../trace/sheet/TabPaneCurrentSelection.ts | 13 +- .../TabPanePurgPinComparisonAbility.ts | 3 +- .../TabPanePurgTotalComparisonAbility.ts | 3 +- .../trace/sheet/ark-ts/TabPaneComparison.ts | 16 +- .../trace/sheet/ark-ts/TabPaneJsCpu.ts | 15 +- .../trace/sheet/ark-ts/TabPaneSummary.ts | 33 ++- .../bpftrace/TabPaneSampleInstruction.ts | 38 ++- .../TabPaneSampleInstructionDistributions.ts | 43 +++- .../TabPaneSampleInstructionSelection.ts | 120 +++++++--- ...PaneSampleInstructionSelectionTotalTime.ts | 4 +- .../sheet/energy/TabPaneSystemDetails.ts | 4 +- .../TabPaneFilesystemStatistics.ts | 4 + .../file-system/TabPaneIOTierStatistics.ts | 8 +- .../TabPaneVirtualMemoryStatistics.ts | 139 ++++++++--- .../trace/sheet/frequsage/TabPaneFreqUsage.ts | 9 + .../sheet/native-memory/TabPaneNMCallTree.ts | 13 +- .../native-memory/TabPaneNMSampleList.ts | 4 +- .../TabPaneNMStatisticAnalysis.ts | 20 +- .../trace/sheet/process/TabPaneThreadUsage.ts | 2 +- .../sheet/smaps/TabPaneSmapsComparison.ts | 3 +- .../trace/sheet/smaps/TabPaneSmapsRecord.ts | 4 +- .../sheet/smaps/TabPaneSmapsStatistics.ts | 2 + .../vmtracker/TabPanePurgPinComparisonVM.ts | 3 +- .../vmtracker/TabPanePurgTotalComparisonVM.ts | 3 +- .../TabPaneVmTrackerShmComparison.ts | 6 +- ide/src/trace/database/ConfigWorker.ts | 2 +- ide/src/trace/database/StateBusyTimeWorker.ts | 9 +- ide/src/trace/database/TraceWorker.ts | 44 +++- .../database/data-trafic/ArkTsReceiver.ts | 4 +- .../data-trafic/EnergySysEventReceiver.ts | 7 +- .../database/data-trafic/IrqDataReceiver.ts | 6 +- .../data-trafic/NativeMemoryDataReceiver.ts | 4 +- .../database/data-trafic/SliceReceiver.ts | 2 +- .../cpu/CpuFreqLimitDataReceiver.ts | 3 +- .../process/ProcessMemDataReceiver.ts | 6 +- .../process/ProcessMemDataSender.ts | 10 +- .../data-trafic/process/ThreadDataReceiver.ts | 2 +- .../data-trafic/utils/AllMemoryCache.ts | 2 +- .../database/data-trafic/utils/DataFilter.ts | 2 +- .../ProcedureLogicWorkerFileSystem.ts | 6 +- .../ProcedureLogicWorkerJsCpuProfiler.ts | 15 +- .../ProcedureLogicWorkerNativeNemory.ts | 6 +- .../logic-worker/ProcedureLogicWorkerPerf.ts | 4 +- ide/src/trace/database/sql/Smaps.sql.ts | 10 +- ide/src/trace/database/sql/SqlLite.sql.ts | 4 +- .../ui-worker/ProcedureWorkerCommon.ts | 5 +- .../ui-worker/ProcedureWorkerCpuAbility.ts | 3 +- .../ui-worker/ProcedureWorkerDiskIoAbility.ts | 3 +- .../ui-worker/ProcedureWorkerEnergyPower.ts | 15 +- .../ui-worker/ProcedureWorkerHitchTime.ts | 4 +- .../database/ui-worker/ProcedureWorkerLTPO.ts | 4 +- .../ui-worker/ProcedureWorkerMemoryAbility.ts | 3 +- .../ProcedureWorkerPerfCallchains.ts | 2 +- .../ui-worker/cpu/ProcedureWorkerCPU.ts | 3 +- .../ui-worker/cpu/ProcedureWorkerCpuState.ts | 4 +- trace_streamer/build/build_base_var.sh | 2 +- trace_streamer/build/ts.gni | 1 + trace_streamer/gn/BUILD.gn | 4 + .../sdk/demo_sdk/table/demo_table_base.cpp | 2 +- trace_streamer/src/base/string_help.cpp | 9 + trace_streamer/src/base/string_help.h | 1 + trace_streamer/src/base/ts_common.h | 2 + .../src/cfg/trace_streamer_config.cpp | 2 + .../src/cfg/trace_streamer_config.h | 2 + .../src/filter/app_start_filter.cpp | 75 +++--- trace_streamer/src/filter/app_start_filter.h | 4 +- trace_streamer/src/filter/cpu_filter.cpp | 59 +++-- trace_streamer/src/filter/cpu_filter.h | 7 +- .../filter/hook_filter/native_hook_filter.cpp | 82 ++++--- .../filter/hook_filter/native_hook_filter.h | 7 +- .../filter/perf_filter/perf_data_filter.cpp | 10 - .../src/filter/perf_filter/perf_data_filter.h | 6 - trace_streamer/src/filter/slice_filter.cpp | 28 +-- trace_streamer/src/filter/slice_filter.h | 4 +- trace_streamer/src/main.cpp | 7 +- .../src/parser/ebpf_parser/ebpf_base.cpp | 33 +-- .../parser/hiperf_parser/perf_data_parser.cpp | 4 +- .../src/parser/pbreader_parser/BUILD.gn | 6 +- .../arkts/pbreader_js_cpu_profiler_parser.cpp | 26 +- .../arkts/pbreader_js_memory_parser.cpp | 106 +++++---- .../pbreader_parser/ffrt_parser/BUILD.gn | 32 +++ .../ffrt_parser/pbreader_ffrt_parser.cpp | 95 ++++++++ .../ffrt_parser/pbreader_ffrt_parser.h | 50 ++++ .../pbreader_parser/htrace_parser/BUILD.gn | 3 + .../htrace_parser/htrace_cpu_detail_parser.h | 2 +- .../htrace_parser/htrace_event_parser.cpp | 70 ++++-- .../htrace_parser/htrace_event_parser.h | 30 ++- .../pbreader_clock_detail_parser.cpp | 6 +- .../pbreader_clock_detail_parser.h | 2 + .../pbreader_parser/pbreader_parser.cpp | 44 +++- .../parser/pbreader_parser/pbreader_parser.h | 12 + .../src/parser/print_event_parser.cpp | 14 +- .../bytrace_parser/bytrace_event_parser.cpp | 3 +- .../rawtrace_parser/cpu_detail_parser.cpp | 6 +- .../types/plugins/ffrt_profiler/BUILD.gn | 90 +++++++ .../ffrt_profiler/ffrt_profiler_config.proto | 43 ++++ .../ffrt_profiler/ffrt_profiler_result.proto | 46 ++++ trace_streamer/src/rpc/ffrt_converter.cpp | 6 +- trace_streamer/src/rpc/ffrt_converter.h | 4 +- trace_streamer/src/rpc/rpc_server.cpp | 43 ++-- .../src/table/base/include/table_base.h | 1 + trace_streamer/src/table/base/table_base.cpp | 34 +-- .../src/table/ftrace/callstack_table.cpp | 8 +- .../src/table/ftrace/include/thread_table.h | 67 ------ trace_streamer/src/table/ftrace/irq_table.cpp | 34 +-- .../src/table/ftrace/thread_table.cpp | 196 +--------------- .../trace_stdtype/common_stdtype.cpp | 2 + .../ftrace/callstack_stdtype.cpp | 22 +- .../trace_stdtype/ftrace/callstack_stdtype.h | 13 +- .../trace_stdtype/htrace/arkts_stdtype.cpp | 158 +++++-------- .../trace_stdtype/htrace/arkts_stdtype.h | 114 +++++---- .../trace_streamer/trace_streamer_selector.h | 4 +- trace_streamer/src/version.cpp | 4 +- trace_streamer/test/BUILD.gn | 2 + .../test/resource/pbreader_ffrt.htrace | Bin 0 -> 14330 bytes .../unittest/filter/task_pool_filter_test.cpp | 83 ++++--- .../interface/split_file_data_test.cpp | 18 +- .../pbreader_ffrt_parser_test.cpp | 87 +++++++ .../ptreader_parser/event_parser_test.cpp | 18 +- 155 files changed, 2080 insertions(+), 1482 deletions(-) create mode 100644 trace_streamer/src/parser/pbreader_parser/ffrt_parser/BUILD.gn create mode 100644 trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.cpp create mode 100644 trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.h create mode 100644 trace_streamer/src/protos/types/plugins/ffrt_profiler/BUILD.gn create mode 100644 trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_config.proto create mode 100644 trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_result.proto create mode 100644 trace_streamer/test/resource/pbreader_ffrt.htrace create mode 100644 trace_streamer/test/unittest/pbreader_parser/pbreader_ffrt_parser_test.cpp diff --git a/ide/server/smarperfServer.py b/ide/server/smarperfServer.py index 07a838dbb..a89d63ad4 100644 --- a/ide/server/smarperfServer.py +++ b/ide/server/smarperfServer.py @@ -30,7 +30,7 @@ PORT = 9000 CERT_FILE = './cert/certFile.pem' KEY_FILE = './cert/keyFile.key' version = 'v1.0.0' -serveInfo = '' +server_info = '' def is_windows(): @@ -45,7 +45,7 @@ def is_linux(): return platform.system() == 'Linux' -def openWeb(url): +def open_web(url): webbrowser.open(url) @@ -72,21 +72,18 @@ def check_port(port): class SpRequestHandler(http.server.BaseHTTPRequestHandler): global version - global serveInfo + global server_info - def log_message(self, format, *args): - return - - def do_GET(self): + def do_get(self): parse_result = urlparse(self.path) if parse_result.path == '/application/serverInfo': - self.serverInfo_handler() + self.server_info_handler() elif parse_result.path.startswith('/application'): self.application_handler(parse_result) else: self.send_error(404, 'Not found') - def do_POST(self): + def do_post(self): parse_result = urlparse(self.path) if parse_result.path.startswith('/logger'): self.console_handler() @@ -111,8 +108,8 @@ class SpRequestHandler(http.server.BaseHTTPRequestHandler): response = {"success": False, "code": -1, "message": str(e), "data": None} self.wfile.write(bytes(json.dumps(response), "utf-8")) return - suffixStr = os.path.splitext(url.split("/")[-1])[1] - file_name = f"upload/{datetime.now().strftime('%Y%m%d%H%M%S%f')}{suffixStr}" + suffix_str = os.path.splitext(url.split("/")[-1])[1] + file_name = f"upload/{datetime.now().strftime('%Y%m%d%H%M%S%f')}{suffix_str}" os.makedirs(os.path.dirname(file_name), exist_ok=True) try: with open(file_name, "wb") as f: @@ -153,13 +150,13 @@ class SpRequestHandler(http.server.BaseHTTPRequestHandler): def check_due(self, file_name): now = datetime.now() datetime_str = os.path.splitext(os.path.basename(file_name))[0] - fileDate = datetime.strptime(datetime_str, "%Y%m%d%H%M%S%f") - return (now - fileDate).total_seconds() > 3600 + file_date = datetime.strptime(datetime_str, "%Y%m%d%H%M%S%f") + return (now - file_date).total_seconds() > 3600 def console_handler(self): self.check_dir('./logger') - nowDate = datetime.now() - now = nowDate.strftime("%Y-%m-%d") + now_date = datetime.now() + now = now_date.strftime("%Y-%m-%d") fileName = f"{now}.txt" with open(os.path.join("logger", fileName), "a") as dst: content_type = self.headers.get("Content-Type") @@ -205,10 +202,10 @@ class SpRequestHandler(http.server.BaseHTTPRequestHandler): except FileNotFoundError: self.send_error(404, 'File not found') - def serverInfo_handler(self): + def server_info_handler(self): self.send_response(200) self.send_header("Access-Control-Allow-Origin", "*") - self.send_header("request_info", serveInfo) + self.send_header("request_info", server_info) self.end_headers() @@ -252,9 +249,9 @@ def gen_ssl(cert_file, key_file): class SpServer: def __init__(self, server_address, cert_file_path, keyfile_path): global version - global serveInfo + global server_info version = read_text('version.txt') - serveInfo = read_text('server-config.txt') + server_info = read_text('server-config.txt') self.server_address = server_address self.context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) self.context.load_cert_chain(cert_file_path, keyfile_path) @@ -264,7 +261,7 @@ class SpServer: def start(self): print(f'HTTPS[{PORT}] SmartPerf Server Start') if is_windows(): - openWeb("https://127.0.0.1:9000/application/") + open_web("https://127.0.0.1:9000/application/") self.httpd.serve_forever() diff --git a/ide/src/base-ui/select/LitSelect.ts b/ide/src/base-ui/select/LitSelect.ts index 94e4d355c..505c01862 100644 --- a/ide/src/base-ui/select/LitSelect.ts +++ b/ide/src/base-ui/select/LitSelect.ts @@ -220,9 +220,8 @@ export class LitSelect extends BaseElement { ${selectHtmlStr(this.listHeight)}
- +
@@ -252,7 +251,7 @@ export class LitSelect extends BaseElement { icon.name = 'close'; let span = document.createElement('span'); // @ts-ignore tag.classList.add('tag'); // @ts-ignore - span.dataset['value'] = value; // @ts-ignore + span.dataset.value = value; // @ts-ignore span.textContent = text; // @ts-ignore tag.append(span); // @ts-ignore tag.append(icon); // @ts-ignore @@ -268,9 +267,9 @@ export class LitSelect extends BaseElement { ev.stopPropagation(); }; // @ts-ignore tag.value = value; // @ts-ignore - tag.dataset['value'] = value; // @ts-ignore + tag.dataset.value = value; // @ts-ignore tag.text = text; // @ts-ignore - tag.dataset['text'] = text; // @ts-ignore + tag.dataset.text = text; // @ts-ignore return tag; } @@ -591,9 +590,9 @@ export class LitSelect extends BaseElement { }); } - disconnectedCallback(): void {} + disconnectedCallback(): void { } - adoptedCallback(): void {} + adoptedCallback(): void { } attributeChangedCallback(name: unknown, oldValue: unknown, newValue: unknown): void { if (name === 'value' && this.selectInputEl) { diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index 254a8da8e..330eb8a82 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -634,13 +634,17 @@ export class LitTable extends HTMLElement { adoptedCallback(): void {} getCheckRows(): unknown[] { - // @ts-ignore - return [...this.shadowRoot!.querySelectorAll('div[class=tr][checked]')] // @ts-ignore - .map((a) => (a as unknown).data) - .map((a) => { - delete a['children']; - return a; - }); + return ( + [...this.shadowRoot!.querySelectorAll('div[class=tr][checked]')] + // @ts-ignore + .map((a) => (a as HTMLDivElement).data) + .map((a) => { + if ('children' in a) { + delete a.children; + } + return a; + }) + ); } deleteRowsCondition(fn: unknown): void { diff --git a/ide/src/base-ui/tree/LitTree.ts b/ide/src/base-ui/tree/LitTree.ts index a23c3c21f..276ab7da6 100644 --- a/ide/src/base-ui/tree/LitTree.ts +++ b/ide/src/base-ui/tree/LitTree.ts @@ -336,24 +336,21 @@ export class LitTree extends BaseElement { onDrag(e: MouseEvent): void {} - onDragStart(ev: MouseEvent): undefined { + onDragStart(ev: MouseEvent) { this.srcDragElement = ev.target; (ev.target! as LitTreeNode).open = 'true'; (ev.target! as LitTreeNode).autoExpand(); - return undefined; } - onDragEnd(ev: MouseEvent): undefined { + onDragEnd(ev: MouseEvent): void { this.srcDragElement = null; - return undefined; } - onDragEnter(ev: MouseEvent): undefined { + onDragEnter(ev: MouseEvent): void { (ev.target as LitTreeNode).style.backgroundColor = '#42b98333'; - return undefined; } - onDragOver(ev: MouseEvent): undefined { + onDragOver(ev: MouseEvent) { let node = ev.target as LitTreeNode; //@ts-ignore if (this.srcDragElement.data.key === node.data!.key) { return; @@ -372,16 +369,14 @@ export class LitTree extends BaseElement { this.dragDirection = 'bottom'; node.drawLine('bottom'); } - return undefined; } - onDragLeave(ev: MouseEvent): undefined { + onDragLeave(ev: MouseEvent): void { (ev.target as LitTreeNode).style.backgroundColor = '#ffffff00'; (ev.target as LitTreeNode).drawLine(''); - return undefined; } - onDrop(ev: MouseEvent): undefined { + onDrop(ev: MouseEvent): void { (ev.target as LitTreeNode).style.backgroundColor = '#ffffff00'; (ev.target as LitTreeNode).drawLine(''); //移动的不是node节点 而是上层的li节点 @@ -433,7 +428,6 @@ export class LitTree extends BaseElement { }) ); ev.stopPropagation(); - return undefined; } //移除treeData中指定的节点 通过key匹配 @@ -489,13 +483,13 @@ export class LitTree extends BaseElement { }; //在拖动目标上触发事件 (源元素) insertNode.ondrag = (ev): void => this.onDrag(ev); //元素正在拖动时触发 - insertNode.ondragstart = (ev): undefined => this.onDragStart(ev); //用户开始拖动元素时触发 - insertNode.ondragend = (ev): undefined => this.onDragEnd(ev); // 用户完成元素拖动后触发 + insertNode.ondragstart = (ev): void => this.onDragStart(ev); //用户开始拖动元素时触发 + insertNode.ondragend = (ev): void => this.onDragEnd(ev); // 用户完成元素拖动后触发 //释放目标时触发的事件: - insertNode.ondragenter = (ev): undefined => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 - insertNode.ondragover = (ev): undefined => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 - insertNode.ondragleave = (ev): undefined => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 - insertNode.ondrop = (ev): undefined => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 + insertNode.ondragenter = (ev): void => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + insertNode.ondragover = (ev): void => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + insertNode.ondragleave = (ev): void => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + insertNode.ondrop = (ev): void => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 } } _insertNode(parent: unknown, a: unknown): void { @@ -514,13 +508,13 @@ export class LitTree extends BaseElement { }; //在拖动目标上触发事件 (源元素) insertNode.ondrag = (ev): void => this.onDrag(ev); //元素正在拖动时触发 - insertNode.ondragstart = (ev): undefined => this.onDragStart(ev); //用户开始拖动元素时触发 - insertNode.ondragend = (ev): undefined => this.onDragEnd(ev); // 用户完成元素拖动后触发 + insertNode.ondragstart = (ev): void => this.onDragStart(ev); //用户开始拖动元素时触发 + insertNode.ondragend = (ev): void => this.onDragEnd(ev); // 用户完成元素拖动后触发 //释放目标时触发的事件: - insertNode.ondragenter = (ev): undefined => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 - insertNode.ondragover = (ev): undefined => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 - insertNode.ondragleave = (ev): undefined => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 - insertNode.ondrop = (ev): undefined => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 + insertNode.ondragenter = (ev): void => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + insertNode.ondragover = (ev): void => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + insertNode.ondragleave = (ev): void => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + insertNode.ondrop = (ev): void => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 } //@ts-ignore insertNode.selected = a.selected || false; //是否选中行 //@ts-ignore @@ -572,13 +566,13 @@ export class LitTree extends BaseElement { }; //在拖动目标上触发事件 (源元素) insertNode.ondrag = (ev): void => this.onDrag(ev); //元素正在拖动时触发 - insertNode.ondragstart = (ev): undefined => this.onDragStart(ev); //用户开始拖动元素时触发 - insertNode.ondragend = (ev): undefined => this.onDragEnd(ev); // 用户完成元素拖动后触发 + insertNode.ondragstart = (ev): void => this.onDragStart(ev); //用户开始拖动元素时触发 + insertNode.ondragend = (ev): void => this.onDragEnd(ev); // 用户完成元素拖动后触发 //释放目标时触发的事件: - insertNode.ondragenter = (ev): undefined => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 - insertNode.ondragover = (ev): undefined => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 - insertNode.ondragleave = (ev): undefined => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 - insertNode.ondrop = (ev): undefined => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 + insertNode.ondragenter = (ev): void => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + insertNode.ondragover = (ev): void => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + insertNode.ondragleave = (ev): void => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + insertNode.ondrop = (ev): void => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 } } diff --git a/ide/src/base-ui/utils/CSVFormater.ts b/ide/src/base-ui/utils/CSVFormater.ts index e3755e403..a65a5ad0c 100644 --- a/ide/src/base-ui/utils/CSVFormater.ts +++ b/ide/src/base-ui/utils/CSVFormater.ts @@ -15,7 +15,6 @@ export class JSONToCSV { static setCsvData(obj: unknown): void { - let that = this; let browserType = this.browserType(); // @ts-ignore if (browserType.ie < 9) { @@ -54,11 +53,11 @@ export class JSONToCSV { csv += row + '\r\n'; } // 具体的数据处理 - data.map(function (n: unknown) { + data.map((n: unknown) => { row = ''; // 如果存在自定义key值 if (columns.key.length) { - row = that.getCsvStr(columns, obj, n, row); + row = this.getCsvStr(columns, obj, n, row); } else { // @ts-ignore for (key in n) { @@ -77,7 +76,6 @@ export class JSONToCSV { } static getCsvStr(columns: unknown, obj: unknown, n: unknown, row: string): string { - let that = this; // @ts-ignore columns.key.map(function (m: unknown, idx: number) { let strItem: unknown = ''; @@ -105,7 +103,7 @@ export class JSONToCSV { row += '"' + // @ts-ignore - that.treeDepth(n.depthCSV) + + this.treeDepth(n.depthCSV) + // @ts-ignore (typeof columns.formatter === 'function' ? columns.formatter(m, n[m]) || n[m] : strItem) + '",'; @@ -124,8 +122,10 @@ export class JSONToCSV { let alink: unknown = document.createElement('a'); // @ts-ignore alink.id = 'csvDownloadLink'; + + const href = this.getDownloadUrl(csvData); // @ts-ignore - alink.href = this.getDownloadUrl(csvData); + alink.href = href === '' ? null : href; // @ts-ignore document.body.appendChild(alink); let linkDom: unknown = document.getElementById('csvDownloadLink'); @@ -157,7 +157,7 @@ export class JSONToCSV { } } - static getDownloadUrl(csvData: unknown): string | undefined { + static getDownloadUrl(csvData: unknown): string { // @ts-ignore if (window.Blob && window.URL && (window.URL as unknown).createObjectURL) { return URL.createObjectURL( @@ -166,6 +166,7 @@ export class JSONToCSV { }) ); } + return ''; } static browserType(): { edge: string; ie: string } { diff --git a/ide/src/base-ui/utils/Template.ts b/ide/src/base-ui/utils/Template.ts index 4f449231e..32cee67f4 100644 --- a/ide/src/base-ui/utils/Template.ts +++ b/ide/src/base-ui/utils/Template.ts @@ -99,6 +99,7 @@ function parseFor(strFor: String): { isArray: boolean; items: string | String; p // @ts-ignore const vals = Object.values(params); const str = this.replace(/\{\{([^\}]+)\}\}/g, (all: unknown, s: unknown) => `\${${s}}`); + // @ts-ignore return new Function(...names, `return \`${escape2Html(str)}\`;`)(...vals); }; diff --git a/ide/src/hdc/HdcDeviceManager.ts b/ide/src/hdc/HdcDeviceManager.ts index 268fa31eb..23e031c4f 100644 --- a/ide/src/hdc/HdcDeviceManager.ts +++ b/ide/src/hdc/HdcDeviceManager.ts @@ -186,53 +186,54 @@ export class HdcDeviceManager { public static startShell( resultCallBack: (res: DataMessage) => void ): ((keyboardEvent: KeyboardEvent | string) => void | undefined) | undefined { - if (this.currentHdcClient) { - const hdcShellStream = new HdcStream(this.currentHdcClient, false); - this.shellInit(hdcShellStream, resultCallBack); - return (keyboardEvent: KeyboardEvent | string): void => { - let code = undefined; - if (keyboardEvent instanceof KeyboardEvent) { - const cmd = keyboardEvent.key; - if (keyboardEvent.shiftKey && keyboardEvent.key.toUpperCase() === 'SHIFT') { - return; - } else if (keyboardEvent.metaKey) { - return; - } else if (keyboardEvent.ctrlKey) { - // @ts-ignore - code = this.ctrlKey[keyboardEvent.key]; - if (!code) { - return; - } else { - const dataArray = new Uint8Array(code); - hdcShellStream.sendToDaemon( - new FormatCommand(HdcCommand.CMD_SHELL_DATA, cmd, false), - dataArray, - dataArray.length - ); - } - } else if (keyboardEvent.altKey) { + if (!this.currentHdcClient) { + return; + } + const hdcShellStream = new HdcStream(this.currentHdcClient, false); + this.shellInit(hdcShellStream, resultCallBack); + return (keyboardEvent: KeyboardEvent | string): void => { + let code = undefined; + if (keyboardEvent instanceof KeyboardEvent) { + const cmd = keyboardEvent.key; + if (keyboardEvent.shiftKey && keyboardEvent.key.toUpperCase() === 'SHIFT') { + return; + } else if (keyboardEvent.metaKey) { + return; + } else if (keyboardEvent.ctrlKey) { + // @ts-ignore + code = this.ctrlKey[keyboardEvent.key]; + if (!code) { return; } else { - // @ts-ignore - code = this.escapeCharacterDict[cmd]; - if (code) { - const dataArray = new Uint8Array(code); - hdcShellStream.sendToDaemon( - new FormatCommand(HdcCommand.CMD_SHELL_DATA, cmd, false), - dataArray, - dataArray.length - ); - } else { - if (cmd.length === 1) { - hdcShellStream.DoCommand(cmd); - } - } + const dataArray = new Uint8Array(code); + hdcShellStream.sendToDaemon( + new FormatCommand(HdcCommand.CMD_SHELL_DATA, cmd, false), + dataArray, + dataArray.length + ); } + } else if (keyboardEvent.altKey) { + return; } else { - hdcShellStream.DoCommand(HdcDeviceManager.processCommand(keyboardEvent)); + // @ts-ignore + code = this.escapeCharacterDict[cmd]; + if (code) { + const dataArray = new Uint8Array(code); + hdcShellStream.sendToDaemon( + new FormatCommand(HdcCommand.CMD_SHELL_DATA, cmd, false), + dataArray, + dataArray.length + ); + } else { + if (cmd.length === 1) { + hdcShellStream.DoCommand(cmd); + } + } } - }; - } + } else { + hdcShellStream.DoCommand(HdcDeviceManager.processCommand(keyboardEvent)); + } + }; } private static processCommand(command: string): string { diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts index 3966acaaf..646861cbc 100644 --- a/ide/src/trace/SpApplication.ts +++ b/ide/src/trace/SpApplication.ts @@ -357,7 +357,6 @@ export class SpApplication extends BaseElement { } private openLongTraceFile(ev: unknown, isRecordTrace: boolean = false): void { - const self = this; this.returnOriginalUrl(); this.wasm = true; this.openFileInit(); @@ -379,9 +378,9 @@ export class SpApplication extends BaseElement { ): Promise => { const promises = Array.from(files).map((file) => { if (normalNames.indexOf(file.name.toLowerCase()) >= 0) { - return self.longTraceFileRead(file, true, traceTypePage, readSize, timStamp, allFileSize); + return this.longTraceFileRead(file, true, traceTypePage, readSize, timStamp, allFileSize); } else if (specialNames.indexOf(file.name.toLowerCase()) >= 0) { - return self.longTraceFileRead(file, false, traceTypePage, readSize, timStamp, allFileSize); + return this.longTraceFileRead(file, false, traceTypePage, readSize, timStamp, allFileSize); } else { return; } @@ -405,7 +404,6 @@ export class SpApplication extends BaseElement { allFileSize: number ): Promise => { info('reading long trace file ', file.name); - const self = this; return new Promise((resolve, reject) => { let fr = new FileReader(); let message = { fileType: '', startIndex: 0, endIndex: 0, size: 0 }; @@ -415,12 +413,12 @@ export class SpApplication extends BaseElement { let offset = 0; let sliceLen = 0; let index = 1; - fr.onload = function (): void { + fr.onload = (): void => { let data = fr.result as ArrayBuffer; LongTraceDBUtils.getInstance() .addLongTableData(data, fileType, timStamp, pageNumber, index, offset, sliceLen) .then(() => { - self.longTraceFileReadMessagePush(index, isNormalType, pageNumber, offset, sliceLen, fileType, data); + this.longTraceFileReadMessagePush(index, isNormalType, pageNumber, offset, sliceLen, fileType, data); offset += sliceLen; if (offset < file.size) { index++; @@ -428,11 +426,11 @@ export class SpApplication extends BaseElement { continueReading(); }); }; - function continueReading(): void { + const continueReading = (): void => { if (offset >= file.size) { message.endIndex = index; message.size = file.size; - self.longTraceFileReadMessageHandler(pageNumber, message); + this.longTraceFileReadMessageHandler(pageNumber, message); resolve(true); return; } @@ -444,9 +442,9 @@ export class SpApplication extends BaseElement { let slice = file.slice(offset, offset + sliceLen); readSize += slice.size; let percentValue = ((readSize * 100) / allFileSize).toFixed(2); - self.litSearch!.setPercent('Read in file: ', Number(percentValue)); + this.litSearch!.setPercent('Read in file: ', Number(percentValue)); fr.readAsArrayBuffer(slice); - } + }; continueReading(); fr.onerror = (): void => reject(false); info('read over long trace file ', file.name); @@ -927,7 +925,6 @@ export class SpApplication extends BaseElement { } private handleSqliteMode(ev: unknown, showFileName: string, fileSize: number, fileName: string): void { - const self = this; let fileSizeStr = (fileSize / 1048576).toFixed(1); postLog(fileName, fileSizeStr); document.title = `${showFileName} (${fileSizeStr}M)`; @@ -935,39 +932,39 @@ export class SpApplication extends BaseElement { threadPool.init('sqlite').then((res) => { let reader = new FileReader(); reader.readAsArrayBuffer(ev as Blob); - reader.onloadend = function (ev): void { + reader.onloadend = (ev): void => { SpApplication.loadingProgress = 0; SpApplication.progressStep = 3; - self.spSystemTrace!.loadDatabaseArrayBuffer( - this.result as ArrayBuffer, + this.spSystemTrace!.loadDatabaseArrayBuffer( + reader.result as ArrayBuffer, '', (command: string, _: number) => { - self.setProgress(command); + this.setProgress(command); }, () => { - self.mainMenu!.menus!.splice(1, self.mainMenu!.menus!.length > 2 ? 1 : 0, { + this.mainMenu!.menus!.splice(1, this.mainMenu!.menus!.length > 2 ? 1 : 0, { collapsed: false, title: 'Current Trace', second: false, icon: '', describe: 'Actions on the current trace', - children: self.getTraceOptionMenus(showFileName, fileSizeStr, fileName, true), + children: this.getTraceOptionMenus(showFileName, fileSizeStr, fileName, true), }); - self.mainMenu!.menus!.splice(2, 1, { + this.mainMenu!.menus!.splice(2, 1, { collapsed: false, title: 'Support', second: false, icon: '', describe: 'Support', - children: self.getTraceSupportMenus(), + children: this.getTraceSupportMenus(), }); - self.litSearch!.setPercent('', 101); - self.chartFilter!.setAttribute('mode', ''); - self.progressEL!.loading = false; - self.freshMenuDisable(false); - self.spInfoAndStats!.initInfoAndStatsData(); - self.cutTraceFile!.style.display = 'none'; - self.headerDiv!.style.pointerEvents = 'auto'; + this.litSearch!.setPercent('', 101); + this.chartFilter!.setAttribute('mode', ''); + this.progressEL!.loading = false; + this.freshMenuDisable(false); + this.spInfoAndStats!.initInfoAndStatsData(); + this.cutTraceFile!.style.display = 'none'; + this.headerDiv!.style.pointerEvents = 'auto'; } ); }; @@ -975,17 +972,16 @@ export class SpApplication extends BaseElement { } private handleWasmMode(ev: unknown, showFileName: string, fileSize: number, fileName: string): void { - const self = this; this.litSearch!.setPercent('', 1); if (fileName.endsWith('.json')) { - self.progressEL!.loading = true; + this.progressEL!.loading = true; //@ts-ignore self.spSystemTrace!.loadSample(ev).then(() => { - self.showContent(self.spSystemTrace!); - self.litSearch!.setPercent('', 101); - self.freshMenuDisable(false); - self.chartFilter!.setAttribute('mode', ''); - self.progressEL!.loading = false; + this.showContent(this.spSystemTrace!); + this.litSearch!.setPercent('', 101); + this.freshMenuDisable(false); + this.chartFilter!.setAttribute('mode', ''); + this.progressEL!.loading = false; }); } else { let fileSizeStr = (fileSize / 1048576).toFixed(1); @@ -1002,18 +998,18 @@ export class SpApplication extends BaseElement { let reader: FileReader | null = new FileReader(); //@ts-ignore reader.readAsArrayBuffer(ev); - reader.onloadend = function (ev): void { + reader.onloadend = (ev): void => { info('read file onloadend'); - self.litSearch!.setPercent('ArrayBuffer loaded ', 2); + this.litSearch!.setPercent('ArrayBuffer loaded ', 2); let wasmUrl = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/wasm.json`; SpApplication.loadingProgress = 0; SpApplication.progressStep = 3; - let data = self.markPositionHandler(this.result as ArrayBuffer); + let data = this.markPositionHandler(reader.result as ArrayBuffer); info('initData start Parse Data'); - self.spSystemTrace!.loadDatabaseArrayBuffer( + this.spSystemTrace!.loadDatabaseArrayBuffer( data, wasmUrl, - (command: string, _: number) => self.setProgress(command), + (command: string, _: number) => this.setProgress(command), completeHandler ); }; @@ -2233,9 +2229,8 @@ export class SpApplication extends BaseElement { a.download = fileName; a.click(); this.itemIconLoading(mainMenu, 'Current Trace', 'Download Database', true); - const self = this; - let timer = setInterval(function () { - self.itemIconLoading(mainMenu, 'Current Trace', 'Download Database', false); + let timer = setInterval(() => { + this.itemIconLoading(mainMenu, 'Current Trace', 'Download Database', false); clearInterval(timer); }, 4000); }, @@ -2261,10 +2256,9 @@ export class SpApplication extends BaseElement { a.download = fileName; a.click(); window.URL.revokeObjectURL(a.href); - const self = this; this.itemIconLoading(mainMenu, 'Current Trace', 'Download File', true); - let timer = setInterval(function () { - self.itemIconLoading(mainMenu, 'Current Trace', 'Download File', false); + let timer = setInterval(() => { + this.itemIconLoading(mainMenu, 'Current Trace', 'Download File', false); clearInterval(timer); }, 4000); } diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index f629fee22..1b4d6a5ed 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -620,7 +620,8 @@ export class SelectionParam { const [rangeStart, rangeEnd] = [TraceRow.range?.startNS, TraceRow.range?.endNS]; const startNS = TraceRow.rangeSelectObject?.startNS || rangeStart; const endNS = TraceRow.rangeSelectObject?.endNS || rangeEnd; - let minNodeId, maxNodeId; + let minNodeId; + let maxNodeId; if (!it.dataListCache || it.dataListCache.length === 0) { return; } @@ -683,7 +684,7 @@ export class SelectionParam { for (let data of copyFrameSelectData) { frameSelectDataIdArr.push(data.id); } - let jsCpuProfilerData = copyFrameSelectData.filter((item: unknown) => { + let jsCpuProfilerData = copyFrameSelectData.filter((item: unknown): unknown => { // @ts-ignore if (item.depth === 0) { // @ts-ignore diff --git a/ide/src/trace/component/SpHelp.ts b/ide/src/trace/component/SpHelp.ts index dcb5a1be3..f75e7a1e0 100644 --- a/ide/src/trace/component/SpHelp.ts +++ b/ide/src/trace/component/SpHelp.ts @@ -40,7 +40,6 @@ export class SpHelp extends BaseElement { } initElements(): void { - let that = this; let parentElement = this.parentNode as HTMLElement; parentElement.style.overflow = 'hidden'; this.appContent = this.shadowRoot?.querySelector('#app-content') as HTMLElement; @@ -51,7 +50,7 @@ export class SpHelp extends BaseElement { color.style.display = 'none'; header.style.display = 'none'; version.style.display = 'none'; - this.setupMainMenu(mainMenu, that); + this.setupMainMenu(mainMenu, this); mainMenu.style.width = '330px'; let body = mainMenu.shadowRoot?.querySelector('.menu-body') as HTMLDivElement; let groups = body.querySelectorAll('lit-main-menu-group'); @@ -74,16 +73,16 @@ export class SpHelp extends BaseElement { }); let urlParams = new URL(window.location.href).searchParams; if (urlParams && urlParams.get('action') && urlParams.get('action')!.length > 4) { - this.itemHelpClick(urlParams, that); + this.itemHelpClick(urlParams); } } - private itemHelpClick(urlParams: URLSearchParams, that: this): void { + private itemHelpClick(urlParams: URLSearchParams): void { if (urlParams.get('action')!.length > 4) { let helpDocIndex = urlParams.get('action')!.substring(5); let helpDocDetail = this.getEventDefinitionByIndex(Number(helpDocIndex)); - that.appContent!.innerHTML = ``; } } diff --git a/ide/src/trace/component/SpQuerySQL.ts b/ide/src/trace/component/SpQuerySQL.ts index b888b1176..84a10a45b 100644 --- a/ide/src/trace/component/SpQuerySQL.ts +++ b/ide/src/trace/component/SpQuerySQL.ts @@ -191,27 +191,30 @@ export class SpQuerySQL extends BaseElement { } private setPageNationTableEl(): void { - let that = this; - let timeOutTs: number = 200; - let indexNumber = 1; + const timeOutTs: number = 200; + const indexNumber = 1; + setTimeout(() => { - let total = this.statDataArray.length; + const total = this.statDataArray.length; + if (total > maxPageSize) { - that.pagination!.style.display = 'block'; - that.pagination!.style.opacity = '1'; + this.pagination!.style.display = 'block'; + this.pagination!.style.opacity = '1'; + new PageNation(this.pagination, { current: 1, - total: total, - pageSize: pageSize, - change(num: number): void { - that.sliceData = that.statDataArray!.slice((num - indexNumber) * pageSize, num * pageSize); - that.queryTableEl!.recycleDataSource = that.sliceData; + total, + pageSize, + change: (num: number): void => { + this.sliceData = this.statDataArray!.slice((num - indexNumber) * pageSize, num * pageSize); + this.queryTableEl!.recycleDataSource = this.sliceData; }, }); } else { - that.pagination!.style.opacity = '0'; + this.pagination!.style.opacity = '0'; this.queryTableEl!.recycleDataSource = this.statDataArray; } + this.freshTableHeadResizeStyle(); this.progressLoad!.loading = false; }, timeOutTs); diff --git a/ide/src/trace/component/SpRecordTrace.ts b/ide/src/trace/component/SpRecordTrace.ts index bcbd6017f..cb2ffb111 100644 --- a/ide/src/trace/component/SpRecordTrace.ts +++ b/ide/src/trace/component/SpRecordTrace.ts @@ -816,17 +816,16 @@ export class SpRecordTrace extends BaseElement { clickHandlerFun?: Function, fileChoose: boolean = false ): MenuItem { - let that = this; return { title: title, icon: icon, fileChoose: fileChoose, clickHandler: (): void => { - that.appContent!.innerHTML = ''; - that.appContent!.append(configPage); - that.freshMenuItemsStatus(title); + this.appContent!.innerHTML = ''; + this.appContent!.append(configPage); + this.freshMenuItemsStatus(title); if (clickHandlerFun) { - clickHandlerFun(that); + clickHandlerFun(this); } }, }; diff --git a/ide/src/trace/component/SpSystemTrace.event.ts b/ide/src/trace/component/SpSystemTrace.event.ts index 76e0899f3..c83aaa083 100644 --- a/ide/src/trace/component/SpSystemTrace.event.ts +++ b/ide/src/trace/component/SpSystemTrace.event.ts @@ -203,7 +203,8 @@ function jankClickHandlerFunc(sp: SpSystemTrace): Function { // 绘制跟自己关联的线 datas.forEach((data) => { //@ts-ignore - let endParentRow = sp.shadowRoot?.querySelector>( // @ts-ignore + let endParentRow = sp.shadowRoot?.querySelector>( + // @ts-ignore `trace-row[row-type='process'][row-id='${data.pid}'][folder]` ); sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data, true); @@ -372,7 +373,7 @@ function allStructOnClick(clickRowType: string, sp: SpSystemTrace, row?: TraceRo sp.refreshCanvas(true); } }) - .catch((e): void => {}); + .catch((e): void => { }); } export default function spSystemTraceOnClickHandler( sp: SpSystemTrace, @@ -662,7 +663,7 @@ function handleTimerShaftActions(ev: MouseEvent, sp: SpSystemTrace): void { // 如果没有找到帽子,则绘制一个旗子 let time = Math.round( (x * (TraceRow.range?.endNS! - TraceRow.range?.startNS!)) / sp.timerShaftEL!.canvas!.offsetWidth + - TraceRow.range?.startNS! + TraceRow.range?.startNS! ); sp.timerShaftEL!.sportRuler!.drawTriangle(time, 'squre'); } diff --git a/ide/src/trace/component/SpSystemTrace.init.ts b/ide/src/trace/component/SpSystemTrace.init.ts index 7a033fc26..6bc445421 100644 --- a/ide/src/trace/component/SpSystemTrace.init.ts +++ b/ide/src/trace/component/SpSystemTrace.init.ts @@ -34,14 +34,14 @@ import { TraceSheet } from './trace/base/TraceSheet'; import { TimerShaftElement } from './trace/TimerShaftElement'; import { SpChartList } from './trace/SpChartList'; type HTMLElementAlias = HTMLElement | null | undefined; -function rightButtonOnClick(sp: SpSystemTrace, rightStar: HTMLElementAlias): any { +function rightButtonOnClick(sp: SpSystemTrace, rightStar: HTMLElementAlias): unknown { Object.assign(sp, { ext(): string { return 'Handle the right button click event'; }, }); - return function (event: any): void { + return function (event: unknown): void { if (SpSystemTrace.btnTimer) { return; } @@ -78,7 +78,7 @@ function rightButtonOnClick(sp: SpSystemTrace, rightStar: HTMLElementAlias): any }; } function rightStarOnClick(sp: SpSystemTrace) { - return function (ev: any): void { + return function (ev: unknown): void { let wakeupLists = []; wakeupLists.push(CpuStruct.selectCpuStruct?.cpu); for (let wakeupBean of SpSystemTrace.wakeupList) { @@ -86,57 +86,80 @@ function rightStarOnClick(sp: SpSystemTrace) { } let wakeupCpuLists = Array.from(new Set(wakeupLists)).sort(); for (let wakeupCpu of wakeupCpuLists) { - let cpuFavoriteRow: any = sp.shadowRoot?.querySelector>( + // @ts-ignore + let cpuFavoriteRow: unknown = sp.shadowRoot?.querySelector>( `trace-row[row-type='cpu-data'][row-id='${wakeupCpu}']` ); if (cpuFavoriteRow === null || cpuFavoriteRow === undefined) { continue; } + // @ts-ignore cpuFavoriteRow!.setAttribute('collect-type', ''); let replaceRow = document.createElement('div'); + // @ts-ignore replaceRow.setAttribute('row-id', `${cpuFavoriteRow.rowId}-${cpuFavoriteRow.rowType}`); replaceRow.setAttribute('type', 'replaceRow'); + // @ts-ignore replaceRow.setAttribute('row-parent-id', cpuFavoriteRow.rowParentId); replaceRow.style.display = 'none'; + // @ts-ignore cpuFavoriteRow.rowHidden = !cpuFavoriteRow.hasAttribute('scene'); + // @ts-ignore if (sp.rowsEL!.contains(cpuFavoriteRow)) { + // @ts-ignore sp.rowsEL!.replaceChild(replaceRow, cpuFavoriteRow); } + // @ts-ignore cpuFavoriteRow.tampName = cpuFavoriteRow.name; + // @ts-ignore sp.favoriteChartListEL!.insertRow(cpuFavoriteRow, sp.currentCollectGroup, true); + // @ts-ignore sp.collectRows.push(cpuFavoriteRow); sp.timerShaftEL?.displayCollect(sp.collectRows.length !== 0); sp.currentClickRow = null; + // @ts-ignore cpuFavoriteRow.setAttribute('draggable', 'true'); + // @ts-ignore cpuFavoriteRow.addEventListener('dragstart', cpuFavoriteRowDragStart(sp, cpuFavoriteRow)); + // @ts-ignore cpuFavoriteRow.addEventListener('dragover', cpuFavoriteRowDragOver(sp)); + // @ts-ignore cpuFavoriteRow.addEventListener('drop', cpuFavoriteRowDropHandler(sp, cpuFavoriteRow)); + // @ts-ignore cpuFavoriteRow.addEventListener('dragend', cpuFavoriteRowDragendHandler(sp)); } sp.refreshFavoriteCanvas(); sp.refreshCanvas(true); }; } -function cpuFavoriteRowDragStart(sp: SpSystemTrace, cpuFavoriteRow: any) { +function cpuFavoriteRowDragStart(sp: SpSystemTrace, cpuFavoriteRow: unknown) { return function (): void { + // @ts-ignore sp.currentClickRow = cpuFavoriteRow; }; } function cpuFavoriteRowDragOver(sp: SpSystemTrace) { - return function (ev: any): void { + return function (ev: unknown): void { + // @ts-ignore ev.preventDefault(); + // @ts-ignore ev.dataTransfer.dropEffect = 'move'; }; } -function cpuFavoriteRowDropHandler(sp: SpSystemTrace, cpuFavoriteRow: any) { - return function (ev: any): void { +function cpuFavoriteRowDropHandler(sp: SpSystemTrace, cpuFavoriteRow: unknown) { + return function (ev: unknown): void { if (sp.favoriteChartListEL && sp.currentClickRow && sp.currentClickRow !== cpuFavoriteRow) { + // @ts-ignore let rect = cpuFavoriteRow.getBoundingClientRect(); + // @ts-ignore if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { //向上移动 + // @ts-ignore sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow); + // @ts-ignore } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { //向下移动 + // @ts-ignore sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow.nextSibling); } sp.refreshFavoriteCanvas(); @@ -162,25 +185,33 @@ function cpuFavoriteRowDragendHandler(sp: SpSystemTrace): () => void { sp.currentClickRow = null; }; } -function triangleFlagHandler(sp: SpSystemTrace): (event: any) => void { - return function (event: any): void { +function triangleFlagHandler(sp: SpSystemTrace): (event: unknown) => void { + return function (event: unknown): void { + // @ts-ignore let temporaryTime = sp.timerShaftEL?.drawTriangle(event.detail.time, event.detail.type); + // @ts-ignore if (event.detail.timeCallback && temporaryTime) { + // @ts-ignore event.detail.timeCallback(temporaryTime); } }; } -function numberCalibrationHandler(sp: SpSystemTrace): (event: any) => void { - return function (event: any): void { +function numberCalibrationHandler(sp: SpSystemTrace): (event: unknown) => void { + return function (event: unknown): void { + // @ts-ignore sp.timerShaftEL!.sportRuler!.times = event.detail.time; + // @ts-ignore sp.timerShaftEL!.sportRuler!.counts = event.detail.counts; + // @ts-ignore sp.timerShaftEL!.sportRuler!.durations = event.detail.durations; sp.timerShaftEL!.sportRuler?.draw(); }; } -function flagChangeHandler(sp: SpSystemTrace): (event: any) => void { - return function (event: any): void { +function flagChangeHandler(sp: SpSystemTrace): (event: unknown) => void { + return function (event: unknown): void { + // @ts-ignore sp.timerShaftEL?.modifyFlagList(event.detail); + // @ts-ignore if (event.detail.hidden) { sp.selectFlag = undefined; if (sp._flagList.length <= 0) { @@ -196,9 +227,11 @@ function flagChangeHandler(sp: SpSystemTrace): (event: any) => void { } }; } -function slicesChangeHandler(sp: SpSystemTrace): (event: any) => void { - return function (event: any): void { +function slicesChangeHandler(sp: SpSystemTrace): (event: unknown) => void { + return function (event: unknown): void { + // @ts-ignore sp.timerShaftEL?.modifySlicesList(event.detail); + // @ts-ignore if (event.detail.hidden) { sp.slicestime = null; if (sp._slicesList.length <= 0) { @@ -214,8 +247,9 @@ function slicesChangeHandler(sp: SpSystemTrace): (event: any) => void { } }; } -function collectHandler(sp: SpSystemTrace): (event: any) => void { - return function (event: any): void { +function collectHandler(sp: SpSystemTrace): (event: unknown) => void { + return function (event: unknown): void { + // @ts-ignore let currentRow = event.detail.row; if (currentRow.collect) { collectHandlerYes(sp, currentRow, event); @@ -248,17 +282,22 @@ function collectHandler(sp: SpSystemTrace): (event: any) => void { currentRow.addEventListener('dragstart', () => { sp.currentClickRow = currentRow; }); - currentRow.addEventListener('dragover', (ev: any) => { + currentRow.addEventListener('dragover', (ev: unknown) => { + // @ts-ignore ev.preventDefault(); + // @ts-ignore ev.dataTransfer.dropEffect = 'move'; }); currentRow.addEventListener('drop', collectHandlerDrop(sp, currentRow)); currentRow.addEventListener('dragend', collectHandlerDragEnd(sp)); }; } -function collectHandlerNo(sp: SpSystemTrace, currentRow: any, event: any): void { +function collectHandlerNo(sp: SpSystemTrace, currentRow: unknown, event: unknown): void { + // @ts-ignore sp.favoriteChartListEL?.deleteRow(currentRow, event.detail.type !== 'auto-collect'); + // @ts-ignore if (event.detail.type !== 'auto-collect') { + // @ts-ignore let rowIndex = sp.collectRows.indexOf(currentRow); if (rowIndex !== -1) { sp.collectRows.splice(rowIndex, 1); @@ -266,7 +305,9 @@ function collectHandlerNo(sp: SpSystemTrace, currentRow: any, event: any): void } let row = currentRow; let allowExpansionRow = []; + // @ts-ignore while (row.hasParentRowEl) { + // @ts-ignore let parent = row.parentRowEl; allowExpansionRow.push(parent); row = parent; @@ -282,63 +323,84 @@ function collectHandlerNo(sp: SpSystemTrace, currentRow: any, event: any): void } allowExpansionRow.length = 0; let replaceRow = sp.rowsEL!.querySelector( + // @ts-ignore `div[row-id='${currentRow.rowId}-${currentRow.rowType}']` ); // 取消收藏时,删除父亲ID + // @ts-ignore currentRow.name = currentRow.tampName; if (replaceRow !== null) { + // @ts-ignore sp.rowsEL!.replaceChild(currentRow, replaceRow); + // @ts-ignore currentRow.style.boxShadow = '0 10px 10px #00000000'; } } -function collectHandlerYes(sp: SpSystemTrace, currentRow: any, event: any): void { +function collectHandlerYes(sp: SpSystemTrace, currentRow: unknown, event: unknown): void { if ( !sp.collectRows.find((find) => { return find === currentRow; }) ) { + // @ts-ignore sp.collectRows.push(currentRow); } let replaceRow = document.createElement('div'); + // @ts-ignore replaceRow.setAttribute('row-id', `${currentRow.rowId}-${currentRow.rowType}`); replaceRow.setAttribute('type', 'replaceRow'); + // @ts-ignore replaceRow.setAttribute('row-parent-id', currentRow.rowParentId); replaceRow.style.display = 'none'; + // @ts-ignore if (!currentRow.hasAttribute('scene')) { + // @ts-ignore currentRow.setAttribute('row-hidden', ''); } else { + // @ts-ignore currentRow.removeAttribute('row-hidden'); } // 添加收藏时,在线程名前面追加父亲ID + // @ts-ignore let rowParentId = currentRow.rowParentId; + // @ts-ignore currentRow.tampName = currentRow.name; if (rowParentId) { - let parentRows = sp.shadowRoot?.querySelectorAll>(`trace-row[row-id='${rowParentId}']`); + // @ts-ignore + let parentRows = sp.shadowRoot?.querySelectorAll>(`trace-row[row-id='${rowParentId}']`); parentRows?.forEach((parentRow) => { if ( parentRow?.name && + // @ts-ignore parentRow?.name !== currentRow.name && !parentRow.rowType!.startsWith('cpu') && !parentRow.rowType!.startsWith('thread') && !parentRow.rowType!.startsWith('func') && + // @ts-ignore !currentRow.name.includes(parentRow.name) ) { + // @ts-ignore currentRow.name += `(${parentRow.name})`; } }); } + // @ts-ignore if (!currentRow.hasParentRowEl) { + // @ts-ignore sp.rowsEL!.replaceChild(replaceRow, currentRow); } + // @ts-ignore sp.favoriteChartListEL?.insertRow(currentRow, sp.currentCollectGroup, event.detail.type !== 'auto-collect'); } -function collectHandlerDrop(sp: SpSystemTrace, currentRow: HTMLDivElement | undefined | null): (ev: any) => void { - return function (ev: any) { +function collectHandlerDrop(sp: SpSystemTrace, currentRow: HTMLDivElement | undefined | null): (ev: unknown) => void { + return function (ev: unknown) { if (sp.favoriteChartListEL !== null && sp.currentClickRow !== null && sp.currentClickRow !== currentRow) { let rect = currentRow!.getBoundingClientRect(); + // @ts-ignore if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { //向上移动 sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow!); + // @ts-ignore } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { //向下移动 sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow!.nextSibling!); @@ -347,8 +409,8 @@ function collectHandlerDrop(sp: SpSystemTrace, currentRow: HTMLDivElement | unde } }; } -function collectHandlerDragEnd(sp: SpSystemTrace): (ev: any) => void { - return function (ev: any): void { +function collectHandlerDragEnd(sp: SpSystemTrace): (ev: unknown) => void { + return function (ev: unknown): void { sp.linkNodes.forEach((itln) => { if (itln[0].rowEL.collect) { if (sp.timerShaftEL?._checkExpand) { @@ -385,7 +447,8 @@ function selectHandler(sp: SpSystemTrace): void { }); if (rows.length === 0) { const allRows = [ - ...sp.shadowRoot!.querySelectorAll>('trace-row'), + // @ts-ignore + ...sp.shadowRoot!.querySelectorAll>('trace-row'), ...sp.favoriteChartListEL!.getAllCollectRows(), ]; for (const row of allRows) { @@ -405,7 +468,8 @@ function selectHandler(sp: SpSystemTrace): void { let checkRows = rows; if (!refreshCheckBox) { checkRows = [ - ...sp.shadowRoot!.querySelectorAll>("trace-row[check-type='2']"), + // @ts-ignore + ...sp.shadowRoot!.querySelectorAll>("trace-row[check-type='2']"), ...sp.favoriteChartListEL!.getAllSelectCollectRows(), ]; } @@ -416,7 +480,8 @@ function selectHandler(sp: SpSystemTrace): void { selectHandlerRows(sp, checkRows); }; } -function selectHandlerRefreshCheckBox(sp: SpSystemTrace, rows: Array>, refreshCheckBox: boolean): void { +// @ts-ignore +function selectHandlerRefreshCheckBox(sp: SpSystemTrace, rows: Array>, refreshCheckBox: boolean): void { if (refreshCheckBox) { if (rows.length > 0) { sp.queryAllTraceRow().forEach((row) => { @@ -437,12 +502,14 @@ function selectHandlerRefreshCheckBox(sp: SpSystemTrace, rows: Array>): void { +// @ts-ignore +function selectHandlerRows(sp: SpSystemTrace, rows: Array>): void { let selection = new SelectionParam(); selection.cpuStateRowsId = sp.stateRowsId; selection.leftNs = TraceRow.rangeSelectObject?.startNS || 0; selection.rightNs = TraceRow.rangeSelectObject?.endNS || 0; - selection.recordStartNs = (window as any).recordStartNS; + // @ts-ignore + selection.recordStartNs = (window as unknown).recordStartNS; rows.forEach((it) => { selection.pushSelection(it, sp); if (sp.rangeTraceRow!.length !== rows.length) { @@ -491,7 +558,8 @@ function resizeObserverHandler(sp: SpSystemTrace): void { TraceRow.FRAME_WIDTH = sp.clientWidth - 249 - sp.getScrollWidth(); requestAnimationFrame(() => { sp.timerShaftEL?.updateWidth(sp.clientWidth - 1 - sp.getScrollWidth()); - sp.shadowRoot!.querySelectorAll>('trace-row').forEach((it) => { + // @ts-ignore + sp.shadowRoot!.querySelectorAll>('trace-row').forEach((it) => { it.updateWidth(sp.clientWidth); }); }); @@ -535,7 +603,8 @@ function intersectionObserverHandler(sp: SpSystemTrace): void { sp.intersectionObserver = new IntersectionObserver( (entries) => { entries.forEach((it) => { - let tr = it.target as TraceRow; + // @ts-ignore + let tr = it.target as TraceRow; // 目标元素的可见比例 tr.intersectionRatio = it.intersectionRatio; // 判断目标元素是否可见 isIntersecting为true是可见 @@ -592,7 +661,8 @@ function smartEventSubscribe(sp: SpSystemTrace): void { window.subscribe(window.SmartEvent.UI.CollapseAllLane, (collapse: boolean) => { if (!collapse) { // 一键折叠之前,记录当前打开的泳道图 - sp.expandRowList = Array.from(sp.rowsEL!.querySelectorAll>('trace-row[folder][expansion]')) || []; + // @ts-ignore + sp.expandRowList = Array.from(sp.rowsEL!.querySelectorAll>('trace-row[folder][expansion]')) || []; } sp.collapseAll = true; sp.setAttribute('disable', ''); @@ -659,6 +729,7 @@ export function spSystemTraceInitElement(sp: SpSystemTrace): void { sp.tabCpuFreq = sp.traceSheetEL.shadowRoot.querySelector('tabpane-frequency-sample'); sp.tabCpuState = sp.traceSheetEL.shadowRoot.querySelector('tabpane-counter-sample'); sp.rangeSelect = new RangeSelect(sp); + // @ts-ignore rightButton?.addEventListener('click', rightButtonOnClick(sp, rightStar)); rightStar?.addEventListener('click', rightStarOnClick(sp)); documentInitEvent(sp); @@ -674,23 +745,30 @@ export function spSystemTraceInitElement(sp: SpSystemTrace): void { smartEventSubscribe(sp); } -function moveRangeToCenterAndHighlight(sp: SpSystemTrace, findEntry: any): void { +function moveRangeToCenterAndHighlight(sp: SpSystemTrace, findEntry: unknown): void { if (findEntry) { + // @ts-ignore if (findEntry.startTime > TraceRow.range!.endNS || findEntry.startTime + findEntry.dur < TraceRow.range!.startNS) { + // @ts-ignore sp.moveRangeToLeft(findEntry.startTime!, findEntry.dur!); } sp.queryAllTraceRow().forEach((item) => { item.highlight = false; }); + // @ts-ignore if (findEntry.type === 'cpu') { findEntryTypeCpu(sp, findEntry); + // @ts-ignore } else if (findEntry.type === 'func') { findEntryTypeFunc(sp, findEntry); + // @ts-ignore } else if (findEntry.type === 'thread||process') { findEntryTypeThreadProcess(sp, findEntry); + // @ts-ignore } else if (findEntry.type === 'sdk') { findEntryTypeSdk(sp, findEntry); } + // @ts-ignore sp.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); } } @@ -699,20 +777,21 @@ export function spSystemTraceShowStruct( sp: SpSystemTrace, previous: boolean, currentIndex: number, - structs: Array, + structs: Array, retargetIndex?: number ): number { if (structs.length === 0) { return 0; } let findIndex = spSystemTraceShowStructFindIndex(previous, currentIndex, structs, retargetIndex); - let findEntry: any; + let findEntry: unknown; if (findIndex >= 0) { findEntry = structs[findIndex]; } else { if (previous) { for (let i = structs.length - 1; i >= 0; i--) { let it = structs[i]; + // @ts-ignore if (it.startTime! + it.dur! < TraceRow.range!.startNS) { findIndex = i; break; @@ -722,6 +801,7 @@ export function spSystemTraceShowStruct( findIndex = structs.length - 1; } } else { + // @ts-ignore findIndex = structs.findIndex((it) => it.startTime! > TraceRow.range!.endNS); if (findIndex === -1) { findIndex = 0; @@ -735,7 +815,7 @@ export function spSystemTraceShowStruct( function spSystemTraceShowStructFindIndex( previous: boolean, currentIndex: number, - structs: Array, + structs: Array, retargetIndex: number | undefined ): number { const rangeStart = TraceRow.range!.startNS; @@ -751,6 +831,7 @@ function spSystemTraceShowStructFindIndex( } else { for (let i = structs.length - 1; i >= 0; i--) { let it = structs[i]; + // @ts-ignore if (i < currentIndex && it.startTime! >= rangeStart && it.startTime! + it.dur! <= rangeEnd) { findIndex = i; break; @@ -762,7 +843,9 @@ function spSystemTraceShowStructFindIndex( if (SpSystemTrace.currentStartTime > rangeStart) { SpSystemTrace.currentStartTime = rangeStart; if ( + // @ts-ignore structs[currentIndex].startTime < rangeStart || + // @ts-ignore structs[currentIndex].startTime! + structs[currentIndex].dur! > rangeEnd ) { currentIndex = -1; @@ -774,59 +857,78 @@ function spSystemTraceShowStructFindIndex( } } findIndex = structs.findIndex((it, idx) => { + // @ts-ignore return idx > currentIndex && it.startTime! >= rangeStart && it.startTime! + it.dur! <= rangeEnd; }); } return findIndex; } -function findEntryTypeCpu(sp: SpSystemTrace, findEntry: any): void { +function findEntryTypeCpu(sp: SpSystemTrace, findEntry: unknown): void { + // @ts-ignore CpuStruct.selectCpuStruct = findEntry; CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; sp.queryAllTraceRow("trace-row[row-type='cpu-data']", (row): boolean => row.rowType === 'cpu-data').forEach( (item): void => { + // @ts-ignore if (item.rowId === `${findEntry.cpu}`) { sp.rechargeCpuData( - findEntry, // @ts-ignore + // @ts-ignore + findEntry, + // @ts-ignore item.dataListCache.find((it) => it.startTime > findEntry.startTime) ); item.fixedList = [findEntry]; } + // @ts-ignore item.highlight = item.rowId === `${findEntry.cpu}`; item.draw(true); } ); + // @ts-ignore sp.scrollToProcess(`${findEntry.cpu}`, '', 'cpu-data', true); sp.onClickHandler(TraceRow.ROW_TYPE_CPU); } -function findEntryTypeFunc(sp: SpSystemTrace, findEntry: any): void { +function findEntryTypeFunc(sp: SpSystemTrace, findEntry: unknown): void { sp.observerScrollHeightEnable = true; sp.scrollToActFunc( { + // @ts-ignore startTs: findEntry.startTime, + // @ts-ignore dur: findEntry.dur, + // @ts-ignore tid: findEntry.tid, + // @ts-ignore pid: findEntry.pid, + // @ts-ignore depth: findEntry.depth, + // @ts-ignore argsetid: findEntry.argsetid, + // @ts-ignore funName: findEntry.funName, + // @ts-ignore cookie: findEntry.cookie, }, true ); } -function findEntryTypeThreadProcess(sp: SpSystemTrace, findEntry: any): void { +function findEntryTypeThreadProcess(sp: SpSystemTrace, findEntry: unknown): void { let threadProcessRow = sp.rowsEL?.querySelectorAll>('trace-row')[0]; if (threadProcessRow) { let filterRow = threadProcessRow.childrenList.filter( + // @ts-ignore (row) => row.rowId === findEntry.rowId && row.rowId === findEntry.rowType )[0]; filterRow!.highlight = true; + // @ts-ignore sp.closeAllExpandRows(findEntry.rowParentId); + // @ts-ignore sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); let completeEntry = (): void => { sp.hoverStructNull(); sp.selectStructNull(); sp.wakeupListNull(); + // @ts-ignore sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); }; if (filterRow!.isComplete) { @@ -836,10 +938,12 @@ function findEntryTypeThreadProcess(sp: SpSystemTrace, findEntry: any): void { } } } -function findEntryTypeSdk(sp: SpSystemTrace, findEntry: any): void { - let parentRow = sp.shadowRoot!.querySelector>("trace-row[row-type='sdk'][folder]"); +function findEntryTypeSdk(sp: SpSystemTrace, findEntry: unknown): void { + // @ts-ignore + let parentRow = sp.shadowRoot!.querySelector>("trace-row[row-type='sdk'][folder]"); if (parentRow) { let sdkRow = parentRow.childrenList.filter( + // @ts-ignore (child) => child.rowId === findEntry.rowId && child.rowType === findEntry.rowType )[0]; sdkRow!.highlight = true; @@ -847,8 +951,11 @@ function findEntryTypeSdk(sp: SpSystemTrace, findEntry: any): void { sp.hoverStructNull(); sp.selectStructNull(); sp.wakeupListNull(); + // @ts-ignore sp.onClickHandler(findEntry.rowType!); + // @ts-ignore sp.closeAllExpandRows(findEntry.rowParentId); + // @ts-ignore sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); } async function spSystemTraceInitBuffer( @@ -903,7 +1010,7 @@ export async function spSystemTraceInit( param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function -): Promise { +): Promise { progress('Load database', 6); sp.rowsPaneEL!.scroll({ top: 0, left: 0 }); let rsBuf = await spSystemTraceInitBuffer(sp, param, wasmConfigUri, progress); @@ -916,7 +1023,8 @@ export async function spSystemTraceInit( } await sp.chartManager?.init(progress); let rowId: string = ''; - sp.rowsEL?.querySelectorAll>('trace-row').forEach((it) => { + // @ts-ignore + sp.rowsEL?.querySelectorAll>('trace-row').forEach((it) => { if (it.name.includes('Ark Ts')) { rowId = it.rowId!; } @@ -927,7 +1035,8 @@ export async function spSystemTraceInit( progress('completed', 100); info('All TraceRow Data initialized'); sp.loadTraceCompleted = true; - sp.rowsEL!.querySelectorAll>('trace-row').forEach((it) => { + // @ts-ignore + sp.rowsEL!.querySelectorAll>('trace-row').forEach((it) => { if (rowId !== '' && (it.rowId?.includes(rowId) || it.name.includes(rowId))) { it.addTemplateTypes('Ark Ts'); for (let child of it.childrenList) { @@ -935,7 +1044,7 @@ export async function spSystemTraceInit( } } if (it.folder) { - let offsetYTimeOut: any = undefined; + let offsetYTimeOut: unknown = undefined; it.addEventListener('expansion-change', expansionChangeHandler(sp, offsetYTimeOut)); } if (sp.loadTraceCompleted) { @@ -946,21 +1055,26 @@ export async function spSystemTraceInit( }); return { status: true, msg: 'success' }; } -function expansionChangeHandler(sp: SpSystemTrace, offsetYTimeOut: any): (event: any) => void { - return function (event: any) { +function expansionChangeHandler(sp: SpSystemTrace, offsetYTimeOut: unknown): (event: unknown) => void { + return function (event: unknown) { let max = [...sp.rowsPaneEL!.querySelectorAll('trace-row')].reduce((pre, cur) => pre + cur.clientHeight!, 0); let offset = sp.rowsPaneEL!.scrollHeight - max; sp.rowsPaneEL!.scrollTop = sp.rowsPaneEL!.scrollTop - offset; JankStruct.delJankLineFlag = false; if (offsetYTimeOut) { + // @ts-ignore clearTimeout(offsetYTimeOut); } + // @ts-ignore if (event.detail.expansion) { offsetYTimeOut = setTimeout(() => { sp.linkNodes.forEach((linkNode) => { - JankStruct.selectJankStructList?.forEach((selectStruct: any) => { + JankStruct.selectJankStructList?.forEach((selectStruct: unknown) => { + // @ts-ignore if (event.detail.rowId === selectStruct.pid) { + // @ts-ignore JankStruct.selectJankStruct = selectStruct; + // @ts-ignore JankStruct.hoverJankStruct = selectStruct; } }); @@ -1040,8 +1154,10 @@ export function spSystemTraceParentRowSticky(sp: SpSystemTrace, deltaY: number): if (deltaY > 0) { // 从上往下划 const expandRowList = sp.visibleRows.filter((vr) => vr.expansion); - expandRowList.forEach((vr: TraceRow) => { - const visibleNotCollectList = vr.childrenList.filter((child: TraceRow) => !child.collect && !child.sleeping); + // @ts-ignore + expandRowList.forEach((vr: TraceRow) => { + // @ts-ignore + const visibleNotCollectList = vr.childrenList.filter((child: TraceRow) => !child.collect && !child.sleeping); vr.sticky = visibleNotCollectList.length > 0; }); } else if (deltaY < 0) { diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 39b4a5705..b42eec42a 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -2260,7 +2260,6 @@ export class SpSystemTrace extends BaseElement { TabPaneCurrentSelection.queryCPUWakeUpListFromBean(data).then((a: unknown) => { if (a === null) { window.publish(window.SmartEvent.UI.WakeupList, SpSystemTrace.wakeupList); - return null; } // @ts-ignore SpSystemTrace.wakeupList.push(a); // @ts-ignore this.queryCPUWakeUpList(a); diff --git a/ide/src/trace/component/chart/FrameChart.ts b/ide/src/trace/component/chart/FrameChart.ts index ac8497ca5..f76abc482 100644 --- a/ide/src/trace/component/chart/FrameChart.ts +++ b/ide/src/trace/component/chart/FrameChart.ts @@ -103,6 +103,8 @@ export class FrameChart extends BaseElement { return node.drawDur || node.dur; case ChartMode.EventCount: return node.drawEventCount || node.eventCount; + default: + return node.drawSize || node.size; } } @@ -545,6 +547,8 @@ export class FrameChart extends BaseElement { return ignore.dur; case ChartMode.EventCount: return ignore.eventCount; + default: + return ignore.size; } } @@ -558,6 +562,8 @@ export class FrameChart extends BaseElement { return node.searchDur > 0; case ChartMode.EventCount: return node.searchEventCount > 0; + default: + return node.searchSize > 0; } } diff --git a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts index e2ab376ce..7ce449782 100644 --- a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts +++ b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts @@ -221,7 +221,7 @@ export class SpAbilityMonitorChart { context = userTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } userTraceRow.canvasSave(context); - (renders['monitorCpu'] as CpuAbilityRender).renderMainThread( + (renders.monitorCpu as CpuAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -268,7 +268,7 @@ export class SpAbilityMonitorChart { context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); - (renders['monitorCpu'] as CpuAbilityRender).renderMainThread( + (renders.monitorCpu as CpuAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -318,7 +318,7 @@ export class SpAbilityMonitorChart { context = sysTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } sysTraceRow.canvasSave(context); - (renders['monitorCpu'] as CpuAbilityRender).renderMainThread( + (renders.monitorCpu as CpuAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -345,7 +345,7 @@ export class SpAbilityMonitorChart { context = memoryUsedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } memoryUsedRow.canvasSave(context); - (renders['monitorMemory'] as MemoryAbilityRender).renderMainThread( + (renders.monitorMemory as MemoryAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -408,7 +408,7 @@ export class SpAbilityMonitorChart { context = cachedFilesTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } cachedFilesTraceRow.canvasSave(context); - (renders['monitorMemory'] as MemoryAbilityRender).renderMainThread( + (renders.monitorMemory as MemoryAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -470,7 +470,7 @@ export class SpAbilityMonitorChart { context = compressedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } compressedRow.canvasSave(context); - (renders['monitorMemory'] as MemoryAbilityRender).renderMainThread( + (renders.monitorMemory as MemoryAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -549,7 +549,7 @@ export class SpAbilityMonitorChart { context = bytesReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } bytesReadRow.canvasSave(context); - (renders['monitorDiskIo'] as DiskIoAbilityRender).renderMainThread( + (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -607,7 +607,7 @@ export class SpAbilityMonitorChart { context = bytesWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } bytesWriteRow.canvasSave(context); - (renders['monitorDiskIo'] as DiskIoAbilityRender).renderMainThread( + (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -696,7 +696,7 @@ export class SpAbilityMonitorChart { context = readOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } readOpsRow.canvasSave(context); - (renders['monitorDiskIo'] as DiskIoAbilityRender).renderMainThread( + (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -722,7 +722,7 @@ export class SpAbilityMonitorChart { context = writeOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } writeOpsRow.canvasSave(context); - (renders['monitorDiskIo'] as DiskIoAbilityRender).renderMainThread( + (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -803,7 +803,7 @@ export class SpAbilityMonitorChart { context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); - (renders['monitorNetwork'] as NetworkAbilityRender).renderMainThread( + (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -861,7 +861,7 @@ export class SpAbilityMonitorChart { context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); - (renders['monitorNetwork'] as NetworkAbilityRender).renderMainThread( + (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -920,7 +920,7 @@ export class SpAbilityMonitorChart { context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); - (renders['monitorNetwork'] as NetworkAbilityRender).renderMainThread( + (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( { context: context, useCache: useCache, @@ -979,7 +979,7 @@ export class SpAbilityMonitorChart { context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); - (renders['monitorNetwork'] as NetworkAbilityRender).renderMainThread( + (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( { context: context, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpBpftraceChart.ts b/ide/src/trace/component/chart/SpBpftraceChart.ts index 964ea69f7..32a6268f5 100644 --- a/ide/src/trace/component/chart/SpBpftraceChart.ts +++ b/ide/src/trace/component/chart/SpBpftraceChart.ts @@ -224,7 +224,7 @@ export class SpBpftraceChart { newNode['property'] = []; result.push(newNode); if (node.children) { - result = result.concat(this.getFlattenTreeData(node.children, depth + 1, node['function_name'])); + result = result.concat(this.getFlattenTreeData(node.children, depth + 1, node.function_name)); } }); return result; @@ -240,7 +240,7 @@ export class SpBpftraceChart { propertyData.forEach((propertyGroup) => { const groups: Array = []; propertyGroup.forEach((property: any) => { - const duplicateObj = groups.find((group) => group['func_name'] === property['func_name']); + const duplicateObj = groups.find((group) => group.func_name === property.func_name); if (duplicateObj) { duplicateObj['begin'] = Math.min(duplicateObj['begin'], property['begin']); duplicateObj['end'] = Math.max(duplicateObj['end'], property['end']); @@ -263,7 +263,7 @@ export class SpBpftraceChart { //数组每一项进行比对 propertyData.forEach((propertyGroup) => { propertyGroup.forEach((property: any) => { - const relation = sampleProperty.find((relation) => relation['name'] === property['func_name']); + const relation = sampleProperty.find((relation) => relation.name === property.func_name); //property属性存储每帧数据 relation?.property.push({ name: property['func_name'], @@ -272,13 +272,13 @@ export class SpBpftraceChart { begin: property['begin'], depth: relation['depth'], instructions: property['instructions'], - cycles: property['cycles'], + cycles: property.cycles, }); }); }); //获取所有名字为unknown的数据 - const unknownRelation = sampleProperty.filter((relation) => relation['name'].indexOf('unknown') > -1); + const unknownRelation = sampleProperty.filter((relation) => relation.name.indexOf('unknown') > -1); //二维数组 用于存放unknown下所有子节点的数据 let twoDimensionalArray: Array = []; let result: Array = []; @@ -288,7 +288,7 @@ export class SpBpftraceChart { const children = unknownItem['children']; //先获取到unknwon节点下每个子节点的property Object.keys(children).forEach((key) => { - unknownItem.children[key] = sampleProperty.find((relation) => relation['name'] === key).property; + unknownItem.children[key] = sampleProperty.find((relation) => relation.name === key).property; }); //将每个子节点的property加到二维数组中 Object.values(children).forEach((value: any) => { @@ -304,11 +304,11 @@ export class SpBpftraceChart { detail: unknownItem['detail'], begin: twoDimensionalArray[0][i].begin, end: 0, - depth: unknownItem['depth'], + depth: unknownItem.depth, }; for (let j = 0; j < twoDimensionalArray.length; j++) { - data['end'] = Math.max(twoDimensionalArray[j][i]['end'], data['end']); - data['begin'] = Math.min(twoDimensionalArray[j][i]['begin'], data['begin']); + data.end = Math.max(twoDimensionalArray[j][i].end, data.end); + data.begin = Math.min(twoDimensionalArray[j][i].begin, data.begin); } result.push(data); } @@ -327,7 +327,7 @@ export class SpBpftraceChart { if (node['children']) { node['children'].forEach((child: any) => { if (child['function_name'].indexOf('unknown') < 0) { - names[child['function_name']] = []; + names[child.function_name] = []; } else { this.getUnknownAllChildrenNames(child, names); } diff --git a/ide/src/trace/component/chart/SpChartManager.ts b/ide/src/trace/component/chart/SpChartManager.ts index d55ba77e0..924b0a562 100644 --- a/ide/src/trace/component/chart/SpChartManager.ts +++ b/ide/src/trace/component/chart/SpChartManager.ts @@ -121,7 +121,7 @@ export class SpChartManager { appStartUpPids.forEach((it) => SpChartManager.APP_STARTUP_PID_ARR.push(it.pid)); } await this.initTraceConfig(); //@ts-ignore - dict.map((d) => SpSystemTrace.DATA_DICT.set(d['id'], d['data'])); + dict.map((d) => SpSystemTrace.DATA_DICT.set(d.id, d.data)); await this.cacheDataDictToWorker(); SpSystemTrace.DATA_TASK_POOL_CALLSTACK.clear(); let taskPoolCallStack = await queryTaskPoolCallStack(); @@ -209,7 +209,7 @@ export class SpChartManager { async importSoFileUpdate(): Promise { SpSystemTrace.DATA_DICT.clear(); let dict = await queryDataDICT(); //@ts-ignore - dict.map((d) => SpSystemTrace.DATA_DICT.set(d['id'], d['data'])); + dict.map((d) => SpSystemTrace.DATA_DICT.set(d.id, d.data)); await this.cacheDataDictToWorker(); await perfDataQuery.initPerfCache(); await this.nativeMemory.initNativeMemory(); @@ -306,7 +306,7 @@ export const folderThreadHandler = (row: TraceRow, trace: SpSystemTrace // @ts-ignore trace.canvasPanelCtx?.clearRect(0, 0, row.frame.width, row.frame.height); } else { - (renders['empty'] as EmptyRender).renderMainThread( + (renders.empty as EmptyRender).renderMainThread( { context: trace.canvasPanelCtx, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpClockChart.ts b/ide/src/trace/component/chart/SpClockChart.ts index 271db0057..96849bf91 100644 --- a/ide/src/trace/component/chart/SpClockChart.ts +++ b/ide/src/trace/component/chart/SpClockChart.ts @@ -103,7 +103,7 @@ export class SpClockChart { context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); - (renders['clock'] as ClockRender).renderMainThread( + (renders.clock as ClockRender).renderMainThread( { context: context, useCache: useCache, @@ -146,13 +146,15 @@ export class SpClockChart { traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; traceRow.selectChangeHandler = this.trace.selectChangeHandler; this.clockSupplierFrame(traceRow, it, isState, isScreenState); - traceRow.getCacheData = (args: unknown): Promise> | undefined => { + traceRow.getCacheData = (args: unknown): Promise> => { if (it.name.endsWith(' Frequency')) { return clockDataSender(it.srcname, 'clockFrequency', traceRow, args); } else if (isState) { return clockDataSender(it.srcname, 'clockState', traceRow, args); } else if (isScreenState) { return clockDataSender('', 'screenState', traceRow, args); + } else { + return new Promise((): void => {}); } }; traceRow.focusHandler = (ev): void => { @@ -190,7 +192,7 @@ export class SpClockChart { // @ts-ignore this.trace.canvasPanelCtx?.clearRect(0, 0, clockFolder.frame.width, clockFolder.frame.height); } else { - (renders['empty'] as EmptyRender).renderMainThread( + (renders.empty as EmptyRender).renderMainThread( { context: this.trace.canvasPanelCtx, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpEBPFChart.ts b/ide/src/trace/component/chart/SpEBPFChart.ts index 1a51e3a11..082e5647c 100644 --- a/ide/src/trace/component/chart/SpEBPFChart.ts +++ b/ide/src/trace/component/chart/SpEBPFChart.ts @@ -36,11 +36,11 @@ export class SpEBPFChart { let sys = await hasFileSysData(); if (sys.length > 0) { //@ts-ignore - let fsCount = sys[0]['fsCount'] ?? 0; + let fsCount = sys[0].fsCount ?? 0; //@ts-ignore - let vmCount = sys[0]['vmCount'] ?? 0; + let vmCount = sys[0].vmCount ?? 0; //@ts-ignore - let ioCount = sys[0]['ioCount'] ?? 0; + let ioCount = sys[0].ioCount ?? 0; if (sys && sys.length > 0 && (fsCount > 0 || vmCount > 0 || ioCount > 0)) { let folder = await this.initFolder(); await this.initFileCallchain(); @@ -87,7 +87,7 @@ export class SpEBPFChart { // @ts-ignore this.trace.canvasPanelCtx?.clearRect(0, 0, fsFolder.frame.width, fsFolder.frame.height); } else { - (renders['empty'] as EmptyRender).renderMainThread( + (renders.empty as EmptyRender).renderMainThread( { context: this.trace.canvasPanelCtx, useCache: useCache, @@ -239,17 +239,17 @@ export class SpEBPFChart { initProcessDiskIOLatencyRead(i: number, folder: TraceRow, process: unknown): TraceRow { let rowRead = TraceRow.skeleton(); rowRead.index = 5 + 2 * i; //@ts-ignore - rowRead.rowId = `FileSystemDiskIOLatency-read-${process['ipid']}`; + rowRead.rowId = `FileSystemDiskIOLatency-read-${process.ipid}`; rowRead.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; rowRead.rowParentId = folder.rowId; rowRead.rowHidden = !folder.expansion; rowRead.style.height = '40px'; rowRead.style.width = '100%'; rowRead.setAttribute('children', ''); //@ts-ignore - rowRead.name = `${process['name'] ?? 'Process'}(${process['pid']}) Max Read Latency`; + rowRead.name = `${process.name ?? 'Process'}(${process.pid}) Max Read Latency`; rowRead.supplierFrame = async (): Promise => { //@ts-ignore - const res = await diskIoSender(false, process['ipid'], [1, 3], TraceRow.range?.scale || 50, rowRead); + const res = await diskIoSender(false, process.ipid, [1, 3], TraceRow.range?.scale || 50, rowRead); return res; }; rowRead.favoriteChangeHandler = this.trace.favoriteChangeHandler; @@ -271,7 +271,7 @@ export class SpEBPFChart { { context: context, useCache: useCache, //@ts-ignore - type: `${TraceRow.ROW_TYPE_FILE_SYSTEM}-disk-io-process-read-${process['pid']}`, + type: `${TraceRow.ROW_TYPE_FILE_SYSTEM}-disk-io-process-read-${process.pid}`, chartColor: ColorUtils.MD_PALETTE[0], }, rowRead @@ -285,17 +285,17 @@ export class SpEBPFChart { private initProcessDiskIOWrite(i: number, folder: TraceRow, process: unknown): TraceRow { let rowWrite = TraceRow.skeleton(); rowWrite.index = 5 + 2 * i + 1; //@ts-ignore - rowWrite.rowId = `FileSystemDiskIOLatency-write-${process['ipid']}`; + rowWrite.rowId = `FileSystemDiskIOLatency-write-${process.ipid}`; rowWrite.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; rowWrite.rowParentId = folder.rowId; rowWrite.rowHidden = !folder.expansion; rowWrite.style.height = '40px'; rowWrite.style.width = '100%'; rowWrite.setAttribute('children', ''); //@ts-ignore - rowWrite.name = `${process['name'] ?? 'Process'}(${process['pid']}) Max Write Latency`; + rowWrite.name = `${process.name ?? 'Process'}(${process.pid}) Max Write Latency`; rowWrite.supplierFrame = async (): Promise => { //@ts-ignore - const res = await diskIoSender(false, process['ipid'], [2, 4], TraceRow.range?.scale || 50, rowWrite); + const res = await diskIoSender(false, process.ipid, [2, 4], TraceRow.range?.scale || 50, rowWrite); return res; }; rowWrite.favoriteChangeHandler = this.trace.favoriteChangeHandler; @@ -317,7 +317,7 @@ export class SpEBPFChart { { context: context, useCache: useCache, //@ts-ignore - type: `${TraceRow.ROW_TYPE_FILE_SYSTEM}-disk-io-process-write-${process['pid']}`, + type: `${TraceRow.ROW_TYPE_FILE_SYSTEM}-disk-io-process-write-${process.pid}`, chartColor: ColorUtils.MD_PALETTE[8], }, rowWrite diff --git a/ide/src/trace/component/chart/SpFpsChart.ts b/ide/src/trace/component/chart/SpFpsChart.ts index c87a60718..5c083ccba 100644 --- a/ide/src/trace/component/chart/SpFpsChart.ts +++ b/ide/src/trace/component/chart/SpFpsChart.ts @@ -61,7 +61,7 @@ export class SpFpsChart { context = fpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } fpsRow.canvasSave(context); - (renders['fps'] as FpsRender).renderMainThread( + (renders.fps as FpsRender).renderMainThread( { context: context, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpFreqChart.ts b/ide/src/trace/component/chart/SpFreqChart.ts index e7413adb7..1946f361b 100644 --- a/ide/src/trace/component/chart/SpFreqChart.ts +++ b/ide/src/trace/component/chart/SpFreqChart.ts @@ -93,7 +93,7 @@ export class SpFreqChart { return folder; } - async addFreqRows(freqList: Array): Promise { + async addFreqRows(freqList: Array): Promise { let freqMaxList = await queryCpuMaxFreq(); //@ts-ignore CpuFreqStruct.maxFreq = freqMaxList[0].maxFreq; //@ts-ignore let maxFreqObj = Utils.getFrequencyWithUnit(freqMaxList[0].maxFreq); diff --git a/ide/src/trace/component/chart/SpHiPerf.ts b/ide/src/trace/component/chart/SpHiPerf.ts index b5cdd744e..431c8171e 100644 --- a/ide/src/trace/component/chart/SpHiPerf.ts +++ b/ide/src/trace/component/chart/SpHiPerf.ts @@ -319,15 +319,18 @@ export class SpHiPerf { row.rowSettingList = [ ...cpuData.reverse().map( ( - it: any + it: unknown ): { key: string; title: string; checked?: boolean; } => { return { + // @ts-ignore key: `${it.cpu_id}-c`, + // @ts-ignore checked: it.cpu_id === 0, + // @ts-ignore title: `cpu${it.cpu_id}`, }; } diff --git a/ide/src/trace/component/chart/SpPerfOutputDataChart.ts b/ide/src/trace/component/chart/SpPerfOutputDataChart.ts index e9b3c3821..ae45e19d8 100644 --- a/ide/src/trace/component/chart/SpPerfOutputDataChart.ts +++ b/ide/src/trace/component/chart/SpPerfOutputDataChart.ts @@ -38,11 +38,14 @@ export class SpPerfOutputDataChart { } let perfToolsDur = await queryPerfToolsDur(); if (perfToolsDur.length > 0) { + // @ts-ignore this.dur = perfToolsDur[0].dur; } else { this.dur = 3000000000; } + // @ts-ignore this.perfOutputArr = perfOutputData[0].name.split(':')[2].split(','); + // @ts-ignore let endTime: number = perfOutputData[0].ts; this.startTime = endTime - window.recordStartNS - this.dur!; if (this.startTime < 0) { @@ -68,7 +71,7 @@ export class SpPerfOutputDataChart { context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); - (renders['perfTool'] as PerfToolRender).renderMainThread( + (renders.perfTool as PerfToolRender).renderMainThread( { context: context, useCache: useCache, @@ -81,7 +84,8 @@ export class SpPerfOutputDataChart { }; } - async initData(folder: TraceRow): Promise { + // @ts-ignore + async initData(folder: TraceRow): Promise { let perfToolStartTime = new Date().getTime(); let perfToolList = [ { name: 'Application Process CPU Power Consumption(MAS)', idx: 27 }, @@ -115,7 +119,8 @@ export class SpPerfOutputDataChart { data.count = this.perfOutputArr![it.idx]; data.id = i + 1; data.name = it.name; - return new Promise>((resolve) => resolve([data])); + // @ts-ignore + return new Promise>((resolve) => resolve([data])); }; traceRow.findHoverStruct = (): void => { PerfToolStruct.hoverPerfToolStruct = traceRow.getHoverStruct(); @@ -127,7 +132,8 @@ export class SpPerfOutputDataChart { info('The time to load the ClockData is: ', durTime); } - async initFolder(): Promise> { + // @ts-ignore + async initFolder(): Promise> { let perfFolder = TraceRow.skeleton(); perfFolder.rowId = 'perfTool'; perfFolder.index = 0; @@ -138,13 +144,14 @@ export class SpPerfOutputDataChart { perfFolder.name = 'Perf Tools'; perfFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; perfFolder.selectChangeHandler = this.trace.selectChangeHandler; - perfFolder.supplier = (): Promise => new Promise>((resolve) => resolve([])); + // @ts-ignore + perfFolder.supplier = (): Promise => new Promise>((resolve) => resolve([])); perfFolder.onThreadHandler = (useCache): void => { perfFolder.canvasSave(this.trace.canvasPanelCtx!); if (perfFolder.expansion) { this.trace.canvasPanelCtx?.clearRect(0, 0, perfFolder.frame.width, perfFolder.frame.height); } else { - (renders['empty'] as EmptyRender).renderMainThread( + (renders.empty as EmptyRender).renderMainThread( { context: this.trace.canvasPanelCtx, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpProcessChart.ts b/ide/src/trace/component/chart/SpProcessChart.ts index d32270028..fa0201810 100644 --- a/ide/src/trace/component/chart/SpProcessChart.ts +++ b/ide/src/trace/component/chart/SpProcessChart.ts @@ -117,9 +117,9 @@ export class SpProcessChart { if (Reflect.ownKeys(asyncFuncGroup).length > 0) { this.trace.rowsEL?.appendChild(row); } // @ts-ignore - Reflect.ownKeys(asyncFuncGroup).map((key: any) => { + Reflect.ownKeys(asyncFuncGroup).map((key: unknown) => { // @ts-ignore - let asyncFuncGroups: Array = asyncFuncGroup[key]; + let asyncFuncGroups: Array = asyncFuncGroup[key]; if (asyncFuncGroups.length > 0) { //@ts-ignore row.addChildTraceRow(this.createDeliverInputEventRow(row, key, asyncFuncGroups)); @@ -1040,9 +1040,9 @@ export class SpProcessChart { //@ts-ignore let asyncFuncList = this.processAsyncFuncMap[it.pid] || []; let asyncFuncGroup = Utils.groupBy(asyncFuncList, 'funName'); // @ts-ignore - Reflect.ownKeys(asyncFuncGroup).map((key: any) => { + Reflect.ownKeys(asyncFuncGroup).map((key: unknown) => { // @ts-ignore - let asyncFunctions: Array = asyncFuncGroup[key]; + let asyncFunctions: Array = asyncFuncGroup[key]; if (asyncFunctions.length > 0) { let isIntersect = (a: unknown, b: unknown): boolean => //@ts-ignore diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts index 741b1f398..f6fecfa9a 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts @@ -124,29 +124,29 @@ export class TabCpuDetailsThreads extends BaseElement { tip: (obj): string => { return `
t_name:${ - // @ts-ignore - obj.obj.tName - }
+ // @ts-ignore + obj.obj.tName + }
tid:${ - // @ts-ignore - obj.obj.tid - }
+ // @ts-ignore + obj.obj.tid + }
p_name:${ - // @ts-ignore - obj.obj.pName - }
+ // @ts-ignore + obj.obj.pName + }
p_pid:${ - // @ts-ignore - obj.obj.pid - }
+ // @ts-ignore + obj.obj.pid + }
duration:${ - // @ts-ignore - obj.obj.durStr - }
+ // @ts-ignore + obj.obj.durStr + }
ratio:${ - // @ts-ignore - obj.obj.ratio - }%
+ // @ts-ignore + obj.obj.ratio + }% `; }, @@ -182,37 +182,51 @@ export class TabCpuDetailsThreads extends BaseElement { this.noData(false); } - sortByColumn(detail: any): void { + sortByColumn(detail: unknown): void { // @ts-ignore function compare(cpuDetailsThreadProperty, sort, type) { - return function (a: any, b: any) { + return function (a: unknown, b: unknown) { if (type === 'number') { // @ts-ignore return sort === 2 + // @ts-ignore ? parseFloat(b[cpuDetailsThreadProperty]) - parseFloat(a[cpuDetailsThreadProperty]) + // @ts-ignore : parseFloat(a[cpuDetailsThreadProperty]) - parseFloat(b[cpuDetailsThreadProperty]); } else { if (sort === 2) { + // @ts-ignore return b[cpuDetailsThreadProperty].toString().localeCompare(a[cpuDetailsThreadProperty].toString()); } else { + // @ts-ignore return a[cpuDetailsThreadProperty].toString().localeCompare(b[cpuDetailsThreadProperty].toString()); } } }; } + // @ts-ignore if (detail.key === 'durStr') { + // @ts-ignore detail.key = 'dur'; + // @ts-ignore this.data.sort(compare(detail.key, detail.sort, 'number')); } else if ( + // @ts-ignore detail.key === 'value' || + // @ts-ignore detail.key === 'ratio' || + // @ts-ignore detail.key === 'index' || + // @ts-ignore detail.key === 'tid' || + // @ts-ignore detail.key === 'pid' ) { + // @ts-ignore this.data.sort(compare(detail.key, detail.sort, 'number')); } else { + // @ts-ignore this.data.sort(compare(detail.key, detail.sort, 'string')); } this.cpuDetailsThreadUsageTbl!.recycleDataSource = this.data; diff --git a/ide/src/trace/component/setting/SpRecordPerf.ts b/ide/src/trace/component/setting/SpRecordPerf.ts index 8b4b3631b..1e08f1d64 100644 --- a/ide/src/trace/component/setting/SpRecordPerf.ts +++ b/ide/src/trace/component/setting/SpRecordPerf.ts @@ -349,7 +349,6 @@ export class SpRecordPerf extends BaseElement { }; eventSelectClickHandler = (): void => { - let that = this; if (SpRecordTrace.serialNumber === '') { this.eventSelect?.dataSource(eventSelect, ''); } else { @@ -360,8 +359,8 @@ export class SpRecordPerf extends BaseElement { if (SpRecordTrace.isVscode) { let cmd = Cmd.formatString(CmdConstant.CMD_GET_HIPERF_EVENTS_DEVICES, [SpRecordTrace.serialNumber]); Cmd.execHdcCmd(cmd, (res: string) => { - let eventMap = that.parseEvent(res); - let eventList = that.getSoftHardWareEvents(eventMap); + let eventMap = this.parseEvent(res); + let eventList = this.getSoftHardWareEvents(eventMap); if (eventList) { for (let eventListElement of eventList) { this.eventData.push(eventListElement.trim()); @@ -375,8 +374,8 @@ export class SpRecordPerf extends BaseElement { if (conn) { HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_HIPERF_EVENTS, false).then((res) => { if (res) { - let eventMap = that.parseEvent(res); - let eventList = that.getSoftHardWareEvents(eventMap); + let eventMap = this.parseEvent(res); + let eventList = this.getSoftHardWareEvents(eventMap); if (eventList) { for (let eventListElement of eventList) { this.eventData.push(eventListElement.trim()); diff --git a/ide/src/trace/component/setting/SpWebHdcShell.ts b/ide/src/trace/component/setting/SpWebHdcShell.ts index c2953b6b3..7db8272da 100644 --- a/ide/src/trace/component/setting/SpWebHdcShell.ts +++ b/ide/src/trace/component/setting/SpWebHdcShell.ts @@ -88,12 +88,11 @@ export class SpWebHdcShell extends BaseElement { window.subscribe(window.SmartEvent.UI.DeviceDisConnect, () => { this.clear(); }); - let that = this; - this.shellCanvas!.addEventListener('blur', function () { - if (that.intervalId) { - window.clearInterval(that.intervalId); + this.shellCanvas!.addEventListener('blur', () => { + if (this.intervalId) { + window.clearInterval(this.intervalId); } - that.shellCanvasCtx!.clearRect(that.shellStrLength, that.textY, 12, 3); + this.shellCanvasCtx!.clearRect(this.shellStrLength, this.textY, 12, 3); }); new ResizeObserver(() => { this.resizeCanvas(); @@ -582,55 +581,53 @@ export class SpWebHdcShell extends BaseElement { let startY: number; let endX: number; let endY: number; - let that = this; - this.shellCanvas!.addEventListener('mousedown', function (event) { - if (that.resultStr.length === 0 && that.cursorRow.length === 0) { + this.shellCanvas!.addEventListener('mousedown', (event) => { + if (this.resultStr.length === 0 && this.cursorRow.length === 0) { return; } - that.isDragging = true; + this.isDragging = true; startX = event.offsetX; startY = event.offsetY; - that.refreshShellPage(false); + this.refreshShellPage(false); }); - this.shellCanvas!.addEventListener('mousemove', function (event) { - if (!that.isDragging) { + this.shellCanvas!.addEventListener('mousemove', (event) => { + if (!this.isDragging) { return; } - if (that.resultStr.length === 0 && that.cursorRow.length === 0) { + if (this.resultStr.length === 0 && this.cursorRow.length === 0) { return; } endX = event.offsetX; endY = event.offsetY; - that.refreshShellPage(false); - that.points = undefined; - that.shellCanvasCtx!.fillStyle = 'rgba(128, 128, 128, 0.5)'; + this.refreshShellPage(false); + this.points = undefined; + this.shellCanvasCtx!.fillStyle = 'rgba(128, 128, 128, 0.5)'; if (endY > startY) { - that.forwardFlag = true; - that.forwardSelected(startX, startY, endX, endY); + this.forwardFlag = true; + this.forwardSelected(startX, startY, endX, endY); } else { - that.forwardFlag = false; - that.reverseSelected(startX, startY, endX, endY); + this.forwardFlag = false; + this.reverseSelected(startX, startY, endX, endY); } }); this.shellCanvasAddMouseUpListener(); } private shellCanvasAddMouseUpListener(): void { - let that = this; - this.shellCanvas!.addEventListener('mouseup', async function (event) { - if (!that.isDragging) { + this.shellCanvas!.addEventListener('mouseup', async (event) => { + if (!this.isDragging) { return; } - if (that.resultStr.length === 0 && that.cursorRow.length === 0) { + if (this.resultStr.length === 0 && this.cursorRow.length === 0) { return; } - that.isDragging = false; + this.isDragging = false; //右键 if (event.button === 2) { let text: string = await navigator.clipboard.readText(); if (text) { - if (that.sendCallBack) { - that.sendCallBack(text); + if (this.sendCallBack) { + this.sendCallBack(text); } return; } diff --git a/ide/src/trace/component/setting/utils/PluginConvertUtils.ts b/ide/src/trace/component/setting/utils/PluginConvertUtils.ts index 529c61969..af894010f 100644 --- a/ide/src/trace/component/setting/utils/PluginConvertUtils.ts +++ b/ide/src/trace/component/setting/utils/PluginConvertUtils.ts @@ -186,8 +186,9 @@ export class PluginConvertUtils { spacesNumber: number, indentation: number, key: string, - arrValue: any + arrValue: unknown ): string { + // @ts-ignore return `${text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key)}: ${arrValue.toString()}${ this.crlf }`; @@ -198,8 +199,9 @@ export class PluginConvertUtils { spacesNumber: number, indentation: number, key: string, - arrValue: any + arrValue: unknown ): string { + // @ts-ignore return `${text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key)}: ${arrValue.toString()}${ this.crlf }`; @@ -210,8 +212,9 @@ export class PluginConvertUtils { spacesNumber: number, indentation: number, key: string, - arrValue: any + arrValue: unknown ): string { + // @ts-ignore return `${text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key)}: ${arrValue.toString()}${ this.crlf }`; @@ -222,15 +225,18 @@ export class PluginConvertUtils { spacesNumber: number, indentation: number, key: string, - arrValue: any + arrValue: unknown ): string { + // @ts-ignore if (arrValue.startsWith('VMEMINFO') || arrValue.startsWith('PMEM')) { text = `${ text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + // @ts-ignore }: ${arrValue.toString()}${this.crlf}`; } else { text = `${ text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + // @ts-ignore }: "${arrValue.toString()}"${this.crlf}`; } return text; @@ -241,11 +247,12 @@ export class PluginConvertUtils { spacesNumber: number, indentation: number, key: string, - arrValue: any, + arrValue: unknown, needColon: boolean ): string { if (needColon) { text = `${text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key)}: ${this.handleObj( + // @ts-ignore arrValue, indentation + 1, needColon, @@ -256,6 +263,7 @@ export class PluginConvertUtils { text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + + // @ts-ignore this.handleObj(arrValue, indentation + 1, needColon, spacesNumber) }${this.crlf}`; } diff --git a/ide/src/trace/component/trace/SpChartList.ts b/ide/src/trace/component/trace/SpChartList.ts index 5ba338ea8..ab922b7b5 100644 --- a/ide/src/trace/component/trace/SpChartList.ts +++ b/ide/src/trace/component/trace/SpChartList.ts @@ -211,7 +211,12 @@ export class SpChartList extends BaseElement { return [...this.collectRowList1, ...this.collectRowList2]; } - getCollectRowsInfo(group: string) { + getCollectRowsInfo(group: string): { + type: string | null | undefined; + name: string; + id: string | null | undefined; + parents: never[]; + }[] { return (group === SpChartList.COLLECT_G1 ? this.collectRowList1 : this.collectRowList2).map((row) => { let rowJson = { type: row.rowType, @@ -226,7 +231,7 @@ export class SpChartList extends BaseElement { } // @ts-ignore - getRowParent(obj: unknown, row: TraceRow) { + getRowParent(obj: unknown, row: TraceRow): void { if (row.parentRowEl) { // @ts-ignore if (obj.parents) { diff --git a/ide/src/trace/component/trace/TimerShaftElement.ts b/ide/src/trace/component/trace/TimerShaftElement.ts index 87b11a02a..705767982 100644 --- a/ide/src/trace/component/trace/TimerShaftElement.ts +++ b/ide/src/trace/component/trace/TimerShaftElement.ts @@ -28,7 +28,6 @@ import './timer-shaft/CollapseButton'; import { TimerShaftElementHtml } from './TimerShaftElement.html'; import { SpChartList } from './SpChartList'; //随机生成十六位进制颜色 -//@ts-ignore export function randomRgbColor(): string { let r = Math.floor(Math.random() * 255); let g = Math.floor(Math.random() * 255); @@ -40,7 +39,7 @@ export function randomRgbColor(): string { let color = '#' + r16 + g16 + b16; return color; } else { - randomRgbColor(); + return randomRgbColor(); } } diff --git a/ide/src/trace/component/trace/base/Extension.ts b/ide/src/trace/component/trace/base/Extension.ts index bc55d40e7..742285f6b 100644 --- a/ide/src/trace/component/trace/base/Extension.ts +++ b/ide/src/trace/component/trace/base/Extension.ts @@ -134,3 +134,10 @@ export {}; export function dpr(): number { return window.devicePixelRatio || 1; } + +export const isEmpty = function (list: Array | undefined): boolean { + return list === null || list === undefined || list.length === 0; +}; +export const isNotEmpty = function (list: Array | undefined): boolean { + return list !== null && list !== undefined && list.length > 0; +}; diff --git a/ide/src/trace/component/trace/base/RangeSelect.ts b/ide/src/trace/component/trace/base/RangeSelect.ts index 644ca955d..79fed3b75 100644 --- a/ide/src/trace/component/trace/base/RangeSelect.ts +++ b/ide/src/trace/component/trace/base/RangeSelect.ts @@ -21,6 +21,7 @@ import './Extension'; import { SpSystemTrace } from '../../SpSystemTrace'; import { fuzzyQueryFuncRowData, queryFuncRowData } from '../../../database/sql/Func.sql'; import { SpLtpoChart } from '../../chart/SpLTPO'; +import { isEmpty, isNotEmpty } from './Extension'; export class RangeSelect { private rowsEL: HTMLDivElement | undefined | null; @@ -250,10 +251,10 @@ export class RangeSelect { if (!notTimeHeight) { return false; } - if ((this.rangeTraceRow ?? false) && !this.isMouseDown) { + if ((isEmpty(this.rangeTraceRow) ?? false) && !this.isMouseDown) { this.isHover = false; } - return notTimeHeight && (!this.rangeTraceRow ?? false) && !this.isMouseDown; + return notTimeHeight && (isNotEmpty(this.rangeTraceRow) ?? false) && !this.isMouseDown; } mouseOut(mouseEventOut: MouseEvent): void { @@ -351,7 +352,7 @@ export class RangeSelect { } private handleDrawForNotMouseDown(): void { - this.timerShaftEL!.sportRuler!.isRangeSelect = !this.rangeTraceRow ?? false; + this.timerShaftEL!.sportRuler!.isRangeSelect = isNotEmpty(this.rangeTraceRow) ?? false; this.timerShaftEL!.sportRuler!.draw(); } // @ts-ignore diff --git a/ide/src/trace/component/trace/base/TraceRow.ts b/ide/src/trace/component/trace/base/TraceRow.ts index f00f55ab1..e1525517c 100644 --- a/ide/src/trace/component/trace/base/TraceRow.ts +++ b/ide/src/trace/component/trace/base/TraceRow.ts @@ -40,8 +40,8 @@ export class RangeSelectStruct { endNS: number | undefined; } -let collectList: Array = []; -let rowDragElement: EventTarget | undefined | null; +let collectList: Array> = []; +let rowDragId: string | undefined | null; let dragDirection: string = ''; @element('trace-row') @@ -572,7 +572,7 @@ export class TraceRow extends HTMLElement { } else { return this.dataListCache.find( (re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY, strict, offset) - ); + ) as T; } } } @@ -915,11 +915,10 @@ export class TraceRow extends HTMLElement { event.stopPropagation(); }); - let that = this; - window.addEventListener('storage', function (e): void { + window.addEventListener('storage', (e): void => { if (e.storageArea === sessionStorage) { if (e.key === 'freqInfoData') { - that.onRowCheckFileChangeHandler?.(); + this.onRowCheckFileChangeHandler?.(); } } }); // @ts-ignore @@ -1137,13 +1136,13 @@ export class TraceRow extends HTMLElement { private describeElEvent(): void { this.describeEl!.ondragend = (ev: unknown): void => { - rowDragElement = null; // @ts-ignore + rowDragId = null; // @ts-ignore ev.target.classList.remove('drag'); // @ts-ignore this.drawLine(ev.currentTarget, ''); return undefined; }; this.describeEl!.ondragover = (ev: unknown): undefined => { - if (!this.collect || rowDragElement === this) { + if (!this.collect || rowDragId === this.rowId) { return; } // @ts-ignore let rect = ev.currentTarget.getBoundingClientRect(); // @ts-ignore @@ -1164,7 +1163,7 @@ export class TraceRow extends HTMLElement { } // @ts-ignore this.drawLine(ev.currentTarget, ''); let spacer = this.parentElement!.previousElementSibling! as HTMLDivElement; - let startDragNode = collectList.findIndex((it): boolean => it === rowDragElement); + let startDragNode = collectList.findIndex((it): boolean => it.rowId === rowDragId); let endDragNode = collectList.findIndex((it): boolean => it === this); if (startDragNode === -1 || endDragNode === -1) { return; @@ -1180,7 +1179,6 @@ export class TraceRow extends HTMLElement { // @ts-ignore it.style.top = `${spacer.offsetTop + 48}px`; } else { - // @ts-ignore it.style.top = `${collectList[i - 1].offsetTop + collectList[i - 1].offsetHeight}px`; } }); @@ -1188,7 +1186,7 @@ export class TraceRow extends HTMLElement { } rowDragstart(ev: unknown): void { - rowDragElement = this; // @ts-ignore + rowDragId = this.rowId; // @ts-ignore ev.target.classList.add('drag'); } @@ -1280,10 +1278,6 @@ export class TraceRow extends HTMLElement { } } - isEmpty(){ - - } - draw(useCache: boolean = false): void { this.dpr = window.devicePixelRatio || 1; if (this.sleeping) { diff --git a/ide/src/trace/component/trace/base/TraceRowConfig.ts b/ide/src/trace/component/trace/base/TraceRowConfig.ts index 13cef7b1c..db20983af 100644 --- a/ide/src/trace/component/trace/base/TraceRowConfig.ts +++ b/ide/src/trace/component/trace/base/TraceRowConfig.ts @@ -674,7 +674,7 @@ export class TraceRowConfig extends BaseElement { currentChartId: string, scene: Array, findChartNames: Array - ) { + ): void { if (this.traceRowList) { for (let index = 0; index < this.traceRowList.length; index++) { let item = this.traceRowList[index]; diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index d375caeef..ef90271e7 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -549,7 +549,7 @@ export class TabPaneCurrentSelection extends BaseElement { this.setTableHeight('auto'); //Perf Tools info this.tabCurrentSelectionInit('Slice Details'); - let list: any[] = []; + let list: unknown[] = []; list.push({ name: 'Name', value: data.name, @@ -560,7 +560,8 @@ export class TabPaneCurrentSelection extends BaseElement { }); list.push({ name: 'StartTime(Absolute)', - value: ((data.startNS || 0) + (window as any).recordStartNS) / 1000000000 + 's', + // @ts-ignore + value: ((data.startNS || 0) + (window as unknown).recordStartNS) / 1000000000 + 's', }); list.push({ name: 'Value', @@ -731,8 +732,8 @@ export class TabPaneCurrentSelection extends BaseElement { this.queryThreadStateDArgs(data.argSetID), queryThreadNearData(data.id!, data.startTime!), ]).then((result) => { - let fromBean = result[0]; - let wakeUps = result[1]; + let fromBean = result[0] as WakeupBean; + let wakeUps = result[1] as WakeupBean[]; let args = result[2]; let [preData, nextData] = this.sortByNearData(result[3], data, list); this.setWakeupData(fromBean, wakeUps, list); @@ -1632,7 +1633,7 @@ export class TabPaneCurrentSelection extends BaseElement { /** * 查询出 线程唤醒了哪些线程信息 */ - async queryThreadWakeUpFromData(itid: number, startTime: number, dur: number): Promise { + async queryThreadWakeUpFromData(itid: number, startTime: number, dur: number): Promise { // @ts-ignore let wakeUps = await queryThreadWakeUpFrom(itid, startTime + (window as unknown).recordStartNS); if (wakeUps !== undefined && wakeUps.length > 0) { @@ -1754,7 +1755,7 @@ export class TabPaneCurrentSelection extends BaseElement { this.currentSelectionTbl = this.shadowRoot?.querySelector('#selectionTbl'); this.wakeupListTbl = this.shadowRoot?.querySelector('#wakeupListTbl'); this.scrollView = this.shadowRoot?.querySelector('#scroll_view'); - this.currentSelectionTbl?.addEventListener('column-click', (ev: any): void => {}); //@ts-ignore + this.currentSelectionTbl?.addEventListener('column-click', (ev: unknown): void => {}); //@ts-ignore window.subscribe(window.SmartEvent.UI.WakeupList, (data: Array) => this.showWakeupListTableData(data)); } diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts index 4f8d00e52..b19c2fb9f 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts @@ -56,7 +56,6 @@ export class TabPanePurgPinComparisonAbility extends BaseElement { } private initSelect(fileStartNs: number, purgePinComFileArr: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -76,7 +75,7 @@ export class TabPanePurgPinComparisonAbility extends BaseElement { // @ts-ignore if (input.value === f.name) { // @ts-ignore - that.updateComparisonData(fileStartNs, f.startNs); + this.updateComparisonData(fileStartNs, f.startNs); } } // @ts-ignore e.stopPropagation(); diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts index 5ebcae83d..8be409a97 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts @@ -56,7 +56,6 @@ export class TabPanePurgTotalComparisonAbility extends BaseElement { } private initSelect(fileStartNs: number, purgeTotalComFileArr: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -76,7 +75,7 @@ export class TabPanePurgTotalComparisonAbility extends BaseElement { // @ts-ignore if (input.value === f.name) { // @ts-ignore - that.updateComparisonData(fileStartNs, f.startNs); + this.updateComparisonData(fileStartNs, f.startNs); } } // @ts-ignore e.stopPropagation(); diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts index 2b01b44b1..93348b04a 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts @@ -61,7 +61,6 @@ export class TabPaneComparison extends BaseElement { this.clear(); this.retainerTableEl!.snapshotDataSource = []; let fileArr: HeapSnapshotStruct[] = []; - let that = this; for (let file of dataListCache) { if (file.id !== data.id) { fileArr.push(file); @@ -72,7 +71,7 @@ export class TabPaneComparison extends BaseElement { this.initSelect(data.id, fileArr); this.baseFileId = data.id; this.targetFileId = fileArr[0].id; - that.updateComparisonData(data.id, fileArr[0].id); + this.updateComparisonData(data.id, fileArr[0].id); new ResizeObserver((): void => { this.comparisonTableEl!.style.height = '100%'; this.comparisonTableEl!.reMeauseHeight(); @@ -94,7 +93,6 @@ export class TabPaneComparison extends BaseElement { } initSelect(fileId: number, comFileArr: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; this.selectEl!.defaultValue = comFileArr[0].name || ''; @@ -113,7 +111,7 @@ export class TabPaneComparison extends BaseElement { this.retainerTableEl!.snapshotDataSource = []; for (let f of comFileArr) { if (input.value === f.name) { - that.updateComparisonData(fileId, f.id); + this.updateComparisonData(fileId, f.id); } } e.stopPropagation(); @@ -376,7 +374,6 @@ export class TabPaneComparison extends BaseElement { if (this.retainsData && this.retainsData.length > 0) { this.retainsDataInit(); let i = 0; - let that = this; if (this.retainsData[0].distance > 1) { this.retainsData[0].getChildren(); this.retainsData[0].expanded = false; @@ -396,7 +393,7 @@ export class TabPaneComparison extends BaseElement { } i++; // @ts-ignore - if (i < that.retainsData[0].distance - 1 && list[0].distance !== '-') { + if (i < this.retainsData[0].distance - 1 && list[0].distance !== '-') { list[0].getChildren(); list[0].expanded = false; if (structRow.hasNext) { @@ -407,7 +404,7 @@ export class TabPaneComparison extends BaseElement { } }); }; - getList(that.retainsData[0].children); + getList(this.retainsData[0].children); }; retainsTable(); this.retainerTableEl!.snapshotDataSource = this.retainsData; @@ -475,8 +472,7 @@ export class TabPaneComparison extends BaseElement { if (retainerNext.status) { retainerNext.getChildren(); let i = 0; - let that = this; - let retainsTable = (): void => { + const retainsTable = (): void => { const getList = (comList: Array): void => { comList.forEach((row): void => { let shallow = `${Math.round((row.shallowSize / this.fileSize) * 100)}%`; @@ -491,7 +487,7 @@ export class TabPaneComparison extends BaseElement { } i++; // @ts-ignore - if (i < that.retainsData[0].distance - 1 && comList[0].distance !== '-') { + if (i < this.retainsData[0].distance - 1 && comList[0].distance !== '-') { comList[0].getChildren(); comList[0].expanded = false; if (row.hasNext) { diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts index 4e239182b..60fe5d0d3 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts @@ -207,14 +207,16 @@ export class TabPaneJsCpuCallTree extends BaseElement { } private sortTree(arr: Array): Array { - const that = this; - function defaultSort(callTreeLeftData: JsCpuProfilerTabStruct, callTreeRightData: JsCpuProfilerTabStruct): number { - if (that.currentType === that.TYPE_TOP_DOWN) { + const defaultSort = ( + callTreeLeftData: JsCpuProfilerTabStruct, + callTreeRightData: JsCpuProfilerTabStruct + ): number => { + if (this.currentType === this.TYPE_TOP_DOWN) { return callTreeRightData.totalTime - callTreeLeftData.totalTime; } else { return callTreeRightData.selfTime - callTreeLeftData.selfTime; } - } + }; const CallTreeSortArr = arr.sort((callTreeLeftData, callTreeRightData) => { if (this.sortKey === 'selfTimeStr' || this.sortKey === 'selfTimePercent') { if (this.sortType === 0) { @@ -249,11 +251,6 @@ export class TabPaneJsCpuCallTree extends BaseElement { return CallTreeSortArr; } - private clearTab(): void { - this.stackTable!.recycleDataSource = []; - this.callTreeTable!.recycleDataSource = []; - } - public initHtml(): string { return TabPaneJsCpuHtml; } diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts index c09252d5e..539ac5d06 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts @@ -324,35 +324,34 @@ export class TabPaneSummary extends BaseElement { clickToggleTable(): void { let lis = this.shadowRoot?.querySelectorAll('li'); - let that = this; lis!.forEach((li: HTMLElement, i: number) => { - lis![i].onclick = function (): void { + lis![i].onclick = (): void => { for (let i = 0; i < lis!.length; i++) { lis![i].className = ''; } switch (li.textContent) { case 'Retainers': - that.stackTable!.style.display = 'none'; - that.stackText!.style.display = 'none'; - that.tbs!.style.display = 'flex'; - that.tbs!.snapshotDataSource = that.retainsData; + this.stackTable!.style.display = 'none'; + this.stackText!.style.display = 'none'; + this.tbs!.style.display = 'flex'; + this.tbs!.snapshotDataSource = this.retainsData; break; case 'Allocation stack': - if (that.stackData.length > 0) { - that.stackText!.style.display = 'none'; - that.stackTable!.style.display = 'flex'; - that.stackTable!.recycleDataSource = that.stackData; + if (this.stackData.length > 0) { + this.stackText!.style.display = 'none'; + this.stackTable!.style.display = 'flex'; + this.stackTable!.recycleDataSource = this.stackData; } else { - that.stackText!.style.display = 'flex'; - if (that.retainsData === undefined || that.retainsData.length === 0) { - that.stackText!.textContent = ''; + this.stackText!.style.display = 'flex'; + if (this.retainsData === undefined || this.retainsData.length === 0) { + this.stackText!.textContent = ''; } else { - that.stackText!.textContent = + this.stackText!.textContent = 'Stack was not recorded for this object because it had been allocated before ' + 'this profile recording started.'; } } - that.tbs!.style.display = 'none'; + this.tbs!.style.display = 'none'; break; } // @ts-ignore @@ -603,7 +602,7 @@ export class TabPaneSummary extends BaseElement { } i++; //@ts-ignore - if (i < that.retainsData[0].distance - 1 && list[0].distance !== '-') { + if (i < this.retainsData[0].distance - 1 && list[0].distance !== '-') { list[0].getChildren(); list[0].expanded = false; if (summaryRow.hasNext) { @@ -614,7 +613,7 @@ export class TabPaneSummary extends BaseElement { } }); }; - getList(that.retainsData[0].children); + getList(this.retainsData[0].children); }; retainsTable(); this.tbs!.snapshotDataSource = this.retainsData; diff --git a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstruction.ts b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstruction.ts index 23aed73c2..c02126b62 100644 --- a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstruction.ts +++ b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstruction.ts @@ -279,11 +279,13 @@ export class TabPaneSampleInstruction extends BaseElement { //计算当前节点下指令数之和 用于计算每个节点所占的宽度比 const total = isCycles ? instructionArray[key] - .filter((i: any) => i.parentName === parentNode.name) - .reduce((pre: number, cur: SampleStruct) => pre + cur.cycles!, 0) + // @ts-ignore + .filter((i: unknown) => i.parentName === parentNode.name) + .reduce((pre: number, cur: SampleStruct) => pre + cur.cycles!, 0) : instructionArray[key] - .filter((i: any) => i.parentName === parentNode.name) - .reduce((pre: number, cur: SampleStruct) => pre + cur.instructions!, 0); + // @ts-ignore + .filter((i: unknown) => i.parentName === parentNode.name) + .reduce((pre: number, cur: SampleStruct) => pre + cur.instructions!, 0); const curWidth = isCycles ? cur.cycles : cur.instructions; const width = Math.floor(parentNode.frame.width * (curWidth / total)); if (i === 0) { @@ -382,18 +384,25 @@ export class TabPaneSampleInstruction extends BaseElement { * @param relationData * @param clickData */ - setRelationDataProperty(relationData: Array, clickData: SampleStruct): void { + setRelationDataProperty(relationData: Array, clickData: SampleStruct): void { const propertyData = this.instructionData.find((subArr: any) => subArr.some((obj: SampleStruct) => obj.begin === clickData.begin) ); //获取非unknown数据 - const knownRelation = relationData.filter((relation) => relation['name'].indexOf('unknown') < 0); + // @ts-ignore + const knownRelation = relationData.filter((relation) => relation.name.indexOf('unknown') < 0); propertyData.forEach((property: any) => { - const relation = knownRelation.find((relation) => relation['name'] === property['func_name']); + // @ts-ignore + const relation = knownRelation.find((relation) => relation.name === property.func_name); + // @ts-ignore relation['instructions'] = Math.ceil(property['instructions']) || 1; + // @ts-ignore relation['hoverInstructions'] = Math.ceil(property['instructions']); + // @ts-ignore relation['cycles'] = Math.ceil(property['cycles']) || 1; + // @ts-ignore relation['hoverCycles'] = Math.ceil(property['cycles']); + // @ts-ignore this.maxDepth = Math.max(this.maxDepth, relation['depth']); }); //获取所有unknown数据 @@ -401,24 +410,35 @@ export class TabPaneSampleInstruction extends BaseElement { let cyclesSum = 0; let hoverInstructionsSum = 0; let hoverCyclesSum = 0; - const unknownRelation = relationData.filter((relation) => relation['name'].indexOf('unknown') > -1); + // @ts-ignore + const unknownRelation = relationData.filter((relation) => relation.name.indexOf('unknown') > -1); if (unknownRelation.length > 0) { unknownRelation.forEach((unknownItem) => { instructionSum = 0; cyclesSum = 0; hoverInstructionsSum = 0; hoverCyclesSum = 0; + // @ts-ignore const children = unknownItem['children']; for (const key in children) { - const it = relationData.find((relation) => relation['name'] === key); + // @ts-ignore + const it = relationData.find((relation) => relation.name === key); + // @ts-ignore instructionSum += it['instructions'] ?? 0; + // @ts-ignore cyclesSum += it['cycles'] ?? 0; + // @ts-ignore hoverInstructionsSum += it['hoverInstructions'] ?? 0; + // @ts-ignore hoverCyclesSum += it['hoverCycles'] ?? 0; } + // @ts-ignore unknownItem['instructions'] = instructionSum; + // @ts-ignore unknownItem['hoverInstructions'] = hoverInstructionsSum; + // @ts-ignore unknownItem['cycles'] = cyclesSum; + // @ts-ignore unknownItem['hoverCycles'] = hoverCyclesSum; }); } diff --git a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionDistributions.ts b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionDistributions.ts index bb334e6cb..1d82fbc76 100644 --- a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionDistributions.ts +++ b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionDistributions.ts @@ -25,17 +25,17 @@ const barWidth = 2; // 柱子宽度 export class TabPaneSampleInstructionDistributions extends BaseElement { private instructionChartEle: HTMLCanvasElement | undefined | null; private ctx: CanvasRenderingContext2D | undefined | null; - private onReadableData: Array = []; + private onReadableData: Array = []; private hintContent = ''; //悬浮框内容 private floatHint!: HTMLDivElement | undefined | null; //悬浮框 private canvasScrollTop = 0; // tab页上下滚动位置 private isUpdateCanvas = false; - private cacheData: Array = []; + private cacheData: Array = []; private canvasX = -1; // 鼠标当前所在画布x坐标 private canvasY = -1; // 鼠标当前所在画布y坐标 private startX = 0; // 画布相对于整个界面的x坐标 private startY = 0; // 画布相对于整个界面的y坐标 - private hoverBar: any; + private hoverBar: unknown; private isChecked: boolean = false; private xCount = 0; //x轴刻度个数 private xMaxValue = 0; //x轴上数据最大值 @@ -105,7 +105,8 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { this.instructionChartEle!.onmouseleave = () => { this.hideTip(); }; - document.addEventListener('sample-popver-change', (e: any) => { + document.addEventListener('sample-popver-change', (e: unknown) => { + // @ts-ignore const select = Number(e.detail.select); this.isChecked = Boolean(select); this.calInstructionRangeCount(this.isChecked); @@ -135,8 +136,10 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { * @param canvasY * @returns */ - searchDataByCoord(nodes: any, canvasX: number, canvasY: number) { + searchDataByCoord(nodes: unknown, canvasX: number, canvasY: number) { + // @ts-ignore for (let i = 0; i < nodes.length; i++) { + // @ts-ignore const element = nodes[i]; if (this.isContains(element, canvasX, canvasY)) { return element; @@ -206,8 +209,14 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { } const detail = hoverNode!; this.hintContent = ` - ${detail.instruct}
- ${parseFloat(detail.heightPer)} + ${ + // @ts-ignore + detail.instruct + }
+ ${ + // @ts-ignore + parseFloat(detail.heightPer) + } `; } @@ -218,7 +227,8 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { * @param y * @returns */ - isContains(point: any, x: number, y: number): boolean { + isContains(point: unknown, x: number, y: number): boolean { + // @ts-ignore return x >= point.x && x <= point.x + 2 && point.y <= y && y <= point.y + point.height; } @@ -232,12 +242,16 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { const count = this.onReadableData.length; let instructions = {}; if (isCycles) { - instructions = this.onReadableData.reduce((pre: any, current: any) => { + // @ts-ignore + instructions = this.onReadableData.reduce((pre: unknown, current: unknown) => { + // @ts-ignore (pre[`${Math.ceil(current.cycles)}`] = pre[`${Math.ceil(current.cycles)}`] || []).push(current); return pre; }, {}); } else { - instructions = this.onReadableData.reduce((pre: any, current: any) => { + // @ts-ignore + instructions = this.onReadableData.reduce((pre: unknown, current: unknown) => { + // @ts-ignore (pre[`${Math.ceil(current.instructions)}`] = pre[`${Math.ceil(current.instructions)}`] || []).push(current); return pre; }, {}); @@ -250,7 +264,8 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { .map((i) => Number(i)) .reduce((pre, cur) => Math.max(pre, cur), 0) + 10; const yMaxValue = Object.values(instructions).reduce( - (pre: number, cur: any) => Math.max(pre, Number((cur.length / count).toFixed(2))), + // @ts-ignore + (pre: number, cur: unknown) => Math.max(pre, Number((cur.length / count).toFixed(2))), 0 ); this.yAvg = Number(((yMaxValue / 5) * 1.5).toFixed(2)) || yMaxValue; @@ -266,16 +281,19 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { * @param height * @param count */ - drawBar(instructionData: any, height: number, count: number) { + drawBar(instructionData: unknown, height: number, count: number) { const yTotal = Number((this.yAvg * 5).toFixed(2)); const interval = Math.floor((height - paddingBottom) / 6); + // @ts-ignore for (const x in instructionData) { const xNum = Number(x); const xPosition = xStep + (xNum / (this.xCount * this.xAvg)) * (this.xCount * this.xSpacing) - barWidth / 2; + // @ts-ignore const yNum = Number((instructionData[x].length / count).toFixed(3)); const percent = Number((yNum / yTotal).toFixed(2)); const barHeight = (height - paddingBottom - interval) * percent; this.drawRect(xPosition, height - paddingBottom - barHeight, barWidth, barHeight); + // @ts-ignore const existX = this.cacheData.find((i) => i.instruct === x); if (!existX) { this.cacheData.push({ @@ -286,6 +304,7 @@ export class TabPaneSampleInstructionDistributions extends BaseElement { heightPer: parseFloat((yNum * 100).toFixed(2)), }); } else { + // @ts-ignore existX.x = xPosition; } } diff --git a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelection.ts b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelection.ts index 1f17bd0f1..d87b3254a 100644 --- a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelection.ts +++ b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelection.ts @@ -28,8 +28,8 @@ export class TabPaneSampleInstructionSelection extends BaseElement { private instructionEle: HTMLCanvasElement | undefined | null; private ctx: CanvasRenderingContext2D | undefined | null; private textEle: HTMLSpanElement | undefined | null; - private instructionArray: Array = []; - private instructionData: Array = []; + private instructionArray: Array = []; + private instructionData: Array = []; private isUpdateCanvas = false; private canvasX = -1; // 鼠标当前所在画布x坐标 private canvasY = -1; // 鼠标当前所在画布y坐标 @@ -38,7 +38,7 @@ export class TabPaneSampleInstructionSelection extends BaseElement { private hintContent = ''; //悬浮框内容 private floatHint: HTMLDivElement | undefined | null; //悬浮框 private canvasScrollTop = 0; // tab页上下滚动位置 - private hoverSampleStruct: any | undefined; + private hoverSampleStruct: unknown | undefined; private isChecked: boolean = false; private maxDepth = 0; @@ -127,7 +127,8 @@ export class TabPaneSampleInstructionSelection extends BaseElement { this.instructionEle!.onmouseleave = () => { this.hideTip(); }; - document.addEventListener('sample-popver-change', (e: any) => { + document.addEventListener('sample-popver-change', (e: unknown) => { + // @ts-ignore const select = Number(e.detail.select); this.hoverSampleStruct = undefined; this.isChecked = Boolean(select); @@ -168,7 +169,9 @@ export class TabPaneSampleInstructionSelection extends BaseElement { this.ctx!.clearRect(0, 0, this.instructionEle!.width, this.instructionEle!.height); this.ctx!.beginPath(); for (const key in this.instructionArray) { + // @ts-ignore for (let i = 0; i < this.instructionArray[key].length; i++) { + // @ts-ignore const cur = this.instructionArray[key][i]; this.draw(this.ctx!, cur); } @@ -219,8 +222,12 @@ export class TabPaneSampleInstructionSelection extends BaseElement { if (!hoverNode) { return; } + // @ts-ignore this.hintContent = `${hoverNode.detail}(${hoverNode.name})
- ${this.isChecked ? hoverNode.hoverCycles : hoverNode.hoverInstructions} + ${ + // @ts-ignore + this.isChecked ? hoverNode.hoverCycles : hoverNode.hoverInstructions + } `; } @@ -248,7 +255,8 @@ export class TabPaneSampleInstructionSelection extends BaseElement { * @param y * @returns */ - isContains(frame: any, x: number, y: number): boolean { + isContains(frame: unknown, x: number, y: number): boolean { + // @ts-ignore return x >= frame.x && x <= frame.x + frame.width && frame.y <= y && y <= frame.y + frame.height; } @@ -261,35 +269,46 @@ export class TabPaneSampleInstructionSelection extends BaseElement { const clientWidth = this.instructionEle!.width; //将数据转换为层级结构 const instructionArray = this.instructionData - .filter((item: any) => (isCycles ? item.cycles : item.instructions)) - .reduce((pre: any, cur: any) => { + // @ts-ignore + .filter((item: unknown) => (isCycles ? item.cycles : item.instructions)) + .reduce((pre: unknown, cur: unknown) => { + // @ts-ignore (pre[`${cur.depth}`] = pre[`${cur.depth}`] || []).push(cur); return pre; }, {}); + // @ts-ignore for (const key in instructionArray) { + // @ts-ignore for (let i = 0; i < instructionArray[key].length; i++) { + // @ts-ignore const cur = instructionArray[key][i]; //第一级节点直接将宽度设置为容器宽度 if (key === '0') { this.setSampleFrame(cur, clientWidth, 0); } else { //获取上一层级节点数据 + // @ts-ignore const preList = instructionArray[Number(key) - 1]; //获取当前节点的父节点 const parentNode = preList.find((node: SampleStruct) => node.name === cur.parentName); //计算当前节点下指令数之和 用于计算每个节点所占的宽度比 const total = isCycles + // @ts-ignore ? instructionArray[key] - .filter((i: any) => i.parentName === parentNode.name) - .reduce((pre: number, cur: SampleStruct) => pre + cur.cycles!, 0) + // @ts-ignore + .filter((i: unknown) => i.parentName === parentNode.name) + .reduce((pre: number, cur: SampleStruct) => pre + cur.cycles!, 0) + // @ts-ignore : instructionArray[key] - .filter((i: any) => i.parentName === parentNode.name) - .reduce((pre: number, cur: SampleStruct) => pre + cur.instructions!, 0); + // @ts-ignore + .filter((i: unknown) => i.parentName === parentNode.name) + .reduce((pre: number, cur: SampleStruct) => pre + cur.instructions!, 0); const curWidth = isCycles ? cur.cycles : cur.instructions; const width = Math.floor(parentNode.frame.width * (curWidth / total)); if (i === 0) { this.setSampleFrame(cur, width, parentNode.frame.x); } else { + // @ts-ignore const preNode = instructionArray[key][i - 1]; preNode.parentName === parentNode.name ? this.setSampleFrame(cur, width, preNode.frame.x + preNode.frame.width) @@ -298,12 +317,16 @@ export class TabPaneSampleInstructionSelection extends BaseElement { } } } + // @ts-ignore this.instructionArray = instructionArray; this.ctx!.clearRect(0, 0, this.instructionEle!.width, this.instructionEle!.height); this.ctx!.beginPath(); + // @ts-ignore for (const key in instructionArray) { + // @ts-ignore for (let i = 0; i < instructionArray[key].length; i++) { + // @ts-ignore const cur = instructionArray[key][i]; this.draw(this.ctx!, cur); } @@ -333,9 +356,12 @@ export class TabPaneSampleInstructionSelection extends BaseElement { * @param canvasY * @returns */ - searchDataByCoord(nodes: any, canvasX: number, canvasY: number) { + searchDataByCoord(nodes: unknown, canvasX: number, canvasY: number) { + // @ts-ignore for (const key in nodes) { + // @ts-ignore for (let i = 0; i < nodes[key].length; i++) { + // @ts-ignore const cur = nodes[key][i]; if (this.isContains(cur.frame, canvasX, canvasY)) { return cur; @@ -359,12 +385,13 @@ export class TabPaneSampleInstructionSelection extends BaseElement { const textColor = ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.name || '', data.depth!, ColorUtils.FUNC_COLOR.length)]; ctx.lineWidth = 0.4; + // @ts-ignore if (this.hoverSampleStruct && data.name == this.hoverSampleStruct.name) { if (spApplication.dark) { ctx.strokeStyle = '#fff'; } else { ctx.strokeStyle = '#000'; - } + } } else { if (spApplication.dark) { ctx.strokeStyle = '#000'; @@ -384,27 +411,38 @@ export class TabPaneSampleInstructionSelection extends BaseElement { * @param instructionData * @returns */ - getAvgInstructionData(instructionData: Array) { + getAvgInstructionData(instructionData: Array) { + // @ts-ignore const length = instructionData[0].property.length; - const knowData = instructionData.filter((instruction) => instruction['name'].indexOf('unknown') < 0); + // @ts-ignore + const knowData = instructionData.filter((instruction) => instruction.name.indexOf('unknown') < 0); knowData.forEach((instruction) => { + // @ts-ignore if (instruction.property.length > 0) { - const totalInstruction = instruction['property'].reduce( - (pre: number, cur: SampleStruct) => pre + Math.ceil(cur['instructions']!), + // @ts-ignore + const totalInstruction = instruction.property.reduce( + (pre: number, cur: SampleStruct) => pre + Math.ceil(cur.instructions!), 0 ); - const totalCycles = instruction['property'].reduce( - (pre: number, cur: SampleStruct) => pre + Math.ceil(cur['cycles']!), + // @ts-ignore + const totalCycles = instruction.property.reduce( + (pre: number, cur: SampleStruct) => pre + Math.ceil(cur.cycles!), 0 ); - instruction['instructions'] = Math.ceil(totalInstruction / length) || 1; - instruction['cycles'] = Math.ceil(totalCycles / length) || 1; - instruction['hoverInstructions'] = Math.ceil(totalInstruction / length); - instruction['hoverCycles'] = Math.ceil(totalCycles / length); - this.maxDepth = Math.max(this.maxDepth, instruction['depth']); + // @ts-ignore + instruction.instructions = Math.ceil(totalInstruction / length) || 1; + // @ts-ignore + instruction.cycles = Math.ceil(totalCycles / length) || 1; + // @ts-ignore + instruction.hoverInstructions = Math.ceil(totalInstruction / length); + // @ts-ignore + instruction.hoverCycles = Math.ceil(totalCycles / length); + // @ts-ignore + this.maxDepth = Math.max(this.maxDepth, instruction.depth); } }); - const unknownData = instructionData.filter((instruction) => instruction['name'].indexOf('unknown') > -1); + // @ts-ignore + const unknownData = instructionData.filter((instruction) => instruction.name.indexOf('unknown') > -1); let instructionSum = 0; let cyclesSum = 0; let hoverInstructionsSum = 0; @@ -414,17 +452,27 @@ export class TabPaneSampleInstructionSelection extends BaseElement { cyclesSum = 0; hoverInstructionsSum = 0; hoverCyclesSum = 0; - for (const key in unknown['children']) { - const child = instructionData.find((instruction) => instruction['name'] === key); - instructionSum += child['instructions'] ?? 0; - cyclesSum += child['cycles'] ?? 0; - hoverInstructionsSum += child['hoverInstructions'] ?? 0; - hoverCyclesSum += child['hoverCycles'] ?? 0; + // @ts-ignore + for (const key in unknown.children) { + // @ts-ignore + const child = instructionData.find((instruction) => instruction.name === key); + // @ts-ignore + instructionSum += child.instructions ?? 0; + // @ts-ignore + cyclesSum += child.cycles ?? 0; + // @ts-ignore + hoverInstructionsSum += child.hoverInstructions ?? 0; + // @ts-ignore + hoverCyclesSum += child.hoverCycles ?? 0; } - unknown['instructions'] = instructionSum; - unknown['cycles'] = cyclesSum; - unknown['hoverInstructions'] = hoverInstructionsSum; - unknown['hoverCycles'] = hoverCyclesSum; + // @ts-ignore + unknown.instructions = instructionSum; + // @ts-ignore + unknown.cycles = cyclesSum; + // @ts-ignore + unknown.hoverInstructions = hoverInstructionsSum; + // @ts-ignore + unknown.hoverCycles = hoverCyclesSum; }); return instructionData; } diff --git a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelectionTotalTime.ts b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelectionTotalTime.ts index f2ff377e1..55f13292d 100644 --- a/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelectionTotalTime.ts +++ b/ide/src/trace/component/trace/sheet/bpftrace/TabPaneSampleInstructionSelectionTotalTime.ts @@ -130,7 +130,7 @@ export class TabPaneSampleInstructionTotalTime extends BaseElement { * @param canvasY * @returns */ - searchDataByCoord(nodes: unknown, canvasX: number, canvasY: number) { + searchDataByCoord(nodes: unknown, canvasX: number, canvasY: number): unknown { // @ts-ignore for (let i = 0; i < nodes.length; i++) { // @ts-ignore @@ -261,7 +261,7 @@ export class TabPaneSampleInstructionTotalTime extends BaseElement { * @param height * @param count */ - drawBar(instructionData: unknown, height: number, count: number) { + drawBar(instructionData: unknown, height: number, count: number): void { const yTotal = Number((this.yAvg * 5).toFixed(2)); const interval = Math.floor((height - paddingBottom) / 6); // @ts-ignore for (const x in instructionData) { diff --git a/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts b/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts index 6ad61fe2b..725d0baec 100644 --- a/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts +++ b/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts @@ -326,7 +326,7 @@ export class TabPaneSystemDetails extends BaseElement { if (i > -1) { // @ts-ignore fillMap.set(leftMap.get(filterData.pid), filterData); - delete watchIndex[i]; + watchIndex.splice(i); // @ts-ignore leftMap.delete(filterData.pid); } @@ -366,7 +366,7 @@ export class TabPaneSystemDetails extends BaseElement { if (i > -1) { // @ts-ignore fillMap.set(leftMap.get(filterData.message), filterData); - delete watchIndex[i]; + watchIndex.splice(i); // @ts-ignore leftMap.delete(filterData.message); } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts index d0aaebae8..9832d84bf 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts @@ -231,6 +231,8 @@ export class TabPaneFileStatistics extends BaseElement { } else if (this.fileStatisticsSortType === 2) { // @ts-ignore return fileStatisticsB.node[key] - fileStatisticsA.node[key]; + } else { + return 0; } }); // @ts-ignore fileStatisticsAllNode.children.forEach((item: unknown): void => { @@ -242,6 +244,8 @@ export class TabPaneFileStatistics extends BaseElement { } else if (this.fileStatisticsSortType === 2) { // @ts-ignore return fileStatisticsB.node[key] - fileStatisticsA.node[key]; + } else { + return 0; } }); }); diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatistics.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatistics.ts index 3bbf62bbb..723b292c5 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatistics.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatistics.ts @@ -323,13 +323,15 @@ export class TabPaneIOTierStatistics extends BaseElement { sortTable(allNode: unknown, key: string): void { // @ts-ignore - allNode.children.sort((ioTierStatNodeA: unknown, ioTierStatNodeB: unknown) => { + allNode.children.sort((ioTierStatNodeA: unknown, ioTierStatNodeB: unknown): number => { if (this.ioTierStatisticsSortType === 1) { // @ts-ignore return ioTierStatNodeA.node[key] - ioTierStatNodeB.node[key]; } else if (this.ioTierStatisticsSortType === 2) { // @ts-ignore return ioTierStatNodeB.node[key] - ioTierStatNodeA.node[key]; + } else { + return 0; } }); // @ts-ignore allNode.children.forEach((item: unknown): void => { @@ -341,6 +343,8 @@ export class TabPaneIOTierStatistics extends BaseElement { } else if (this.ioTierStatisticsSortType === 2) { // @ts-ignore return ioTierStatItemB.node[key] - ioTierStatItemA.node[key]; + } else { + return 0; } }); // @ts-ignore item.children.forEach((ioTierStatItem: unknown): void => { @@ -352,6 +356,8 @@ export class TabPaneIOTierStatistics extends BaseElement { } else if (this.ioTierStatisticsSortType === 2) { // @ts-ignore return ioTierStatItemB.node[key] - ioTierStatItemA.node[key]; + } else{ + return 0; } }); }); diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatistics.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatistics.ts index 948b8f885..7f061f1ed 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatistics.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatistics.ts @@ -29,19 +29,21 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { private vmStatisticsSelectionParam: SelectionParam | null | undefined; private vmStatisticsProgressEL: LitProgressBar | null | undefined; private vmStatisticsFilter: TabPaneFilter | null | undefined; - private loadingPage: any; + private loadingPage: unknown; private loadingList: number[] = []; - private vmStatisticsSource: Array = []; + private vmStatisticsSource: Array = []; private vmStatisticsSortKey: string = ''; private vmStatisticsSortType: number = 0; - private vmStatisticsResultData: Array = []; + private vmStatisticsResultData: Array = []; - set data(vmStatisticsSelection: SelectionParam | any) { + set data(vmStatisticsSelection: SelectionParam | unknown) { if (vmStatisticsSelection === this.vmStatisticsSelectionParam) { return; } this.vmStatisticsProgressEL!.loading = true; + // @ts-ignore this.loadingPage.style.visibility = 'visible'; + // @ts-ignore this.vmStatisticsSelectionParam = vmStatisticsSelection; // @ts-ignore this.vmStatisticsTbl!.shadowRoot!.querySelector('.table').style.height = `${ @@ -85,36 +87,48 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { this.parentElement!.clientHeight - 10 - 32 }px`; this.vmStatisticsTbl!.reMeauseHeight(); + // @ts-ignore this.loadingPage.style.height = `${this.parentElement!.clientHeight - 24}px`; } }).observe(this.parentElement!); } - getInitData(initVmMemoryStatItem: any, nameTitle: any = 'pname', subtitle: any = null): any { + getInitData(initVmMemoryStatItem: unknown, nameTitle: unknown = 'pname', subtitle: unknown = null): unknown { // @ts-ignore let title = nameTitle === 'type' ? VM_TYPE_MAP[initVmMemoryStatItem[nameTitle]] : initVmMemoryStatItem[nameTitle]; return { + // @ts-ignore ...initVmMemoryStatItem, + // @ts-ignore title: title + (subtitle ? `(${initVmMemoryStatItem[subtitle]})` : ''), + // @ts-ignore allDuration: Utils.getProbablyTime(initVmMemoryStatItem.allDuration), + // @ts-ignore minDuration: Utils.getProbablyTime(initVmMemoryStatItem.minDuration), + // @ts-ignore maxDuration: Utils.getProbablyTime(initVmMemoryStatItem.maxDuration), + // @ts-ignore avgDuration: Utils.getProbablyTime(initVmMemoryStatItem.avgDuration), + // @ts-ignore node: { ...initVmMemoryStatItem, children: [] }, }; } - queryDataByDB(vmMemoryStatParam: SelectionParam | any): void { + queryDataByDB(vmMemoryStatParam: SelectionParam | unknown): void { this.loadingList.push(1); this.vmStatisticsProgressEL!.loading = true; + // @ts-ignore this.loadingPage.style.visibility = 'visible'; getTabPaneVirtualMemoryStatisticsData( + // @ts-ignore vmMemoryStatParam.leftNs + vmMemoryStatParam.recordStartNs, + // @ts-ignore vmMemoryStatParam.rightNs + vmMemoryStatParam.recordStartNs ).then((result) => { this.loadingList.splice(0, 1); if (this.loadingList.length === 0) { this.vmStatisticsProgressEL!.loading = false; + // @ts-ignore this.loadingPage.style.visibility = 'hidden'; } this.vmStatisticsResultData = JSON.parse(JSON.stringify(result)); @@ -122,10 +136,10 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { }); } - sortStatus(result: Array, firstLevel: string, secondLevel: string): void { - let vmMemoryStatFatherMap = new Map(); - let vmMemoryStatChildMap = new Map(); - let vmMemoryStatAllNode: any = { + sortStatus(result: Array, firstLevel: string, secondLevel: string): void { + let vmMemoryStatFatherMap = new Map(); + let vmMemoryStatChildMap = new Map(); + let vmMemoryStatAllNode: unknown = { title: 'All', count: 0, allDuration: 0, @@ -138,21 +152,31 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { this.processChildMap(vmMemoryStatChildMap, item, firstLevel, secondLevel); this.processFatherMap(vmMemoryStatFatherMap, item, firstLevel); if (idx === 0) { + // @ts-ignore vmMemoryStatAllNode.minDuration = item.minDuration; } else { + // @ts-ignore vmMemoryStatAllNode.minDuration = + // @ts-ignore vmMemoryStatAllNode.minDuration <= item.minDuration ? vmMemoryStatAllNode.minDuration : item.minDuration; } + // @ts-ignore vmMemoryStatAllNode.count += item.count; + // @ts-ignore vmMemoryStatAllNode.allDuration += item.allDuration; + // @ts-ignore vmMemoryStatAllNode.maxDuration = + // @ts-ignore vmMemoryStatAllNode.maxDuration >= item.maxDuration ? vmMemoryStatAllNode.maxDuration : item.maxDuration; }); this.handleFatherMap(vmMemoryStatFatherMap, firstLevel, vmMemoryStatChildMap, vmMemoryStatAllNode); + // @ts-ignore vmMemoryStatAllNode.avgDuration = vmMemoryStatAllNode.allDuration / vmMemoryStatAllNode.count; vmMemoryStatAllNode = this.getInitData(vmMemoryStatAllNode); + // @ts-ignore vmMemoryStatAllNode.title = 'All'; + // @ts-ignore vmMemoryStatAllNode.path = { type: null, tid: null, pid: null, value: 'All' }; this.vmStatisticsSource = result.length > 0 ? [vmMemoryStatAllNode] : []; if (this.vmStatisticsSortType !== 0 && result.length > 0) { @@ -161,7 +185,7 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { this.theadClick(this.vmStatisticsSource); this.vmStatisticsTbl!.recycleDataSource = this.vmStatisticsSource; } - private theadClick(res: Array): void { + private theadClick(res: Array): void { let labels = this.vmStatisticsTbl?.shadowRoot?.querySelector('.th > .td')!.querySelectorAll('label'); if (labels) { for (let i = 0; i < labels.length; i++) { @@ -182,36 +206,43 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { } } private handleFatherMap( - vmMemoryStatFatherMap: Map, + vmMemoryStatFatherMap: Map, firstLevel: string, - vmMemoryStatChildMap: Map, - vmMemoryStatAllNode: any + vmMemoryStatChildMap: Map, + vmMemoryStatAllNode: unknown ): void { for (let ks of vmMemoryStatFatherMap.keys()) { let sp = vmMemoryStatFatherMap.get(ks); + // @ts-ignore sp!.children = []; + // @ts-ignore sp.avgDuration = sp.allDuration / sp.count; let vmMemoryStatNode = this.getInitData( sp, firstLevel === 'type' ? 'type' : 'pname', firstLevel === 'type' ? null : 'pid' ); + // @ts-ignore vmMemoryStatNode.path = { type: null, tid: null, pid: null, value: vmMemoryStatNode.title }; + // @ts-ignore vmMemoryStatNode.path[firstLevel === 'type' ? 'type' : 'pid'] = + // @ts-ignore vmMemoryStatNode[firstLevel === 'type' ? 'type' : 'pid']; this.handleChildMap(vmMemoryStatChildMap, ks, firstLevel, vmMemoryStatNode, sp); + // @ts-ignore vmMemoryStatAllNode.children.push(vmMemoryStatNode); } } private handleChildMap( - vmMemoryStatChildMap: Map, - ks: any, + vmMemoryStatChildMap: Map, + ks: unknown, firstLevel: string, - vmMemoryStatNode: any, - sp: any + vmMemoryStatNode: unknown, + sp: unknown ): void { for (let kst of vmMemoryStatChildMap.keys()) { + // @ts-ignore if (kst.startsWith(`${ks}_`)) { let spt = vmMemoryStatChildMap.get(kst); let data = this.getInitData( @@ -220,45 +251,67 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { firstLevel === 'type' ? 'pid' : 'tid' ); this.handleData(data, vmMemoryStatNode, firstLevel); + // @ts-ignore sp!.children.push(data); } } } - private handleData(data: any, vmMemoryStatNode: any, firstLevel: string): void { + private handleData(data: unknown, vmMemoryStatNode: unknown, firstLevel: string): void { + // @ts-ignore data.path = { type: null, tid: null, pid: null, + // @ts-ignore value: `All-${vmMemoryStatNode.title}-${data.title}`, }; + // @ts-ignore data.path[firstLevel === 'type' ? 'type' : 'pid'] = vmMemoryStatNode[firstLevel === 'type' ? 'type' : 'pid']; + // @ts-ignore data.path[firstLevel === 'type' ? 'pid' : 'tid'] = data[firstLevel === 'type' ? 'pid' : 'tid']; - data.children.forEach((e: any) => { + // @ts-ignore + data.children.forEach((e: unknown) => { + // @ts-ignore e.path = { type: null, tid: null, pid: null, + // @ts-ignore value: `All-${vmMemoryStatNode.title}-${data.title}-${e.title}`, }; + // @ts-ignore e.path[firstLevel === 'type' ? 'type' : 'pid'] = vmMemoryStatNode[firstLevel === 'type' ? 'type' : 'pid']; + // @ts-ignore e.path[firstLevel === 'type' ? 'pid' : 'tid'] = data[firstLevel === 'type' ? 'pid' : 'tid']; + // @ts-ignore e.path[firstLevel === 'type' ? 'tid' : 'type'] = e[firstLevel === 'type' ? 'tid' : 'type']; }); } - private processFatherMap(vmMemoryStatFatherMap: Map, item: any, firstLevel: string): void { + private processFatherMap(vmMemoryStatFatherMap: Map, item: unknown, firstLevel: string): void { + // @ts-ignore if (vmMemoryStatFatherMap.has(item[firstLevel])) { + // @ts-ignore let vmMemoryStatFatherObj = vmMemoryStatFatherMap.get(item[firstLevel]); + // @ts-ignore vmMemoryStatFatherObj.count += item.count; + // @ts-ignore vmMemoryStatFatherObj.allDuration += item.allDuration; + // @ts-ignore vmMemoryStatFatherObj.minDuration = + // @ts-ignore vmMemoryStatFatherObj.minDuration <= item.minDuration ? vmMemoryStatFatherObj.minDuration : item.minDuration; + // @ts-ignore vmMemoryStatFatherObj.maxDuration = + // @ts-ignore vmMemoryStatFatherObj.maxDuration >= item.maxDuration ? vmMemoryStatFatherObj.maxDuration : item.maxDuration; + // @ts-ignore vmMemoryStatFatherObj.children.push(this.getInitData(item)); } else { + // @ts-ignore vmMemoryStatFatherMap.set(item[firstLevel], { + // @ts-ignore ...item, children: [this.getInitData(item)], }); @@ -266,24 +319,35 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { } private processChildMap( - vmMemoryStatChildMap: Map, - item: any, + vmMemoryStatChildMap: Map, + item: unknown, firstLevel: string, secondLevel: string ): void { + // @ts-ignore if (vmMemoryStatChildMap.has(`${item[firstLevel]}_${item[secondLevel]}`)) { + // @ts-ignore let vmMemoryStatChildObj = vmMemoryStatChildMap.get(`${item[firstLevel]}_${item[secondLevel]}`); + // @ts-ignore vmMemoryStatChildObj.count += item.count; + // @ts-ignore vmMemoryStatChildObj.allDuration += item.allDuration; + // @ts-ignore vmMemoryStatChildObj.minDuration = + // @ts-ignore vmMemoryStatChildObj.minDuration <= item.minDuration ? vmMemoryStatChildObj.minDuration : item.minDuration; + // @ts-ignore vmMemoryStatChildObj.maxDuration = + // @ts-ignore vmMemoryStatChildObj.maxDuration >= item.maxDuration ? vmMemoryStatChildObj.maxDuration : item.maxDuration; + // @ts-ignore vmMemoryStatChildObj.children.push( this.getInitData(item, firstLevel === 'type' ? 'tname' : 'type', firstLevel === 'type' ? 'tid' : null) ); } else { + // @ts-ignore vmMemoryStatChildMap.set(`${item[firstLevel]}_${item[secondLevel]}`, { + // @ts-ignore ...item, children: [ this.getInitData(item, firstLevel === 'type' ? 'tname' : 'type', firstLevel === 'type' ? 'tid' : null), @@ -292,28 +356,45 @@ export class TabPaneVirtualMemoryStatistics extends BaseElement { } } - sortVmStatisticsTable(allNode: any, key: string): void { - allNode.children.sort((vmStatNodeA: any, vmStatNodeB: any) => { + sortVmStatisticsTable(allNode: unknown, key: string): void { + // @ts-ignore + allNode.children.sort((vmStatNodeA: unknown, vmStatNodeB: unknown): number => { if (this.vmStatisticsSortType === 1) { + // @ts-ignore return vmStatNodeA.node[key] - vmStatNodeB.node[key]; } else if (this.vmStatisticsSortType === 2) { + // @ts-ignore return vmStatNodeB.node[key] - vmStatNodeA.node[key]; + } else { + return 0; } }); - allNode.children.forEach((item: any): void => { - item.children.sort((vmStatNodeA: any, vmStatNodeB: any) => { + // @ts-ignore + allNode.children.forEach((item: unknown): void => { + // @ts-ignore + item.children.sort((vmStatNodeA: unknown, vmStatNodeB: unknown): number => { if (this.vmStatisticsSortType === 1) { + // @ts-ignore return vmStatNodeA.node[key] - vmStatNodeB.node[key]; } else if (this.vmStatisticsSortType === 2) { + // @ts-ignore return vmStatNodeB.node[key] - vmStatNodeA.node[key]; + } else { + return 0; } }); - item.children.forEach((vmStatItem: any) => { - vmStatItem.children.sort((vmStatItemA: any, vmStatItemB: any) => { + // @ts-ignore + item.children.forEach((vmStatItem: unknown) => { + // @ts-ignore + vmStatItem.children.sort((vmStatItemA: unknown, vmStatItemB: unknown): number => { if (this.vmStatisticsSortType === 1) { + // @ts-ignore return vmStatItemA.node[key] - vmStatItemB.node[key]; } else if (this.vmStatisticsSortType === 2) { + // @ts-ignore return vmStatItemB.node[key] - vmStatItemA.node[key]; + } else { + return 0; } }); }); diff --git a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts index aa9964301..b871f6341 100644 --- a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts +++ b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts @@ -403,6 +403,15 @@ function returnObj( dur: item.dur, percent: (item.dur / sum) * PERCENT, }; + default: + return { + thread: item.pid + '_' + item.tid, + consumption: 0, + cpu: item.cpu, + frequency: 'unknown', + dur: item.dur, + percent: (item.dur / sum) * PERCENT, + }; } } diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMCallTree.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMCallTree.ts index f2915a564..0937b851b 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMCallTree.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMCallTree.ts @@ -189,7 +189,7 @@ export class TabpaneNMCalltree extends BaseElement { selections.push({ memoryTap: memory, }); - if (that.currentSelection?.nativeMemory && that.currentSelection.nativeMemory.length > 0) { + if (this.currentSelection?.nativeMemory && this.currentSelection.nativeMemory.length > 0) { const typeName = SpSystemTrace.DATA_DICT.get(memory); if ((data.type === 'MmapEvent' && memory === -1) || data.type === typeName) { data.type = `${selections.length + 2}`; @@ -339,17 +339,16 @@ export class TabpaneNMCalltree extends BaseElement { async initFilterTypes(): Promise { this.currentNMCallTreeFilter = this.shadowRoot?.querySelector('#nm-call-tree-filter'); let secondFilterList = ['All Heap & Anonymous VM', 'All Heap', 'All Anonymous VM']; - let that = this; - function addSubType(subTypeList: unknown): void { + const addSubType = (subTypeList: unknown): void => { if (!subTypeList) { return; } - that.subTypeArr = []; // @ts-ignore + this.subTypeArr = []; // @ts-ignore for (let data of subTypeList) { secondFilterList.push(data.subType); - that.subTypeArr.push(data.subTypeId); + this.subTypeArr.push(data.subTypeId); } - } + }; if (this.currentSelection!.nativeMemory!.length > 0) { let subTypeList = await queryNativeHookSubType( this.currentSelection!.leftNs, @@ -417,7 +416,7 @@ export class TabpaneNMCalltree extends BaseElement { this.nmCallTreeTbl!.rememberScrollTop = true; this.nmCallTreeTbl!.exportTextHandleMap.set('heapSizeStr', (value) => { // @ts-ignore - return `${value['size']}`; + return `${value.size}`; }); this.nmCallTreeFilter = this.shadowRoot?.querySelector('#nm-call-tree-filter'); this.filesystemTbr = this.shadowRoot?.querySelector('#tb-filesystem-list'); diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts index 8b6a1c460..15100276d 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts @@ -322,11 +322,11 @@ export class TabPaneNMSampleList extends BaseElement { TabPaneNMSampleList.filter!.firstSelect = TabPaneNMSampleList.filterSelect; TabPaneNMSampleList.sampleTbl!.exportTextHandleMap.set('totalGrowth', (value) => { // @ts-ignore - return `${value['total']}`; + return `${value.total}`; }); TabPaneNMSampleList.sampleTbl!.exportTextHandleMap.set('growth', (value) => { // @ts-ignore - return `${value['heapSize']}`; + return `${value.heapSize}`; }); } diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts index 3f384ca4f..beb10971c 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts @@ -1151,25 +1151,23 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { return typeMap; } - let that = this; - - function setSize(item: unknown): void { + const setSize = (item: unknown): void => { // @ts-ignore - that.currentLevelApplySize += item.size; // @ts-ignore - that.currentLevelApplyCount += item.count; - if (that.isStatistic) { + this.currentLevelApplySize += item.size; // @ts-ignore + this.currentLevelApplyCount += item.count; + if (this.isStatistic) { // @ts-ignore - that.currentLevelReleaseSize += item.releaseSize; // @ts-ignore - that.currentLevelReleaseCount += item.releaseCount; + this.currentLevelReleaseSize += item.releaseSize; // @ts-ignore + this.currentLevelReleaseCount += item.releaseCount; } else { // @ts-ignore if (item.isRelease) { // @ts-ignore - that.currentLevelReleaseSize += item.size; // @ts-ignore - that.currentLevelReleaseCount += item.count; + this.currentLevelReleaseSize += item.size; // @ts-ignore + this.currentLevelReleaseCount += item.count; } } - } + }; for (let itemData of dbArray) { // @ts-ignore diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneThreadUsage.ts b/ide/src/trace/component/trace/sheet/process/TabPaneThreadUsage.ts index 661e19378..ec029cff1 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneThreadUsage.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneThreadUsage.ts @@ -234,7 +234,7 @@ export class TabPaneThreadUsage extends BaseElement { if (threadUsageRightData[property] > threadUsageLeftData[property]) { return treadUsageSort === 2 ? 1 : -1; // @ts-ignore - } else if (threadUsageRightData[property] == threadUsageLeftData[property]) { + } else if (threadUsageRightData[property] === threadUsageLeftData[property]) { return 0; } else { return treadUsageSort === 2 ? -1 : 1; diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts index 3789db337..20edaf8e1 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts @@ -63,7 +63,6 @@ export class TabPaneSmapsComparison extends TabPaneSmapsStatistics { this.querySmapsData(data.leftNs, fileArr[0].startNs); } private initSelect(fileStartNs: number, smapsComFileArr: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -83,7 +82,7 @@ export class TabPaneSmapsComparison extends TabPaneSmapsStatistics { // @ts-ignore if (input.value === f.name) { // @ts-ignore - that.querySmapsData(fileStartNs, f.startNs); + this.querySmapsData(fileStartNs, f.startNs); } } // @ts-ignore e.stopPropagation(); diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts index a067177d5..da1de4d16 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts @@ -38,7 +38,7 @@ export class TabPaneSmapsRecord extends BaseElement { set data(smapsValue: SelectionParam | unknown) { this.smapsRecordDataSource = []; if (smapsValue) { - if (this.pixelmapId == -1) { + if (this.pixelmapId === -1) { for (let [key, value] of SpSystemTrace.DATA_DICT) { if (value === 'pixelmap') { this.pixelmapId = key; @@ -106,7 +106,7 @@ export class TabPaneSmapsRecord extends BaseElement { this.smapsRecordTable = this.shadowRoot?.querySelector('#smaps-record-tbl'); } - connectedCallback() { + connectedCallback(): void { super.connectedCallback(); resizeObserver(this.parentElement!, this.smapsRecordTable!); new ResizeObserver(() => { diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts index b62089b4e..327f57333 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts @@ -78,6 +78,7 @@ export class TabPaneSmapsStatistics extends BaseElement { async queryDataByDB(smapsVal: SelectionParam): Promise { getTabSmapsMaxSize(smapsVal.leftNs, smapsVal.rightNs, (MemoryConfig.getInstance().interval * 1000_000) / 5).then( (maxRes) => { + // @ts-ignore this.sumSize = maxRes[0].max_value; } ); @@ -216,6 +217,7 @@ export class TabPaneSmapsStatistics extends BaseElement { async setSmaps(data: SelectionParam): Promise { getTabSmapsStatisticMaxSize(data.leftNs).then((maxRes) => { + // @ts-ignore this.sumSize = maxRes[0].max_value; }); await getTabSmapsStatisticData(data.leftNs).then((result) => { diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts index e59c271b8..f90d4b1a2 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts @@ -55,7 +55,6 @@ export class TabPanePurgPinComparisonVM extends BaseElement { this.updateComparisonData(data.startNs, fileArr[0].startNs); } private initSelect(fileStartNs: number, purgePinComVmList: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -78,7 +77,7 @@ export class TabPanePurgPinComparisonVM extends BaseElement { // @ts-ignore if (input.value === f.name) { // @ts-ignore - that.updateComparisonData(fileStartNs, f.startNs); + this.updateComparisonData(fileStartNs, f.startNs); } } // @ts-ignore diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts index 8fcd6c18b..13c748b50 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts @@ -58,7 +58,6 @@ export class TabPanePurgTotalComparisonVM extends BaseElement { } private initSelect(fileStartNs: number, purgeTotalComList: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -81,7 +80,7 @@ export class TabPanePurgTotalComparisonVM extends BaseElement { // @ts-ignore if (input.value === f.name) { // @ts-ignore - that.updateComparisonsData(fileStartNs, f.startNs); + this.updateComparisonsData(fileStartNs, f.startNs); } } // @ts-ignore diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts index 468574b07..536fad48d 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts @@ -55,7 +55,6 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { setShmData(data: SnapshotStruct, dataList: Array): void { let fileArr: SnapshotStruct[] = []; - let that = this; for (let file of dataList) { if (file.startNs !== data.startNs) { fileArr.push(file); @@ -65,7 +64,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { this.baseFileTs = data.startNs; this.initSelect(data.startNs, fileArr); this.targetFileTs = fileArr[0].startNs; - that.updateComparisonData(data.startNs, fileArr[0].startNs); + this.updateComparisonData(data.startNs, fileArr[0].startNs); } async updateComparisonData(baseFileTs: number, targetFileTs: number): Promise { @@ -101,7 +100,6 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { } initSelect(fileId: number, fileArr: Array): void { - let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; let option = new LitSelectOption(); @@ -119,7 +117,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { this.comparisonTableEl!.scrollTop = 0; for (let f of fileArr) { if (input.value === f.name) { - that.updateComparisonData(fileId, f.startNs); + this.updateComparisonData(fileId, f.startNs); } } e.stopPropagation(); diff --git a/ide/src/trace/database/ConfigWorker.ts b/ide/src/trace/database/ConfigWorker.ts index cedbe3755..ef7ed0726 100644 --- a/ide/src/trace/database/ConfigWorker.ts +++ b/ide/src/trace/database/ConfigWorker.ts @@ -42,7 +42,7 @@ self.onmessage = async (e: MessageEvent): Promise => { let jsFile = e.data.wasmJsName; importScripts(jsFile); await initConfigWASM(e.data.WasmName); - let dataCallBack = (heapPtr: number, size: number, isEnd: number, isConfig: number) => { + let dataCallBack = (heapPtr: number, size: number, isEnd: number, isConfig: number): void => { if (isConfig === 1) { // @ts-ignore let jsonOut: Uint8Array = Module_T.HEAPU8.slice(heapPtr, heapPtr + size); diff --git a/ide/src/trace/database/StateBusyTimeWorker.ts b/ide/src/trace/database/StateBusyTimeWorker.ts index 4784445ab..d75dd9dfd 100644 --- a/ide/src/trace/database/StateBusyTimeWorker.ts +++ b/ide/src/trace/database/StateBusyTimeWorker.ts @@ -147,14 +147,17 @@ self.onmessage = (e: MessageEvent): void => { let rightEndNs = (e.data.timeParam.rightNs + e.data.timeParam.recordStartNs) as number; e.data.cpuFiliterOrder.forEach((a: number) => { getBusyTime( - e.data.result.filter((f: any) => f.cpu === a), - e.data.res.filter((f: any) => f.cpu === a), + // @ts-ignore + e.data.result.filter((f: unknown) => f.cpu === a), + // @ts-ignore + e.data.res.filter((f: unknown) => f.cpu === a), e.data.sampleMap, leftStartNs, rightEndNs ); }); - e.data.sampleMap.forEach((a: any) => { + e.data.sampleMap.forEach((a: unknown) => { + // @ts-ignore a.busyTime = parseFloat((a.busyTime / 1000000.0).toFixed(6)); }); diff --git a/ide/src/trace/database/TraceWorker.ts b/ide/src/trace/database/TraceWorker.ts index a4d5f0c84..5b7bf0569 100644 --- a/ide/src/trace/database/TraceWorker.ts +++ b/ide/src/trace/database/TraceWorker.ts @@ -20,7 +20,7 @@ import { temp_init_sql_list } from './TempSql'; // @ts-ignore import { BatchSphData } from '../proto/SphBaseData'; -let wasmModule: any = null; +let wasmModule: unknown = null; let enc = new TextEncoder(); let dec = new TextDecoder(); let arr: Uint8Array | undefined; @@ -49,6 +49,7 @@ const maxSize = 48 * 1024 * 1024; let protoDataMap: Map = new Map(); function clear(): void { if (wasmModule !== null) { + //@ts-ignore wasmModule._TraceStreamerReset(); wasmModule = null; } @@ -255,7 +256,7 @@ async function onmessageByOpenAction(e: MessageEvent): Promise { //@ts-ignore wasmModule._TraceStreamerParseDataOver(); for (let value of thirdWasmMap.values()) { - value.model._TraceStreamer_In_ParseDataOver(); + value.model._TraceStreamerInParseDataOver(); } postMessageByOpenAction(r2, e); } @@ -298,7 +299,7 @@ function initModuleCallBackAndFun(): void { //@ts-ignore let tlvResultFun = wasmModule.addFunction(tlvResultCallback, 'viiii'); //@ts-ignore - wasmModule._TraceStreamer_Set_Log_Level(5); + wasmModule._TraceStreamerSetLogLevel(5); //@ts-ignore reqBufferAddr = wasmModule._Initialize(REQ_BUF_SIZE, fn1, tlvResultFun, fn2); } @@ -307,8 +308,11 @@ function parseThirdWasmByOpenAction(e: MessageEvent): void { let parseConfig = e.data.parseConfig; if (parseConfig !== '') { let parseConfigArray = enc.encode(parseConfig); + //@ts-ignore let parseConfigAddr = wasmModule._InitializeParseConfig(1024); + //@ts-ignore wasmModule.HEAPU8.set(parseConfigArray, parseConfigAddr); + //@ts-ignore wasmModule._TraceStreamerParserConfigEx(parseConfigArray.length); } let wasmConfigStr = e.data.wasmConfig; @@ -321,13 +325,16 @@ function parseThirdWasmByOpenAction(e: MessageEvent): void { }); let thirdWasmStr: string = itemArray.join(';'); let configUintArray = enc.encode(thirdWasmStr + ';'); + //@ts-ignore wasmModule.HEAPU8.set(configUintArray, reqBufferAddr); - wasmModule._TraceStreamer_Init_ThirdParty_Config(configUintArray.length); + //@ts-ignore + wasmModule._TraceStreamerInitThirdPartyConfig(configUintArray.length); let first = true; let sendDataCallback = (heapPtr: number, size: number, componentID: number): void => { if (componentID === 100) { if (first) { first = false; + //@ts-ignore headUnitArray = wasmModule.HEAPU8.slice(heapPtr, heapPtr + size); } return; @@ -344,14 +351,17 @@ function parseThirdWasmByOpenAction(e: MessageEvent): void { setThirdWasmMap(config, heapPtr, size, componentID); } else { let mm = model.model; + //@ts-ignore let out: Uint8Array = wasmModule.HEAPU8.slice(heapPtr, heapPtr + size); mm.HEAPU8.set(out, model.bufferAddr); mm._ParserData(out.length, componentID); } } }; + //@ts-ignore let fn1 = wasmModule.addFunction(sendDataCallback, 'viii'); - wasmModule._TraceStreamer_Set_ThirdParty_DataDealer(fn1, REQ_BUF_SIZE); + //@ts-ignore + wasmModule._TraceStreamerSetThirdPartyDataDealer(fn1, REQ_BUF_SIZE); } } @@ -469,7 +479,7 @@ function setThirdWasmMap(config: unknown, heapPtr: number, size: number, compone let thirdreqBufferAddr = thirdMode._Init(fn, REQ_BUF_SIZE); initTraceRange(thirdMode); //@ts-ignore - thirdMode._TraceStreamer_In_JsonConfig(); + thirdMode._TraceStreamerInJsonConfig(); //@ts-ignore thirdMode.HEAPU8.set(headUnitArray, thirdreqBufferAddr); //@ts-ignore @@ -521,7 +531,9 @@ function initTraceRange(thirdMode: unknown): void { let updateTraceTimeCallBack = (heapPtr: number, size: number): void => { //@ts-ignore let out: Uint8Array = thirdMode.HEAPU8.slice(heapPtr, heapPtr + size); + //@ts-ignore wasmModule.HEAPU8.set(out, reqBufferAddr); + //@ts-ignore wasmModule._UpdateTraceTime(out.length); }; //@ts-ignore @@ -631,6 +643,7 @@ function onmessageByDownloadDBAction(e: MessageEvent): void { return mergedArray; }; let getDownloadDb = (heapPtr: number, size: number, isEnd: number): void => { + //@ts-ignore let out: Uint8Array = wasmModule.HEAPU8.slice(heapPtr, heapPtr + size); bufferSliceUint.push(out); if (isEnd === 1) { @@ -1224,13 +1237,17 @@ function splitLongTrace( splitReqBufferAddr?: number ): [number, number] { const sliceLen = Math.min(uint8Array.length - cutFileSize, REQ_BUF_SIZE); + //@ts-ignore const dataSlice = uint8Array.subarray(cutFileSize, cutFileSize + sliceLen); + //@ts-ignore wasmModule.HEAPU8.set(dataSlice, splitReqBufferAddr); cutFileSize += sliceLen; resultFileSize += sliceLen; if (resultFileSize >= fileSize) { + //@ts-ignore wasmModule._TraceStreamerLongTraceSplitFileEx(sliceLen, 1, pageNum); } else { + //@ts-ignore wasmModule._TraceStreamerLongTraceSplitFileEx(sliceLen, 0, pageNum); } return [cutFileSize, resultFileSize]; @@ -1278,7 +1295,9 @@ const uploadSoFile = async (file: File | null): Promise => { if (file) { let fileNameBuffer: Uint8Array | null = enc.encode(file.webkitRelativePath); let fileNameLength = fileNameBuffer.length; + //@ts-ignore let addr = wasmModule._InitFileName(uploadSoCallbackFn, fileNameBuffer.length); + //@ts-ignore wasmModule.HEAPU8.set(fileNameBuffer, addr); let writeSize = 0; let upRes = -1; @@ -1400,22 +1419,28 @@ function cutFileByRange(e: MessageEvent): void { let uint8Array = new Uint8Array(e.data.buffer); let resultBuffer: Array = []; let cutFileCallBack = cutFileCallBackFunc(resultBuffer, uint8Array, e); + //@ts-ignore splitReqBufferAddr = wasmModule._InitializeSplitFile(wasmModule.addFunction(cutFileCallBack, 'viiii'), REQ_BUF_SIZE); let cutTimeRange = `${cutLeftTs};${cutRightTs};`; let cutTimeRangeBuffer = enc.encode(cutTimeRange); + //@ts-ignore wasmModule.HEAPU8.set(cutTimeRangeBuffer, splitReqBufferAddr); + //@ts-ignore wasmModule._TraceStreamerSplitFileEx(cutTimeRangeBuffer.length); let cutFileSize = 0; let receiveFileResult = -1; while (cutFileSize < uint8Array.length) { const sliceLen = Math.min(uint8Array.length - cutFileSize, REQ_BUF_SIZE); const dataSlice = uint8Array.subarray(cutFileSize, cutFileSize + sliceLen); + //@ts-ignore wasmModule.HEAPU8.set(dataSlice, splitReqBufferAddr); cutFileSize += sliceLen; try { if (cutFileSize >= uint8Array.length) { + //@ts-ignore receiveFileResult = wasmModule._TraceStreamerReciveFileEx(sliceLen, 1); } else { + //@ts-ignore receiveFileResult = wasmModule._TraceStreamerReciveFileEx(sliceLen, 0); } } catch (error) { @@ -1435,6 +1460,7 @@ function cutFileByRange(e: MessageEvent): void { } function cutFileCallBackFunc(resultBuffer: Array, uint8Array: Uint8Array, e: MessageEvent): Function { return (heapPtr: number, size: number, fileType: number, isEnd: number) => { + //@ts-ignore let out: Uint8Array = wasmModule.HEAPU8.slice(heapPtr, heapPtr + size); if (FileTypeEnum.data === fileType) { resultBuffer.push(out); @@ -1473,7 +1499,9 @@ function cutFileCallBackFunc(resultBuffer: Array, uint8Array: Uint8A function createView(sql: string): void { let array = enc.encode(sql); + //@ts-ignore wasmModule.HEAPU8.set(array, reqBufferAddr); + //@ts-ignore wasmModule._TraceStreamerSqlOperateEx(array.length); } @@ -1491,7 +1519,9 @@ function query(name: string, sql: string, params: unknown): void { }); } let sqlUintArray = enc.encode(sql); + //@ts-ignore wasmModule.HEAPU8.set(sqlUintArray, reqBufferAddr); + //@ts-ignore wasmModule._TraceStreamerSqlQueryEx(sqlUintArray.length); } @@ -1553,7 +1583,7 @@ function queryDataFromIndexeddb(getRequest: IDBRequest { +export const initCallChainDataSql = (args: unknown): string => { const sql = `SELECT function_id AS id, 0 As functionId, 0 AS startTime, @@ -73,7 +73,7 @@ export const initCallChainDataSql = (args: unknown) => { return sql; }; -export const queryChartDataSqlMem = (args: Args) => { +export const queryChartDataSqlMem = (args: Args): string => { const sql = `SELECT id, function_id AS functionId, start_time - ${args.recordStartNS} AS startTime, diff --git a/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts b/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts index 2d41acd76..83738399b 100644 --- a/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts +++ b/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts @@ -192,7 +192,8 @@ export function hiSysEnergyPowerReceiver(data: unknown, proc: Function): void { export function hiSysEnergyStateReceiver(data: unknown, proc: Function): void { // @ts-ignore if (data.params.trafic === TraficEnum.Memory) { - let res: unknown[], list: unknown[]; + let res: unknown[]; + let list: unknown[]; // @ts-ignore if (!energyList.has(data.params.eventName)) { // @ts-ignore @@ -321,7 +322,7 @@ function eventNameWithPowerRunninglock(beanData: unknown, it: unknown, systemDat // @ts-ignore beanData.type = 1; systemDataList.push(beanData); - delete tokedIds[number]; + tokedIds.splice(number); } } } @@ -412,7 +413,7 @@ function eventNameWithWorkStop( let index = nameIdList.indexOf(beanData.workId); if (nameIdList !== undefined && index > -1) { // @ts-ignore - delete nameIdList[index]; + nameIdList.splice(index); // @ts-ignore let workCount = workCountMap.get(beanData.appName); if (workCount !== undefined) { diff --git a/ide/src/trace/database/data-trafic/IrqDataReceiver.ts b/ide/src/trace/database/data-trafic/IrqDataReceiver.ts index e90bad145..341b59e42 100644 --- a/ide/src/trace/database/data-trafic/IrqDataReceiver.ts +++ b/ide/src/trace/database/data-trafic/IrqDataReceiver.ts @@ -19,10 +19,8 @@ import { Args } from './CommonArgs'; export const chartIrqDataSql = (args: Args): string => { if (args.name === 'irq') { return ` - select i.ts - ${ - args.recordStartNS - } as startNs, - max(i.dur) as dur, + select i.ts - ${args.recordStartNS} as startNs, + max(i.dur) as dur, i.depth, ifnull(argsetid, -1) as argSetId, i.id, diff --git a/ide/src/trace/database/data-trafic/NativeMemoryDataReceiver.ts b/ide/src/trace/database/data-trafic/NativeMemoryDataReceiver.ts index aebfff61e..cebf44b42 100644 --- a/ide/src/trace/database/data-trafic/NativeMemoryDataReceiver.ts +++ b/ide/src/trace/database/data-trafic/NativeMemoryDataReceiver.ts @@ -319,7 +319,7 @@ function getFilterLevel(len: number): number { } } -export function nativeMemoryCacheClear() { +export function nativeMemoryCacheClear(): void { dataCache.normalCache.clear(); dataCache.statisticsCache.clear(); } @@ -497,7 +497,7 @@ export function filterNativeMemoryChartData( return dataSource; } -function setDataSource(data: unknown, dataSource: NativeMemoryDataSource, cache: unknown) { +function setDataSource(data: unknown, dataSource: NativeMemoryDataSource, cache: unknown): void { // @ts-ignore Reflect.ownKeys(data).map((kv: string | symbol): void => { // @ts-ignore diff --git a/ide/src/trace/database/data-trafic/SliceReceiver.ts b/ide/src/trace/database/data-trafic/SliceReceiver.ts index b97516895..1def0aacb 100644 --- a/ide/src/trace/database/data-trafic/SliceReceiver.ts +++ b/ide/src/trace/database/data-trafic/SliceReceiver.ts @@ -90,7 +90,7 @@ export function sliceReceiver(data: unknown, proc: Function): void { postMsg(data, count); } -export function sliceSPTReceiver(data: unknown) { +export function sliceSPTReceiver(data: unknown): void { //@ts-ignore if (data && data.params.func) { //@ts-ignore diff --git a/ide/src/trace/database/data-trafic/cpu/CpuFreqLimitDataReceiver.ts b/ide/src/trace/database/data-trafic/cpu/CpuFreqLimitDataReceiver.ts index 0b7483ca2..73431b0ad 100644 --- a/ide/src/trace/database/data-trafic/cpu/CpuFreqLimitDataReceiver.ts +++ b/ide/src/trace/database/data-trafic/cpu/CpuFreqLimitDataReceiver.ts @@ -64,7 +64,8 @@ export const chartCpuFreqLimitDataSqlMem = (args: Args): string => { export function cpuFreqLimitReceiver(data: unknown, proc: Function): void { // @ts-ignore if (data.params.trafic === TraficEnum.Memory) { - let res: unknown[], list: unknown[]; + let res: unknown[]; + let list: unknown[]; // @ts-ignore if (!cpuFreqLimitList.has(data.params.cpu)) { // @ts-ignore diff --git a/ide/src/trace/database/data-trafic/process/ProcessMemDataReceiver.ts b/ide/src/trace/database/data-trafic/process/ProcessMemDataReceiver.ts index 1b07d5af0..aa4132490 100644 --- a/ide/src/trace/database/data-trafic/process/ProcessMemDataReceiver.ts +++ b/ide/src/trace/database/data-trafic/process/ProcessMemDataReceiver.ts @@ -28,7 +28,9 @@ export const chartProcessMemDataSql = (args: Args): string => { }; export function processMemDataReceiver(data: unknown, proc: Function): void { - let res: unknown[], list: unknown[]; //@ts-ignore + let res: unknown[]; + let list: unknown[]; + //@ts-ignore if (!memList.has(data.params.trackId)) { //@ts-ignore list = proc(chartProcessMemDataSql(data.params)); //@ts-ignore @@ -45,7 +47,7 @@ function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): v //@ts-ignore let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); //@ts-ignore let ts = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.ts); //@ts-ignore - let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value); //@ts-ignore + let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value); //@ts-ignore let track_id = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.track_id); res.forEach((it, i) => { //@ts-ignore diff --git a/ide/src/trace/database/data-trafic/process/ProcessMemDataSender.ts b/ide/src/trace/database/data-trafic/process/ProcessMemDataSender.ts index 6faca5ffb..2f3d59741 100644 --- a/ide/src/trace/database/data-trafic/process/ProcessMemDataSender.ts +++ b/ide/src/trace/database/data-trafic/process/ProcessMemDataSender.ts @@ -49,10 +49,14 @@ export function processMemDataSender(trackId: number, row: TraceRow { +export const chartThreadDataSql = (args: Args): string => { return `select B.cpu, max(B.dur) AS dur, B.itid AS id, B.tid AS tid, B.state, B.pid, B.ts - ${args.recordStartNS} AS startTime, ifnull(B.arg_setid, -1) AS argSetId, ((B.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px diff --git a/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts b/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts index 763b10d72..ca92c4575 100644 --- a/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts +++ b/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts @@ -53,7 +53,7 @@ export const hiLogList: Map> = new Map(); //energy 泳道图 memory 模式缓存 export const energyList: Map> = new Map(); -export function clearMemoryCache(data: unknown, proc: Function) { +export function clearMemoryCache(data: unknown, proc: Function): void { sliceList.clear(); cpuList.clear(); clockList.clear(); diff --git a/ide/src/trace/database/data-trafic/utils/DataFilter.ts b/ide/src/trace/database/data-trafic/utils/DataFilter.ts index 633f29829..38cf01ce8 100644 --- a/ide/src/trace/database/data-trafic/utils/DataFilter.ts +++ b/ide/src/trace/database/data-trafic/utils/DataFilter.ts @@ -131,7 +131,7 @@ function filterDataByGroupWithoutValue( ): unknown[] { let arr: unknown[] = []; // 标志位,判定何时进行新一轮数据统计处理 - let flag: number = -1; + let flag: number = flagInit; for (let i = 0; i < list.length; i++) { // 筛选符合判断条件的数据,作进一步处理 //@ts-ignore diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts index 8a8de3817..f0847b9e9 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts @@ -137,7 +137,7 @@ export class ProcedureLogicWorkerFileSystem extends LogicHandler { }); } private fileSystemQueryFileSamples(data: unknown): void { - const fsHandler = this.handlerMap.get('io') as FileSystemCallTreeHandler; + const fsHandler = this.handlerMap.get('fileSystem') as FileSystemCallTreeHandler; //@ts-ignore this.handlerMap.get('fileSystem').samplesList = convertJSON(data.params.list) || []; let fsResults; @@ -1103,7 +1103,9 @@ and s.start_ts <= ${selectionParam.rightNs} + t.start_ts ${sqlFilter} and callch } clearSplitMapData(symbolName: string): void { - delete this.splitMapData[symbolName]; + if (symbolName in this.splitMapData){ + delete this.splitMapData[symbolName]; + } } } diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts index 273f76803..b9f926331 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts @@ -30,8 +30,8 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { private action: string = ''; public handle(msg: unknown): void { - if (!msg){ - return + if (!msg) { + return; } //@ts-ignore this.currentEventId = msg.id; @@ -40,7 +40,7 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { //@ts-ignore this.action = msg.action; //@ts-ignore - this.param = msg.params + this.params = msg.params; if (this.type) { switch (this.type) { case 'jsCpuProfiler-call-chain': @@ -322,21 +322,20 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { chartTreeArray: Array, reverseTreeArray: Array ): void { - const that = this; - function recursionTree(chartFrame: JsCpuProfilerChartFrame): void { + const recursionTree = (chartFrame: JsCpuProfilerChartFrame): void => { // isSelect为框选/点选范围内的函数,其他都不需要处理 if (!chartFrame.isSelect) { return; } //界面第一层只显示栈顶函数,只有栈顶函数的selfTime > 0 if (chartFrame.selfTime > 0) { - const copyFrame = that.cloneChartFrame(chartFrame); + const copyFrame = this.cloneChartFrame(chartFrame); // 每个栈顶函数的parent的时间为栈顶函数的时间 copyFrame.selfTime = chartFrame.selfTime; copyFrame.totalTime = chartFrame.totalTime; reverseTreeArray.push(copyFrame); // 递归处理parent的的totalTime selfTime - that.copyParent(copyFrame, chartFrame); + this.copyParent(copyFrame, chartFrame); } if (chartFrame.children.length > 0) { @@ -345,7 +344,7 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { recursionTree(children); } } - } + }; //递归树结构 for (const chartFrame of chartTreeArray) { diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts index c04456e4a..6e6476668 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts @@ -666,7 +666,7 @@ export class ProcedureLogicWorkerNativeMemory extends LogicHandler { if (types[0] === 0) { condition = 'and type = 0'; } else { - condition = 'and type !== 0'; + condition = 'and type != 0'; } } this.queryData( @@ -1142,7 +1142,9 @@ export class ProcedureLogicWorkerNativeMemory extends LogicHandler { currentNode.lib.endsWith('.so.1') || currentNode.lib.endsWith('.dll') || currentNode.lib.endsWith('.so') ? 0 : 1; } clearSplitMapData(symbolName: string): void { - delete this.splitMapData[symbolName]; + if (symbolName in this.splitMapData) { + delete this.splitMapData[symbolName]; + } } resolvingNMCallAction(params: unknown[]): NativeHookCallInfo[] { if (params.length > 0) { diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts index 6062c8469..efefb4b89 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -696,7 +696,9 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { } clearSplitMapData(symbolName: string): void { - delete this.splitMapData[symbolName]; + if (symbolName in this.splitMapData){ + delete this.splitMapData[symbolName]; + } } resetAllSymbol(symbols: string[]): void { diff --git a/ide/src/trace/database/sql/Smaps.sql.ts b/ide/src/trace/database/sql/Smaps.sql.ts index 52abb036c..3f699d071 100644 --- a/ide/src/trace/database/sql/Smaps.sql.ts +++ b/ide/src/trace/database/sql/Smaps.sql.ts @@ -15,7 +15,7 @@ import { query } from '../SqlLite'; import { Smaps } from '../../bean/SmapsStruct'; -export const querySmapsExits = (): Promise> => +export const querySmapsExits = (): Promise> => query( 'querySmapsExits', `select @@ -25,21 +25,21 @@ export const querySmapsExits = (): Promise> => and s.stat_type ='received' and s.count > 0` ); -export const querySmapsData = (columnName: string): Promise> => +export const querySmapsData = (columnName: string): Promise> => query( 'querySmapsCounterData', `SELECT (A.timestamp - B.start_ts) as startNs, sum(${columnName}) * 1024 as value, $columnName as name FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP by A.timestamp;`, { $columnName: columnName } ); -export const querySmapsDataMax = (columnName: string): Promise> => +export const querySmapsDataMax = (columnName: string): Promise> => query( 'querySmapsDataMax', ` SELECT (A.timestamp - B.start_ts) as startNS,sum(${columnName}) as max_value FROM smaps A,trace_range B GROUP by A.timestamp order by max_value desc LIMIT 1` ); -export const getTabSmapsMaxSize = (leftNs: number, rightNs: number, dur: number): Promise> => +export const getTabSmapsMaxSize = (leftNs: number, rightNs: number, dur: number): Promise> => query( 'getTabSmapsMaxRss', ` @@ -108,7 +108,7 @@ export const querySmapsRecordTabData = ( where type = ${typeId} and (timeStamp - start_ts) = ${startNs}` ); -export const getTabSmapsStatisticMaxSize = (rightNs: number): Promise> => +export const getTabSmapsStatisticMaxSize = (rightNs: number): Promise> => query( 'getTabSmapsStatisticMaxRss', ` diff --git a/ide/src/trace/database/sql/SqlLite.sql.ts b/ide/src/trace/database/sql/SqlLite.sql.ts index ccad2bc26..c41189ab9 100644 --- a/ide/src/trace/database/sql/SqlLite.sql.ts +++ b/ide/src/trace/database/sql/SqlLite.sql.ts @@ -1464,8 +1464,8 @@ Promise> => { $cpu: cpu, }); }; -export const queryPerfOutputData = (): Promise> => +export const queryPerfOutputData = (): Promise> => query('queryPerfOutputData', `SELECT name, ts FROM callstack where name like '%PERFORMANCE_DATA%'`); -export const queryPerfToolsDur = (): Promise> => +export const queryPerfToolsDur = (): Promise> => query('queryPerfToolsDur', `SELECT name, ts, dur FROM callstack where name = 'H:GRAB'`); diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts index 86b3c103c..834b3755b 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts @@ -1372,7 +1372,10 @@ function drawBrokenLineContext( let x2 = brokenLineEnd.x ?? 0; let x1; let y1; - let leftEndpointX, leftEndpointY, rightEndpointX, rightEndpointY; + let leftEndpointX; + let leftEndpointY; + let rightEndpointX; + let rightEndpointY; if (brokenLineStart.y < brokenLineEnd.y) { x1 = brokenLineStart.x ?? 0; y1 = brokenLineEnd.y ?? 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts index 2dfaa667e..2a1453ab5 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts @@ -142,7 +142,8 @@ export class CpuAbilityMonitorStruct extends BaseStruct { totalNS: number, frame: Rect ): void { - let cpuAbilityStartPointX: number, cpuAbilityEndPointX: number; + let cpuAbilityStartPointX: number; + let cpuAbilityEndPointX: number; if ((cpuAbilityNode.startNS || 0) < startNS) { cpuAbilityStartPointX = 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts index 6889911b5..df5c398f2 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts @@ -193,7 +193,8 @@ export class DiskAbilityMonitorStruct extends BaseStruct { totalNS: number, frame: Rect ): void { - let diskIOStartPointX: number, diskIOEndPointX: number; + let diskIOStartPointX: number; + let diskIOEndPointX: number; if ((diskIONode.startNS || 0) < startNS) { diskIOStartPointX = 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts index 51d32c2f1..4c02539b6 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts @@ -345,32 +345,43 @@ export class EnergyPowerStruct extends BaseStruct { } static setPowerFrame( - powerNode: any, + powerNode: unknown, padding: number, startNS: number, endNS: number, totalNS: number, - frame: any + frame: unknown ): void { let startPointX: number; let endPointX: number; + // @ts-ignore if ((powerNode.ts || 0) < startNS) { startPointX = 0; } else { + // @ts-ignore startPointX = ns2x((powerNode.ts || 0) - 500000000, startNS, endNS, totalNS, frame); } + // @ts-ignore if (powerNode.ts + 500000000 > endNS) { + // @ts-ignore endPointX = frame.width; } else { + // @ts-ignore endPointX = ns2x(powerNode.ts + 500000000, startNS, endNS, totalNS, frame); } let frameWidth = endPointX - startPointX <= 1 ? 1 : endPointX - startPointX; + // @ts-ignore if (!powerNode.frame) { + // @ts-ignore powerNode.frame = {}; } + // @ts-ignore powerNode.frame.x = Math.floor(startPointX); + // @ts-ignore powerNode.frame.y = frame.y + padding; + // @ts-ignore powerNode.frame.width = Math.ceil(frameWidth); + // @ts-ignore powerNode.frame.height = Math.floor(frame.height - padding * 2); } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHitchTime.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHitchTime.ts index ca0af2ff9..f88b38d1f 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHitchTime.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHitchTime.ts @@ -58,7 +58,9 @@ export class hitchTimeRender { find = true; } } - if (!hitchTimeRow.isHover) HitchTimeStruct.hoverHitchTimeStruct = undefined; + if (!hitchTimeRow.isHover) { + HitchTimeStruct.hoverHitchTimeStruct = undefined; + } if (!find && hitchTimeRow.isHover) { HitchTimeStruct.hoverHitchTimeStruct = undefined; } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerLTPO.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerLTPO.ts index b99caaf5a..dde694db5 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerLTPO.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerLTPO.ts @@ -56,7 +56,9 @@ export class LtpoRender { find = true; } } - if (!ltpoRow.isHover) LtpoStruct.hoverLtpoStruct = undefined; + if (!ltpoRow.isHover) { + LtpoStruct.hoverLtpoStruct = undefined; + } if (!find && ltpoRow.isHover) { LtpoStruct.hoverLtpoStruct = undefined; } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts index da4016e5b..620aef7c6 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts @@ -198,7 +198,8 @@ export class MemoryAbilityMonitorStruct extends BaseStruct { totalNS: number, frame: Rect ): void { - let memoryStartPointX: number, memoryEndPointX: number; + let memoryStartPointX: number; + let memoryEndPointX: number; if ((memoryNode.startNS || 0) < startNS) { memoryStartPointX = 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerPerfCallchains.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerPerfCallchains.ts index 6afa2e54b..d52da883f 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerPerfCallchains.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerPerfCallchains.ts @@ -77,7 +77,7 @@ export class PerfCallChainPool { this.works?.push(thread!); }; - submit(name: string, args: any, handler: Function, action: string | null): void { + submit(name: string, args: unknown, handler: Function, action: string | null): void { let noBusyThreads = this.works.filter((it) => !it.busy); let thread: PerfCallChainThread; if (noBusyThreads.length > 0) { diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts index 56af79bd9..144c18808 100644 --- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts +++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts @@ -31,7 +31,8 @@ import { TraceRow } from '../../../component/trace/base/TraceRow'; import { SpSystemTrace } from '../../../component/SpSystemTrace'; export class EmptyRender extends Render { - renderMainThread(req: unknown, row: TraceRow): void { + // @ts-ignore + renderMainThread(req: unknown, row: TraceRow): void { //@ts-ignore drawLoadingFrame(req.context, [], row); } diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts index 36a2a8826..9d6910706 100644 --- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts +++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts @@ -94,8 +94,8 @@ export class CpuStateRender extends PerfRender { let pns = (endNS - startNS) / frame.width; let y = frame.y + 5; let frameHeight = frame.height - 10; - let left = 0, - right = 0; + let left = 0; + let right = 0; for (let i = 0, j = list.length - 1, ib = true, jb = true; i < list.length, j >= 0; i++, j--) { if (list[j].startTs! <= endNS && jb) { right = j; diff --git a/trace_streamer/build/build_base_var.sh b/trace_streamer/build/build_base_var.sh index 271fdbd0d..f96bcf8b1 100644 --- a/trace_streamer/build/build_base_var.sh +++ b/trace_streamer/build/build_base_var.sh @@ -25,7 +25,7 @@ ninja="ninja" use_local_emsdk="false" PARAMS="" enable_plugin_array=("enable_hiperf" "enable_ebpf" "enable_native_hook" "enable_hilog" "enable_hisysevent" - "enable_arkts" "enable_bytrace" "enable_rawtrace" "enable_htrace" "enable_memory" + "enable_arkts" "enable_bytrace" "enable_rawtrace" "enable_htrace" "enable_ffrt" "enable_memory" "enable_hidump" "enable_cpudata" "enable_network" "enable_diskio" "enable_process") enable_extend_plugin_array=("enable_stream_extend") enable_all_plugins_str="" \ No newline at end of file diff --git a/trace_streamer/build/ts.gni b/trace_streamer/build/ts.gni index 0ffe94aea..b1998857f 100644 --- a/trace_streamer/build/ts.gni +++ b/trace_streamer/build/ts.gni @@ -22,6 +22,7 @@ declare_args() { enable_bytrace = true enable_rawtrace = true enable_htrace = true + enable_ffrt = true enable_memory = true enable_hidump = true enable_cpudata = true diff --git a/trace_streamer/gn/BUILD.gn b/trace_streamer/gn/BUILD.gn index 131b3b2b2..5a1486e8f 100644 --- a/trace_streamer/gn/BUILD.gn +++ b/trace_streamer/gn/BUILD.gn @@ -83,6 +83,10 @@ config("default") { if (enable_rawtrace) { defines += [ "ENABLE_RAWTRACE" ] } + if (enable_ffrt) { + defines += [ "ENABLE_FFRT" ] + enable_htrace = true + } if (enable_htrace) { defines += [ "ENABLE_HTRACE" ] } diff --git a/trace_streamer/sdk/demo_sdk/table/demo_table_base.cpp b/trace_streamer/sdk/demo_sdk/table/demo_table_base.cpp index a02e2a0e1..9f68faf7f 100644 --- a/trace_streamer/sdk/demo_sdk/table/demo_table_base.cpp +++ b/trace_streamer/sdk/demo_sdk/table/demo_table_base.cpp @@ -134,7 +134,7 @@ std::string DemoTableBase::DemoCreateTableSql() const { std::string demoStmt = "CREATE TABLE x("; for (const auto &col : demoTableColumn_) { - demoStmt += " " + col.name_ + " " + col.type_; + demoStmt += " " + col.columnName + " " + col.columnType; demoStmt += ","; } demoStmt += " PRIMARY KEY("; diff --git a/trace_streamer/src/base/string_help.cpp b/trace_streamer/src/base/string_help.cpp index 7c98fc8da..9eb5a2e03 100644 --- a/trace_streamer/src/base/string_help.cpp +++ b/trace_streamer/src/base/string_help.cpp @@ -103,5 +103,14 @@ std::string Strip(const std::string &str) } return str.substr(first, last - first + 1); } + +void RemoveNullTerminator(std::string &str) +{ + size_t pos = str.rfind('\0'); + while (pos != std::string::npos) { + str.erase(pos, 1); + pos = str.rfind('\0'); + } +} } // namespace base } // namespace SysTuning diff --git a/trace_streamer/src/base/string_help.h b/trace_streamer/src/base/string_help.h index a894cbbbf..4c6f78b72 100644 --- a/trace_streamer/src/base/string_help.h +++ b/trace_streamer/src/base/string_help.h @@ -29,6 +29,7 @@ bool EndWith(const std::string &str, const std::string &res); std::string FormatString(const char *p); std::string Strip(const std::string &str); std::string TrimInvisibleCharacters(const std::string &str); +void RemoveNullTerminator(std::string &str); } // namespace base } // namespace SysTuning #endif // SRC_TRACE_BASE_STRINGHELP_H diff --git a/trace_streamer/src/base/ts_common.h b/trace_streamer/src/base/ts_common.h index fc05a2d43..564854e6f 100644 --- a/trace_streamer/src/base/ts_common.h +++ b/trace_streamer/src/base/ts_common.h @@ -190,6 +190,8 @@ enum SchedWakeType { }; enum DataSourceType { DATA_SOURCE_TYPE_TRACE, + DATA_SOURCE_TYPE_FFRT, + DATA_SOURCE_TYPE_FFRT_CONFIG, DATA_SOURCE_TYPE_MEM, DATA_SOURCE_TYPE_HILOG, DATA_SOURCE_TYPE_NATIVEHOOK, diff --git a/trace_streamer/src/cfg/trace_streamer_config.cpp b/trace_streamer/src/cfg/trace_streamer_config.cpp index 4ae38a463..ef3ba27e1 100644 --- a/trace_streamer/src/cfg/trace_streamer_config.cpp +++ b/trace_streamer/src/cfg/trace_streamer_config.cpp @@ -179,6 +179,7 @@ inline void TraceStreamerConfig::InitRegulatorEventNameMap() } inline void TraceStreamerConfig::InitOtherEventNameMap() { + eventNameMap_.emplace(TRACE_EVENT_FFRT, TRACE_ACTION_FFRT); eventNameMap_.emplace(TRACE_EVENT_PRINT, TRACE_ACTION_PRINT); eventNameMap_.emplace(TRACE_EVENT_TRACING_MARK_WRITE, TRACE_ACTION_TRACING_MARK_WRITE); eventNameMap_.emplace(TRACE_EVENT_TASK_RENAME, TRACE_ACTION_TASK_RENAME); @@ -570,6 +571,7 @@ inline void TraceStreamerConfig::InitRegulatorEventSecurityMap() } inline void TraceStreamerConfig::InitOtherEventSecurityMap() { + eventParserStatSeverityDescMap_.emplace(TRACE_EVENT_FFRT, statSeverityDescMap_); eventParserStatSeverityDescMap_.emplace(TRACE_EVENT_PRINT, statSeverityDescMap_); eventParserStatSeverityDescMap_.emplace(TRACE_EVENT_TRACING_MARK_WRITE, statSeverityDescMap_); eventParserStatSeverityDescMap_.emplace(TRACE_EVENT_TASK_RENAME, statSeverityDescMap_); diff --git a/trace_streamer/src/cfg/trace_streamer_config.h b/trace_streamer/src/cfg/trace_streamer_config.h index 4865fe8cd..f1b065d68 100644 --- a/trace_streamer/src/cfg/trace_streamer_config.h +++ b/trace_streamer/src/cfg/trace_streamer_config.h @@ -84,6 +84,7 @@ enum SupportedTraceEventType { TRACE_EVENT_BLOCK_RQ_INSERT, TRACE_EVENT_BLOCK_RQ_REMAP, TRACE_EVENT_BLOCK_RQ_ISSUE, + TRACE_EVENT_FFRT, TRACE_MEMORY, TRACE_HILOG, TRACE_HIDUMP_FPS, @@ -305,6 +306,7 @@ private: const std::string TRACE_ACTION_BLOCK_RQ_INSERT = "trace_block_rq_insert"; const std::string TRACE_ACTION_BLOCK_RQ_REMAP = "trace_block_rq_remap"; const std::string TRACE_ACTION_BLOCK_RQ_ISSUE = "trace_block_rq_issue"; + const std::string TRACE_ACTION_FFRT = "trace_ffrt"; const std::string TRACE_ACTION_SYS_MEMORY = "sys_memory"; const std::string TRACE_ACTION_SYS_VIRTUAL_MEMORY = "sys_virtual_memory"; diff --git a/trace_streamer/src/filter/app_start_filter.cpp b/trace_streamer/src/filter/app_start_filter.cpp index 10bd4c1ec..095e3cfc8 100644 --- a/trace_streamer/src/filter/app_start_filter.cpp +++ b/trace_streamer/src/filter/app_start_filter.cpp @@ -100,27 +100,34 @@ void APPStartupFilter::UpdatePidByNameIndex(const appMap &mAPPStartupData) } } -void APPStartupFilter::AppendData(const appMap &mAPPStartupData) +void APPStartupFilter::AppendAssociatedData(DataIndex packedNameIndex, + const std::map> &stagesData) +{ + for (auto itorSecond = stagesData.begin(); itorSecond != stagesData.end(); ++itorSecond) { + auto item = itorSecond; + auto endTime = INVALID_UINT64; + if (item->first < VAILD_DATA_COUNT) { + int num = item->first + 1; + if ((++item) != stagesData.end() && num == item->first) { + endTime = (item)->second->startTime_; + } + } else { + endTime = itorSecond->second->endTime_; + } + traceDataCache_->GetAppStartupData()->AppendNewData(itorSecond->second->ipid_, itorSecond->second->tid_, + itorSecond->second->callid_, itorSecond->second->startTime_, + endTime, itorSecond->first, packedNameIndex); + } +} + +// AppenAllData +void APPStartupFilter::AppenAllData(const appMap &mAPPStartupData) { for (auto itor = mAPPStartupData.begin(); itor != mAPPStartupData.end(); ++itor) { if (!(itor->second).count(UI_ABILITY_LAUNCHING)) { continue; } - for (auto itorSecond = itor->second.begin(); itorSecond != itor->second.end(); ++itorSecond) { - auto item = itorSecond; - auto endTime = INVALID_UINT64; - if (item->first < VAILD_DATA_COUNT) { - int num = item->first + 1; - if ((++item) != itor->second.end() && num == item->first) { - endTime = (item)->second->startTime_; - } - } else { - endTime = itorSecond->second->endTime_; - } - traceDataCache_->GetAppStartupData()->AppendNewData( - itorSecond->second->ipid_, itorSecond->second->tid_, itorSecond->second->callid_, - itorSecond->second->startTime_, endTime, itorSecond->first, itor->first); - } + AppendAssociatedData(itor->first, itor->second); } } @@ -183,7 +190,7 @@ void APPStartupFilter::ParserAppStartup() for (auto &item : mAPPStartupDataWithPid_) { UpdatePidByNameIndex(item.second); CaclRsDataByPid(item.second); - AppendData(item.second); + AppenAllData(item.second); } return; } @@ -230,25 +237,25 @@ void APPStartupFilter::CalcDepthByTimeStamp(std::mapsecond.empty()) { - auto itor = it->second.begin(); - if (itor->first > startTime) { - depth = it->second.size(); - it->second.insert(std::make_pair(endTime, it->second.size())); - } else { - depth = itor->second; - for (auto itorSecond = itor; itorSecond != it->second.end(); ++itorSecond) { - if (itorSecond->first < startTime && depth > itorSecond->second) { - depth = itorSecond->second; - itor = itorSecond; - } - } - it->second.erase(itor); - it->second.insert(std::make_pair(endTime, depth)); - } - } else { + if (it->second.empty()) { it->second.insert(std::make_pair(endTime, 0)); + return; + } + auto itor = it->second.begin(); + if (itor->first > startTime) { + depth = it->second.size(); + it->second.insert(std::make_pair(endTime, it->second.size())); + return; + } + depth = itor->second; + for (auto itorSecond = itor; itorSecond != it->second.end(); ++itorSecond) { + if (itorSecond->first < startTime && depth > itorSecond->second) { + depth = itorSecond->second; + itor = itorSecond; + } } + it->second.erase(itor); + it->second.insert(std::make_pair(endTime, depth)); } void APPStartupFilter::ParserSoInitalization() diff --git a/trace_streamer/src/filter/app_start_filter.h b/trace_streamer/src/filter/app_start_filter.h index 977f5582d..ce97cad48 100644 --- a/trace_streamer/src/filter/app_start_filter.h +++ b/trace_streamer/src/filter/app_start_filter.h @@ -68,7 +68,9 @@ private: void ParserAppStartup(); void UpdatePidByNameIndex(const appMap &mAPPStartupData); bool CaclRsDataByPid(appMap &mAPPStartupData); - void AppendData(const appMap &mAPPStartupData); + void AppenAllData(const appMap &mAPPStartupData); + void AppendAssociatedData(DataIndex packedNameIndex, + const std::map> &stagesData); bool UpdateAPPStartupData(uint32_t row, const std::string &nameString, uint32_t startIndex); bool ProcAbilityLaunchData(const std::string &nameString, uint64_t raw); void ProcForegroundData(uint64_t raw); diff --git a/trace_streamer/src/filter/cpu_filter.cpp b/trace_streamer/src/filter/cpu_filter.cpp index f3c26736d..35e218a61 100644 --- a/trace_streamer/src/filter/cpu_filter.cpp +++ b/trace_streamer/src/filter/cpu_filter.cpp @@ -135,41 +135,38 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, } } -bool CpuFilter::InsertBlockedReasonEvent(uint64_t ts, - uint64_t cpu, - uint32_t iTid, - bool iowait, - DataIndex caller, - uint32_t delay) +bool CpuFilter::InsertBlockedReasonEvent(uint64_t cpu, uint32_t iTid, bool iowait, DataIndex caller, uint32_t delay) { - if (pidToThreadSliceRow_.count(iTid)) { - // ArgSet - ArgsSet args; - args.AppendArg(ioWait_, BASE_DATA_TYPE_INT, iowait); - args.AppendArg(caller_, BASE_DATA_TYPE_STRING, caller); - if (delay != INVALID_UINT32) { - args.AppendArg(delay_, BASE_DATA_TYPE_INT, delay); + if (pidToThreadSliceRow_.count(iTid) == 0) { + return false; + } + + // ArgSet + ArgsSet args; + args.AppendArg(ioWait_, BASE_DATA_TYPE_INT, iowait); + args.AppendArg(caller_, BASE_DATA_TYPE_STRING, caller); + if (delay != INVALID_UINT32) { + args.AppendArg(delay_, BASE_DATA_TYPE_INT, delay); + } + auto argSetId = streamFilters_->argsFilter_->NewArgs(args); + auto row = pidToThreadSliceRow_.at(iTid); + traceDataCache_->GetThreadStateData()->SetArgSetId(row, argSetId); + if (iowait) { + auto state = traceDataCache_->GetThreadStateData()->StatesData()[row]; + if (state == TASK_UNINTERRUPTIBLE) { + traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_UNINTERRUPTIBLE_IO); + } else if (state == TASK_DK) { // state == TASK_DK + traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_DK_IO); } - auto argSetId = streamFilters_->argsFilter_->NewArgs(args); - auto row = pidToThreadSliceRow_.at(iTid); - traceDataCache_->GetThreadStateData()->SetArgSetId(row, argSetId); - if (iowait) { - auto state = traceDataCache_->GetThreadStateData()->StatesData()[row]; - if (state == TASK_UNINTERRUPTIBLE) { - traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_UNINTERRUPTIBLE_IO); - } else if (state == TASK_DK) { // state == TASK_DK - traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_DK_IO); - } - } else { - auto state = traceDataCache_->GetThreadStateData()->StatesData()[row]; - if (state == TASK_UNINTERRUPTIBLE) { - traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_UNINTERRUPTIBLE_NIO); - } else if (state == TASK_DK) { // state == TASK_DK - traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_DK_NIO); - } + } else { + auto state = traceDataCache_->GetThreadStateData()->StatesData()[row]; + if (state == TASK_UNINTERRUPTIBLE) { + traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_UNINTERRUPTIBLE_NIO); + } else if (state == TASK_DK) { // state == TASK_DK + traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_DK_NIO); } - pidToThreadSliceRow_.erase(iTid); } + pidToThreadSliceRow_.erase(iTid); return true; } bool CpuFilter::InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint32_t pid) diff --git a/trace_streamer/src/filter/cpu_filter.h b/trace_streamer/src/filter/cpu_filter.h index 2e6d47e86..2e9c25bd7 100644 --- a/trace_streamer/src/filter/cpu_filter.h +++ b/trace_streamer/src/filter/cpu_filter.h @@ -46,12 +46,7 @@ public: uint32_t nextPid, int32_t nextPrio, DataIndex nextInfo); - bool InsertBlockedReasonEvent(uint64_t ts, - uint64_t cpu, - uint32_t iTid, - bool iowait, - DataIndex caller, - uint32_t delay); + bool InsertBlockedReasonEvent(uint64_t cpu, uint32_t iTid, bool iowait, DataIndex caller, uint32_t delay); void InsertWakeupEvent(uint64_t ts, uint32_t internalTid, bool isWaking = false); bool InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint32_t pid); bool InsertProcessFreeEvent(uint64_t ts, uint32_t pid); diff --git a/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp b/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp index d5365c43d..be6f9b4be 100644 --- a/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp +++ b/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp @@ -153,9 +153,6 @@ std::unique_ptr NativeHookFilter::ParseFrame(uint64_t row, if (reader.has_ip()) { frameInfo->ip_ = reader.ip(); } - if (reader.has_sp()) { - frameInfo->sp_ = reader.sp(); - } if (reader.has_offset()) { frameInfo->offset_ = reader.offset(); } @@ -706,6 +703,19 @@ void NativeHookFilter::ReparseStacksWithDifferentMeans() reparseStackIdToFramesMap_.clear(); } +void NativeHookFilter::UpdateReparseStack(uint64_t stackId, std::shared_ptr> frames) +{ + // delete the stack ids whitch should be parsed again + if (stackIdToCallChainIdMap_.count(stackId)) { + stackIdToCallChainIdMap_.erase(stackId); + } + /* update reparseStackIdToFramesMap_. The reparseStackIdToFramesMap_ cannot be parsed immediately. + Wait until the relevant memmaps and symbolTable updates are completed. After the main event is + updated and before the main event is about to be parsed, parse reparseStackIdToFramesMap_ first. */ + if (!stackIdToFramesMap_.count(stackId)) { + reparseStackIdToFramesMap_.emplace(std::make_pair(stackId, frames)); + } +} inline void NativeHookFilter::ReparseStacksWithAddrRange(uint64_t start, uint64_t end) { // Get the list of call stack ids that should be parsed again @@ -713,16 +723,7 @@ inline void NativeHookFilter::ReparseStacksWithAddrRange(uint64_t start, uint64_ auto ips = itor->second; for (auto ipsItor = ips->begin(); ipsItor != ips->end(); ipsItor++) { if (*ipsItor >= start && *ipsItor < end) { - // delete the stack ids whitch should be parsed again - if (stackIdToCallChainIdMap_.count(itor->first)) { - stackIdToCallChainIdMap_.erase(itor->first); - } - /* update reparseStackIdToFramesMap_. The reparseStackIdToFramesMap_ cannot be parsed immediately. - Wait until the relevant memmaps and symbolTable updates are completed. After the main event is - updated and before the main event is about to be parsed, parse reparseStackIdToFramesMap_ first. */ - if (!stackIdToFramesMap_.count(itor->first)) { - reparseStackIdToFramesMap_.emplace(std::make_pair(itor->first, itor->second)); - } + UpdateReparseStack(itor->first, itor->second); break; } } @@ -800,6 +801,37 @@ void NativeHookFilter::UpdateSymbolTablePtrAndStValueToSymAddrMap( } } } +std::tuple NativeHookFilter::GetIpRangeByIpidAndFilePathId(uint32_t ipid, uint32_t filePathId) +{ + uint64_t start = INVALID_UINT32; + uint64_t end = 0; + auto startAddrToMapsInfoMapPtr = ipidToStartAddrToMapsInfoMap_.Find(ipid); + if (startAddrToMapsInfoMapPtr != nullptr) { + for (auto itor = startAddrToMapsInfoMapPtr->begin(); itor != startAddrToMapsInfoMapPtr->end(); itor++) { + if (itor->second->file_path_id() == filePathId) { + start = std::min(itor->first, start); + end = std::max(itor->second->end(), end); + } else if (start != INVALID_UINT32) { + break; + } + } + } + return std::make_tuple(start, end); +} +void NativeHookFilter::DeleteFrameInfoWhichNeedsReparse(uint32_t ipid, uint32_t filePathId) +{ + // Delete symbolic results with the same filePathId + auto ipToFrameInfoPtr = const_cast(ipidToIpToFrameInfo_.Find(ipid)); + if (ipToFrameInfoPtr != nullptr) { + for (auto itor = ipToFrameInfoPtr->begin(); itor != ipToFrameInfoPtr->end();) { + if (itor->second->filePathId_ == filePathId) { + itor = ipToFrameInfoPtr->erase(itor); + continue; + } + itor++; + } + } +} void NativeHookFilter::ProcSymbolTable(uint32_t ipid, uint32_t filePathId, std::shared_ptr reader) @@ -815,30 +847,10 @@ void NativeHookFilter::ProcSymbolTable(uint32_t ipid, ReparseStacksWithDifferentMeans(); FilterNativeHookMainEvent(tsToMainEventsMap_.size()); } - // Delete symbolic results with the same filePathId - auto ipToFrameInfoPtr = const_cast(ipidToIpToFrameInfo_.Find(ipid)); - if (ipToFrameInfoPtr != nullptr) { - for (auto itor = ipToFrameInfoPtr->begin(); itor != ipToFrameInfoPtr->end();) { - if (itor->second->filePathId_ == filePathId) { - itor = ipToFrameInfoPtr->erase(itor); - continue; - } - itor++; - } - } + DeleteFrameInfoWhichNeedsReparse(ipid, filePathId); uint64_t start = INVALID_UINT32; uint64_t end = 0; - auto startAddrToMapsInfoMapPtr = ipidToStartAddrToMapsInfoMap_.Find(ipid); - if (startAddrToMapsInfoMapPtr != nullptr) { - for (auto itor = startAddrToMapsInfoMapPtr->begin(); itor != startAddrToMapsInfoMapPtr->end(); itor++) { - if (itor->second->file_path_id() == filePathId) { - start = std::min(itor->first, start); - end = std::max(itor->second->end(), end); - } else if (start != INVALID_UINT32) { - break; - } - } - } + std::tie(start, end) = GetIpRangeByIpidAndFilePathId(ipid, filePathId); ReparseStacksWithAddrRange(start, end); symbolTablePtr = reader; } else { diff --git a/trace_streamer/src/filter/hook_filter/native_hook_filter.h b/trace_streamer/src/filter/hook_filter/native_hook_filter.h index 968b8fd18..5524682bf 100644 --- a/trace_streamer/src/filter/hook_filter/native_hook_filter.h +++ b/trace_streamer/src/filter/hook_filter/native_hook_filter.h @@ -30,7 +30,6 @@ class NativeHookFrameInfo { public: NativeHookFrameInfo() : ip_(INVALID_UINT64), - sp_(INVALID_UINT64), symbolIndex_(INVALID_UINT64), filePathIndex_(INVALID_UINT64), offset_(INVALID_UINT64), @@ -38,13 +37,11 @@ public: { } NativeHookFrameInfo(uint64_t ip, - uint64_t sp, uint64_t symbolIndex, uint64_t filePathIndex, uint64_t offset, uint64_t symbolOffset) : ip_(ip), - sp_(sp), symbolIndex_(symbolIndex), filePathIndex_(filePathIndex), offset_(offset), @@ -53,7 +50,6 @@ public: } ~NativeHookFrameInfo() {} uint64_t ip_; - uint64_t sp_; uint64_t symbolIndex_; uint64_t filePathIndex_; uint64_t offset_; @@ -98,6 +94,8 @@ public: private: void ProcSymbolTable(uint32_t ipid, uint32_t filePathId, std::shared_ptr reader); + std::tuple GetIpRangeByIpidAndFilePathId(uint32_t ipid, uint32_t filePathId); + void DeleteFrameInfoWhichNeedsReparse(uint32_t ipid, uint32_t filePathId); void FilterNativeHookMainEvent(size_t num); void ParseStatisticEvent(uint64_t timeStamp, const ProtoReader::BytesView &bytesView); template @@ -137,6 +135,7 @@ private: std::shared_ptr ParseArktsOfflineSymbolization(uint64_t ipid, uint64_t arktsIp); void FillOfflineSymbolizationFrames(std::map>>::iterator mapItor); void ReparseStacksWithAddrRange(uint64_t start, uint64_t end); + void UpdateReparseStack(uint64_t stackId, std::shared_ptr> frames); void ReparseStacksWithDifferentMeans(); void CompressStackAndFrames(uint64_t row, ProtoReader::RepeatedDataAreaIterator frames); std::tuple GetNeedUpdateProcessMapsAddrRange(uint32_t ipid, diff --git a/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp b/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp index 3079b9f10..3709e4edd 100644 --- a/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp +++ b/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp @@ -36,16 +36,6 @@ size_t PerfDataFilter::AppendPerfFiles(uint64_t fileId, uint32_t serial, DataInd return size; } -void PerfDataFilter::AppendPerfCallChain(uint32_t callChainId, - uint32_t depth, - uint64_t ip, - uint64_t vaddrInFile, - uint64_t fileId, - uint64_t symbolId) -{ - traceDataCache_->GetPerfCallChainData()->AppendNewPerfCallChain(callChainId, depth, ip, vaddrInFile, fileId, - symbolId); -} void PerfDataFilter::BeforeReload() { traceDataCache_->GetPerfCallChainData()->Clear(); diff --git a/trace_streamer/src/filter/perf_filter/perf_data_filter.h b/trace_streamer/src/filter/perf_filter/perf_data_filter.h index 50ecf8af8..5698da906 100644 --- a/trace_streamer/src/filter/perf_filter/perf_data_filter.h +++ b/trace_streamer/src/filter/perf_filter/perf_data_filter.h @@ -34,12 +34,6 @@ public: public: size_t AppendPerfFiles(uint64_t fileId, uint32_t serial, DataIndex symbols, DataIndex filePath); - void AppendPerfCallChain(uint32_t callChainId, - uint32_t depth, - uint64_t ip, - uint64_t vaddrInFile, - uint64_t fileId, - uint64_t symbolId); void Finish(); void BeforeReload(); diff --git a/trace_streamer/src/filter/slice_filter.cpp b/trace_streamer/src/filter/slice_filter.cpp index 05c6d2a35..dc34b5527 100644 --- a/trace_streamer/src/filter/slice_filter.cpp +++ b/trace_streamer/src/filter/slice_filter.cpp @@ -52,7 +52,7 @@ size_t SliceFilter::BeginSlice(const std::string &comm, // make a SliceData DataItem, {timeStamp, dur, internalTid, cat, nameIndex} SliceData sliceData = {timeStamp, -1, internalTid, cat, nameIndex}; ArgsSet args; - return StartSlice(timeStamp, pid, cat, nameIndex, args, sliceData); + return StartSlice(timeStamp, cat, nameIndex, args, sliceData); } void SliceFilter::IrqHandlerEntry(uint64_t timeStamp, uint32_t cpu, DataIndex catalog, DataIndex nameIndex) @@ -177,7 +177,7 @@ size_t SliceFilter::AsyncBinder(uint64_t timeStamp, uint32_t pid, DataIndex cat, { InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timeStamp, pid); SliceData sliceData = {timeStamp, 0, internalTid, cat, nameIndex}; - return StartSlice(timeStamp, pid, cat, nameIndex, args, std::move(sliceData)); + return StartSlice(timeStamp, cat, nameIndex, args, std::move(sliceData)); } uint8_t SliceFilter::CurrentDepth(InternalTid internalTid) { @@ -287,7 +287,6 @@ int32_t SliceFilter::MatchingIncompleteSliceIndex(const SlicesStack &stack, Data return -1; } size_t SliceFilter::StartSlice(uint64_t timeStamp, - uint32_t pid, DataIndex cat, DataIndex nameIndex, ArgsSet &args, @@ -336,22 +335,16 @@ size_t SliceFilter::BeginBinder(uint64_t timeStamp, uint32_t pid, DataIndex cat, { InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timeStamp, pid); SliceData sliceData = {timeStamp, -1, internalTid, cat, nameIndex}; - return StartSlice(timeStamp, pid, cat, nameIndex, args, std::move(sliceData)); + return StartSlice(timeStamp, cat, nameIndex, args, std::move(sliceData)); } size_t SliceFilter::CompleteSlice(uint64_t timeStamp, - uint32_t pid, - uint32_t threadGroupId, + uint32_t internalTid, DataIndex category, DataIndex name, ArgsSet args) { - InternalTid internalTid = INVALID_ITID; - if (threadGroupId > 0) { - internalTid = streamFilters_->processFilter_->GetOrCreateThreadWithPid(pid, threadGroupId); - } else { - internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timeStamp, pid); - } + TS_CHECK_TRUE_RET(binderStackMap_.find(internalTid) != binderStackMap_.end(), SIZE_MAX); auto &stackInfo = binderStackMap_[internalTid]; SlicesStack &stack = stackInfo.sliceStack; @@ -402,7 +395,8 @@ void SliceFilter::HandleAsyncEventAndOther(ArgsSet args, CallStack *slices, uint } size_t SliceFilter::EndBinder(uint64_t timeStamp, uint32_t pid, DataIndex category, DataIndex name, ArgsSet args) { - return CompleteSlice(timeStamp, pid, 0, category, name, args); + auto internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timeStamp, pid); + return CompleteSlice(timeStamp, internalTid, category, name, args); } std::tuple SliceFilter::AddArgs(uint32_t tid, DataIndex key1, DataIndex key2, ArgsSet &args) { @@ -487,7 +481,13 @@ size_t SliceFilter::EndSlice(uint64_t timeStamp, DataIndex category, DataIndex name) { - return CompleteSlice(timeStamp, pid, threadGroupId, category, name); + uint32_t internalTid = INVALID_UINT32; + if (threadGroupId > 0) { + internalTid = streamFilters_->processFilter_->GetOrCreateThreadWithPid(pid, threadGroupId); + } else { + internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timeStamp, pid); + } + return CompleteSlice(timeStamp, internalTid, category, name); } bool SliceFilter::UpdateIrqReadySize() diff --git a/trace_streamer/src/filter/slice_filter.h b/trace_streamer/src/filter/slice_filter.h index 5af147dd5..7e0a0fefd 100644 --- a/trace_streamer/src/filter/slice_filter.h +++ b/trace_streamer/src/filter/slice_filter.h @@ -54,7 +54,6 @@ public: DataIndex nameIndex); size_t BeginBinder(uint64_t timeStamp, uint32_t pid, DataIndex cat, DataIndex nameIndex, ArgsSet args = ArgsSet()); size_t StartSlice(uint64_t timeStamp, - uint32_t pid, DataIndex cat, DataIndex nameIndex, ArgsSet &args, @@ -66,8 +65,7 @@ public: DataIndex name = INVALID_UINT64, ArgsSet args = {}); size_t CompleteSlice(uint64_t timeStamp, - uint32_t pid, - uint32_t threadGroupId, + uint32_t InternalTid, DataIndex category = INVALID_UINT64, DataIndex name = INVALID_UINT64, ArgsSet args = {}); diff --git a/trace_streamer/src/main.cpp b/trace_streamer/src/main.cpp index 5d6929882..ed04c2cff 100644 --- a/trace_streamer/src/main.cpp +++ b/trace_streamer/src/main.cpp @@ -124,6 +124,11 @@ void SetFtracePluginsAbilityInfo(std::string &disableInfo, std::string &enableIn #else enableInfo.append("\n\thtrace"); #endif +#ifndef ENABLE_FFRT + disableInfo.append("\n\tffrt"); +#else + enableInfo.append("\n\tffrt"); +#endif } void PrintDefaultAbilityInfo(std::string &disableInfo, std::string &enableInfo) { @@ -160,7 +165,7 @@ void PrintDefaultAbilityInfo(std::string &disableInfo, std::string &enableInfo) #endif printf( "the default support ability list:\n\thiperf,ebpf,native_hook,hilog,hisysevent,arkts\n\t" - "bytrace,rawtrace,htrace,memory,hidump,cpudata,network,diskio,process\n"); + "bytrace,rawtrace,htrace,ffrt,memory,hidump,cpudata,network,diskio,process\n"); } void PrintExtendAbilityInfo(std::string &disableInfo, std::string &enableInfo) { diff --git a/trace_streamer/src/parser/ebpf_parser/ebpf_base.cpp b/trace_streamer/src/parser/ebpf_parser/ebpf_base.cpp index 3935ddf96..bfc8e6743 100644 --- a/trace_streamer/src/parser/ebpf_parser/ebpf_base.cpp +++ b/trace_streamer/src/parser/ebpf_parser/ebpf_base.cpp @@ -46,22 +46,23 @@ void EbpfBase::ParseCallStackData(const uint64_t *userIpsAddr, uint16_t count, u { uint64_t depth = 0; for (auto i = count - 1; i >= 0; i--) { - if (userIpsAddr[i] > MIN_USER_IP) { - auto ebpfSymbolInfo = GetEbpfSymbolInfo(pid, userIpsAddr[i]); - auto ipIndex = ConvertToHexTextIndex(userIpsAddr[i]); - ipStrIndexToIpMap_.insert(std::make_pair(ipIndex, userIpsAddr[i])); - auto row = - traceDataCache_->GetEbpfCallStack()->AppendNewData(callId, depth++, ipIndex, ebpfSymbolInfo.symbolIndex, - ebpfSymbolInfo.filePathIndex, ebpfSymbolInfo.vaddr); - if (ebpfSymbolInfo.filePathIndex != INVALID_UINT64) { - if (filePathIndexToCallStackRowMap_.count(ebpfSymbolInfo.filePathIndex) == 0) { - auto rows = std::make_shared>(); - rows->insert(row); - filePathIndexToCallStackRowMap_[ebpfSymbolInfo.filePathIndex] = rows; - } else { - filePathIndexToCallStackRowMap_[ebpfSymbolInfo.filePathIndex]->insert(row); - } - } + if (userIpsAddr[i] <= MIN_USER_IP) { + continue; + } + auto ebpfSymbolInfo = GetEbpfSymbolInfo(pid, userIpsAddr[i]); + auto ipIndex = ConvertToHexTextIndex(userIpsAddr[i]); + ipStrIndexToIpMap_.insert(std::make_pair(ipIndex, userIpsAddr[i])); + auto row = traceDataCache_->GetEbpfCallStack()->AppendNewData( + callId, depth++, ipIndex, ebpfSymbolInfo.symbolIndex, ebpfSymbolInfo.filePathIndex, ebpfSymbolInfo.vaddr); + if (ebpfSymbolInfo.filePathIndex == INVALID_UINT64) { + continue; + } + if (filePathIndexToCallStackRowMap_.count(ebpfSymbolInfo.filePathIndex) == 0) { + auto rows = std::make_shared>(); + rows->insert(row); + filePathIndexToCallStackRowMap_[ebpfSymbolInfo.filePathIndex] = rows; + } else { + filePathIndexToCallStackRowMap_[ebpfSymbolInfo.filePathIndex]->insert(row); } } // Only one successful insertion is required, without considering repeated insertion failures diff --git a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp index 7655fd294..439bb7dab 100644 --- a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp +++ b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp @@ -629,8 +629,8 @@ uint32_t PerfDataParser::UpdateCallChainUnCompressed(const std::unique_ptrperfDataFilter_->AppendPerfCallChain(callChainId, depth++, frame->pc, frame->funcOffset, fileId, - frame->index); + traceDataCache_->GetPerfCallChainData()->AppendNewPerfCallChain(callChainId, depth++, frame->pc, + frame->funcOffset, fileId, frame->index); } return callChainId; } diff --git a/trace_streamer/src/parser/pbreader_parser/BUILD.gn b/trace_streamer/src/parser/pbreader_parser/BUILD.gn index 5bac80a03..1752d2d93 100644 --- a/trace_streamer/src/parser/pbreader_parser/BUILD.gn +++ b/trace_streamer/src/parser/pbreader_parser/BUILD.gn @@ -78,7 +78,8 @@ ohos_source_set("pbreader_parser_src") { cflags = [ "-includeMingW64Fix.h" ] } public_configs = [ "../ebpf_parser:ebpf_parser_cfg" ] - public_deps = [ "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ftrace_data/${device_kernel_version}:ftrace_data_reader" ] + public_deps = + [ "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/services:ts_all_type_cpp" ] if (enable_hiperf) { public_deps += [ "../hiperf_parser:hiperf_parser" ] } @@ -97,6 +98,9 @@ ohos_source_set("pbreader_parser_src") { if (enable_htrace) { public_deps += [ "htrace_parser:pbreader_htrace_parser" ] } + if (enable_ffrt) { + public_deps += [ "ffrt_parser:pbreader_ffrt_parser" ] + } if (enable_memory) { public_deps += [ "mem_parser:pbreader_mem_parser" ] } diff --git a/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_cpu_profiler_parser.cpp b/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_cpu_profiler_parser.cpp index c80417b84..afa1134ec 100644 --- a/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_cpu_profiler_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_cpu_profiler_parser.cpp @@ -66,25 +66,25 @@ HtraceJsCpuProfilerParser::HtraceJsCpuProfilerParser(TraceDataCache *dataCache, void HtraceJsCpuProfilerParser::ParseNodeData(const json &jMessage) { int nodeCount = jMessage.at("nodes").size(); + JsCpuProfilerNodeRow row; for (int i = 0; i < nodeCount; i++) { jsonns::Node node = jMessage.at("nodes")[i]; - auto id = node.id; + row.functionId = node.id; auto functionName = node.callFrame.functionName; - DataIndex functionNameKey = traceDataCache_->GetDataIndex(functionName); - auto scriptId = node.callFrame.scriptId; + row.functionName = traceDataCache_->GetDataIndex(functionName); + row.scriptId = node.callFrame.scriptId; auto url = node.callFrame.url; - DataIndex urlKey = traceDataCache_->GetDataIndex(url); - auto lineNumber = node.callFrame.lineNumber; - auto columnNumber = node.callFrame.columnNumber; - auto hitCount = node.hitCount; + row.url = traceDataCache_->GetDataIndex(url); + row.lineNumber = node.callFrame.lineNumber; + row.columnNumber = node.callFrame.columnNumber; + row.hitCount = node.hitCount; auto children = node.children; - children = children.substr(0, children.size() - 1); - uint32_t parentId = 0; - if (jsonns::nodes_.find(id) != jsonns::nodes_.end()) { - parentId = jsonns::nodes_.find(id)->second; + row.children = children.substr(0, children.size() - 1); + row.parent = 0; + if (jsonns::nodes_.find(node.id) != jsonns::nodes_.end()) { + row.parent = jsonns::nodes_.find(node.id)->second; } - (void)traceDataCache_->GetJsCpuProfilerNodeData()->AppendNewData( - id, functionNameKey, scriptId, urlKey, lineNumber, columnNumber, hitCount, children, parentId); + (void)traceDataCache_->GetJsCpuProfilerNodeData()->AppendNewData(row); } } diff --git a/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_memory_parser.cpp b/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_memory_parser.cpp index af46fcb62..8bf34eb2b 100644 --- a/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_memory_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/arkts/pbreader_js_memory_parser.cpp @@ -305,16 +305,17 @@ PbreaderJSMemoryParser::~PbreaderJSMemoryParser() void PbreaderJSMemoryParser::ParseJSMemoryConfig(ProtoReader::BytesView tracePacket) { ProtoReader::ArkTSConfig_Reader jsHeapConfig(tracePacket.data_, tracePacket.size_); - auto pid = jsHeapConfig.pid(); + JsConfigRow row; + row.pid = jsHeapConfig.pid(); type_ = jsHeapConfig.type(); - auto interval = jsHeapConfig.interval(); - auto captureNumericValue = jsHeapConfig.capture_numeric_value() ? 1 : 0; - auto trackAllocation = jsHeapConfig.track_allocations() ? 1 : 0; - auto cpuProfiler = jsHeapConfig.enable_cpu_profiler() ? 1 : 0; - hasCpuProfiler_ = cpuProfiler ? true : false; - auto cpuProfilerInterval = jsHeapConfig.cpu_profiler_interval(); - (void)traceDataCache_->GetJsConfigData()->AppendNewData(pid, type_, interval, captureNumericValue, trackAllocation, - cpuProfiler, cpuProfilerInterval); + row.type = jsHeapConfig.type(); + row.interval = jsHeapConfig.interval(); + row.captureNumericValue = jsHeapConfig.capture_numeric_value() ? 1 : 0; + row.trackAllocation = jsHeapConfig.track_allocations() ? 1 : 0; + row.cpuProfiler = jsHeapConfig.enable_cpu_profiler() ? 1 : 0; + hasCpuProfiler_ = row.cpuProfiler ? true : false; + row.cpuProfilerInterval = jsHeapConfig.cpu_profiler_interval(); + (void)traceDataCache_->GetJsConfigData()->AppendNewData(row); } struct timespec PbreaderJSMemoryParser::TimeToTimespec(uint64_t timeMs) { @@ -629,26 +630,28 @@ void PbreaderJSMemoryParser::ParseNodes(int32_t fileId, const json &jMessage, ui json filteredNodes = nlohmann::json::array(); jsonns::Nodes node = jMessage.at("nodes"); for (size_t i = 0; i < node.names.size(); ++i) { - auto type = node.types[i]; - auto name = node.names[i]; - auto id = node.ids[i]; - auto selfSize = node.selfSizes[i]; - auto edgeCount = node.edgeCounts[i]; - auto traceNodeId = node.traceNodeIds[i]; - auto detachedness = node.detachedness[i]; if (!isSplitFile) { - (void)traceDataCache_->GetJsHeapNodesData()->AppendNewData(fileId, i, type, name, id, selfSize, edgeCount, - traceNodeId, detachedness); + JsHeapNodesRow row; + row.fileId = fileId; + row.nodeIndex = i; + row.type = node.types[i]; + row.name = node.names[i]; + row.id = node.ids[i]; + row.selfSize = node.selfSizes[i]; + row.edgeCount = node.edgeCounts[i]; + row.traceNodeId = node.traceNodeIds[i]; + row.detachedNess = node.detachedness[i]; + (void)traceDataCache_->GetJsHeapNodesData()->AppendNewData(row); } - selfSizeCount_ += selfSize; - if (isSplitFile && nodeFileId_ != INVALID_UINT32 && id <= nodeFileId_) { - filteredNodes.push_back(type); - filteredNodes.push_back(name); - filteredNodes.push_back(id); - filteredNodes.push_back(selfSize); - filteredNodes.push_back(edgeCount); - filteredNodes.push_back(traceNodeId); - filteredNodes.push_back(detachedness); + selfSizeCount_ += node.selfSizes[i]; + if (isSplitFile && nodeFileId_ != INVALID_UINT32 && node.ids[i] <= nodeFileId_) { + filteredNodes.push_back(node.types[i]); + filteredNodes.push_back(node.names[i]); + filteredNodes.push_back(node.ids[i]); + filteredNodes.push_back(node.selfSizes[i]); + filteredNodes.push_back(node.edgeCounts[i]); + filteredNodes.push_back(node.traceNodeIds[i]); + filteredNodes.push_back(node.detachedness[i]); nodeCount_++; } } @@ -663,14 +666,16 @@ void PbreaderJSMemoryParser::ParseEdges(int32_t fileId, const json &jMessage) return; } jsonns::Edges edge = jMessage.at("edges"); + JsHeapEdgesRow row; + row.fileId = fileId; for (size_t i = 0; i < edge.types.size(); ++i) { - auto type = edge.types[i]; - auto nameOrIndex = edge.nameOrIndexes[i]; - auto toNode = edge.toNodes[i]; - auto fromNodeId = edge.fromNodeIds[i]; - auto toNodeid = edge.toNodeIds[i]; - (void)traceDataCache_->GetJsHeapEdgesData()->AppendNewData(fileId, i, type, nameOrIndex, toNode, fromNodeId, - toNodeid); + row.edgeIndex = i; + row.type = edge.types[i]; + row.nameOrIndex = edge.nameOrIndexes[i]; + row.toNode = edge.toNodes[i]; + row.fromNodeId = edge.fromNodeIds[i]; + row.toNodeId = edge.toNodeIds[i]; + (void)traceDataCache_->GetJsHeapEdgesData()->AppendNewData(row); } return; } @@ -737,15 +742,17 @@ void PbreaderJSMemoryParser::ParseTraceFuncInfo(int32_t fileId, const json &jMes return; } jsonns::TraceFuncInfo traceFuncInfo = jMessage.at("trace_function_infos"); + JsHeapTraceFuncRow row; + row.fileId = fileId; for (size_t i = 0; i < traceFuncInfo.functionIds.size(); ++i) { - auto functionId = traceFuncInfo.functionIds[i]; - auto name = traceFuncInfo.names[i]; - auto scriptName = traceFuncInfo.scriptNames[i]; - auto scriptId = traceFuncInfo.scriptIds[i]; - auto line = traceFuncInfo.lines[i]; - auto column = traceFuncInfo.columns[i]; - (void)traceDataCache_->GetJsHeapTraceFuncInfoData()->AppendNewData(fileId, i, functionId, name, scriptName, - scriptId, line, column); + row.functionIndex = i; + row.functionId = traceFuncInfo.functionIds[i]; + row.name = traceFuncInfo.names[i]; + row.scriptName = traceFuncInfo.scriptNames[i]; + row.scriptId = traceFuncInfo.scriptIds[i]; + row.line = traceFuncInfo.lines[i]; + row.column = traceFuncInfo.columns[i]; + (void)traceDataCache_->GetJsHeapTraceFuncInfoData()->AppendNewData(row); } return; } @@ -754,15 +761,16 @@ void PbreaderJSMemoryParser::ParseTraceNode(int32_t fileId, const json &jMessage if (traceDataCache_->isSplitFile_) { return; } + JsHeapTraceNodeRow row; + row.fileId = fileId; jsonns::TraceTree traceTree = jMessage.at("trace_tree"); for (size_t i = 0; i < traceTree.ids.size(); ++i) { - auto id = traceTree.ids[i]; - auto funcInfoIndex = traceTree.functionInfoIndexes[i]; - auto count = traceTree.counts[i]; - auto size = traceTree.sizes[i]; - auto parentId = traceTree.parentIds[i]; - (void)traceDataCache_->GetJsHeapTraceNodeData()->AppendNewData(fileId, id, funcInfoIndex, count, size, - parentId); + row.traceNodeId = traceTree.ids[i]; + row.functionInfoIndex = traceTree.functionInfoIndexes[i]; + row.count = traceTree.counts[i]; + row.size = traceTree.sizes[i]; + row.parentId = traceTree.parentIds[i]; + (void)traceDataCache_->GetJsHeapTraceNodeData()->AppendNewData(row); } return; } diff --git a/trace_streamer/src/parser/pbreader_parser/ffrt_parser/BUILD.gn b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/BUILD.gn new file mode 100644 index 000000000..59b19fc9c --- /dev/null +++ b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/BUILD.gn @@ -0,0 +1,32 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//build/ohos.gni") +import("../../../../build/ts.gni") + +config("ffrt_parser_cfg") { + include_dirs = [ "." ] +} + +ohos_static_library("pbreader_ffrt_parser") { + subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" + part_name = "${OHOS_PROFILER_PART_NAME}" + sources = [ "pbreader_ffrt_parser.cpp" ] + public_deps = [ + "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ffrt_profiler:ffrt_profiler_data_reader", + "../htrace_parser:pbreader_htrace_parser", + ] + public_configs = [ + ":ffrt_parser_cfg", + "../../:parser_base_cfg", + ] +} diff --git a/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.cpp b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.cpp new file mode 100644 index 000000000..de65679c7 --- /dev/null +++ b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "pbreader_ffrt_parser.h" +#include "ffrt_profiler_config.pbreader.h" +#include "clock_filter_ex.h" +namespace SysTuning { +namespace TraceStreamer { +PbreaderFfrtDetailParser::PbreaderFfrtDetailParser(TraceDataCache *dataCache, + const TraceStreamerFilters *ctx, + HtraceEventParser *eventParser) + : EventParserBase(dataCache, ctx), eventParser_(eventParser), taskNameIndexMap_(INVALID_UINT64) +{ +} +PbreaderFfrtDetailParser::~PbreaderFfrtDetailParser() {} +void PbreaderFfrtDetailParser::PaserCommData(bool &haveSplitSeg, + std::unique_ptr &ffrtEventPtr) +{ + if (traceDataCache_->isSplitFile_) { + haveSplitSeg = true; + return; + } + auto processName = ffrtEventPtr->process_name().ToStdString(); + auto threadName = ffrtEventPtr->thread_name().ToStdString(); + auto taskName = processName.empty() ? threadName : processName; + taskNameIndexMap_.Insert(ffrtEventPtr->tid(), ffrtEventPtr->pid(), traceDataCache_->GetDataIndex(taskName)); + streamFilters_->processFilter_->UpdateOrCreateThreadWithPidAndName(ffrtEventPtr->tid(), ffrtEventPtr->pid(), + taskName); +} +void PbreaderFfrtDetailParser::ParserFfrtTrace(const PbreaderDataSegment &dataSeg, + bool &haveSplitSeg, + std::unique_ptr &ffrtEventPtr) +{ + auto eventInfoPtr = std::make_unique(); + auto timeStamp = ffrtEventPtr->tv_nsec() + ffrtEventPtr->tv_sec() * SEC_TO_NS; + eventInfoPtr->timeStamp = streamFilters_->clockFilter_->ToPrimaryTraceTime(ffrtClockid_, timeStamp); + traceDataCache_->UpdateTraceTime(eventInfoPtr->timeStamp); + if (traceDataCache_->isSplitFile_) { + if (eventInfoPtr->timeStamp >= traceDataCache_->SplitFileMinTime() && + eventInfoPtr->timeStamp <= traceDataCache_->SplitFileMaxTime()) { + haveSplitSeg = true; + } + return; + } + eventInfoPtr->pid = ffrtEventPtr->tid(); + eventInfoPtr->tgid = ffrtEventPtr->pid(); + eventInfoPtr->eventType = TRACE_EVENT_FFRT; + auto taskNameIndex = taskNameIndexMap_.Find(eventInfoPtr->pid, eventInfoPtr->tgid); + if (taskNameIndex == INVALID_UINT64) { + taskNameIndex = traceDataCache_->GetDataIndex(""); + } + eventInfoPtr->taskNameIndex = taskNameIndex; + auto pos = (const char *)ffrtEventPtr->trace().Data() - dataSeg.seg->data(); + eventInfoPtr->detail = std::move(dataSeg.seg->substr(pos, ffrtEventPtr->trace().Size())); + eventParser_->AppendEvent(std::move(eventInfoPtr)); +} +void PbreaderFfrtDetailParser::Parser(const PbreaderDataSegment &dataSeg, bool &haveSplitSeg) +{ + ProtoReader::FfrtProfilerResult_Reader ffrtResultReader(dataSeg.protoData); + for (auto ffrtResultItor = ffrtResultReader.ffrt_event(); ffrtResultItor; ++ffrtResultItor) { + auto ffrtEventPtr = std::make_unique(ffrtResultItor->ToBytes()); + if (ffrtEventPtr->has_trace()) { + ParserFfrtTrace(dataSeg, haveSplitSeg, ffrtEventPtr); + } else if (!ffrtEventPtr->has_trace() && !ffrtEventPtr->has_raw()) { + PaserCommData(haveSplitSeg, ffrtEventPtr); + } + if (haveSplitSeg) { + return; + } + } +} +void PbreaderFfrtDetailParser::SetFfrtSrcClockid(PbreaderDataSegment &dataSeg) +{ + ProtoReader::FfrtProfilerConfig_Reader ffrtCfgReader(dataSeg.protoData); + ffrtClockid_ = ffrtCfgReader.clock_id(); + traceDataCache_->GetDataSourceClockIdData()->SetDataSourceClockId(DATA_SOURCE_TYPE_FFRT, ffrtClockid_); + TS_LOGI("ffrtClockid_=%u", ffrtClockid_); +} +void PbreaderFfrtDetailParser::FilterAllEventsReader() +{ + eventParser_->FilterAllEventsReader(); +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.h b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.h new file mode 100644 index 000000000..77792c663 --- /dev/null +++ b/trace_streamer/src/parser/pbreader_parser/ffrt_parser/pbreader_ffrt_parser.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PBREADER_FFRT_PARSER_H +#define PBREADER_FFRT_PARSER_H + +#include "common_types.h" +#include "double_map.h" +#include "ffrt_profiler_result.pbreader.h" +#include "event_parser_base.h" +#include "htrace_event_parser.h" + +namespace SysTuning { +namespace TraceStreamer { +class PbreaderFfrtDetailParser : public EventParserBase { +public: + PbreaderFfrtDetailParser(TraceDataCache *dataCache, + const TraceStreamerFilters *ctx, + HtraceEventParser *eventParser); + ~PbreaderFfrtDetailParser(); + void Parser(const PbreaderDataSegment &dataSeg, bool &haveSplitSeg); + void SetFfrtSrcClockid(PbreaderDataSegment &dataSeg); + void FilterAllEventsReader(); + +private: + void PaserCommData(bool &haveSplitSeg, std::unique_ptr &ffrtEventPtr); + void ParserFfrtTrace(const PbreaderDataSegment &dataSeg, + bool &haveSplitSeg, + std::unique_ptr &ffrtEventPtr); + +private: + HtraceEventParser *eventParser_; + ClockId ffrtClockid_ = TS_CLOCK_UNKNOW; + DoubleMap taskNameIndexMap_; +}; +} // namespace TraceStreamer +} // namespace SysTuning +#endif // PBREADER_FFRT_PARSER_H diff --git a/trace_streamer/src/parser/pbreader_parser/htrace_parser/BUILD.gn b/trace_streamer/src/parser/pbreader_parser/htrace_parser/BUILD.gn index fe206f4be..2b7d22a23 100644 --- a/trace_streamer/src/parser/pbreader_parser/htrace_parser/BUILD.gn +++ b/trace_streamer/src/parser/pbreader_parser/htrace_parser/BUILD.gn @@ -29,6 +29,9 @@ ohos_static_library("pbreader_htrace_parser") { "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/services:ts_all_type_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ftrace_data/${device_kernel_version}:ftrace_data_reader", ] + if (enable_ffrt) { + public_deps += [ "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ffrt_profiler:ffrt_profiler_data_reader" ] + } public_configs = [ ":htrace_cfg", "../../:parser_base_cfg", diff --git a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_cpu_detail_parser.h b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_cpu_detail_parser.h index 1b60bdba4..434a51879 100644 --- a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_cpu_detail_parser.h +++ b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_cpu_detail_parser.h @@ -39,7 +39,7 @@ public: void FilterAllEventsReader(); void FilterAllEvents(); -private: +public: std::unique_ptr eventParser_; }; } // namespace TraceStreamer diff --git a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp index c7aaa749a..2ffb5fcc2 100644 --- a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp @@ -21,6 +21,9 @@ #include "clk.pbreader.h" #include "clock_filter_ex.h" #include "cpu_filter.h" +#ifdef ENABLE_FFRT +#include "ffrt_profiler_result.pbreader.h" +#endif #include "ftrace.pbreader.h" #include "ftrace_event.pbreader.h" #include "sched.pbreader.h" @@ -40,6 +43,7 @@ #include "thread_state_flag.h" #include "trace_plugin_result.pbreader.h" #include "workqueue.pbreader.h" + namespace SysTuning { namespace TraceStreamer { static constexpr uint8_t MIN_DATA_AREA = 10; @@ -149,6 +153,10 @@ void HtraceEventParser::StackEventsInitialization() { eventToFunctionMap_.emplace(TRACE_EVENT_PRINT, std::bind(&HtraceEventParser::ParsePrintEvent, this, std::placeholders::_1)); +#ifdef ENABLE_FFRT + eventToFunctionMap_.emplace(TRACE_EVENT_FFRT, + std::bind(&HtraceEventParser::ParseFfrtEvent, this, std::placeholders::_1)); +#endif eventToFunctionMap_.emplace(TRACE_EVENT_WORKQUEUE_EXECUTE_START, std::bind(&HtraceEventParser::WorkqueueExecuteStartEvent, this, std::placeholders::_1)); eventToFunctionMap_.emplace(TRACE_EVENT_WORKQUEUE_EXECUTE_END, @@ -157,14 +165,20 @@ void HtraceEventParser::StackEventsInitialization() HtraceEventParser::~HtraceEventParser() { - TS_LOGI("thread count:%u", static_cast(tids_.size())); - TS_LOGI("process count:%u", static_cast(pids_.size())); TS_LOGI("ftrace ts MIN:%llu, MAX:%llu", static_cast(ftraceStartTime_), static_cast(ftraceEndTime_)); TS_LOGI("ftrace origin ts MIN:%llu, MAX:%llu", static_cast(ftraceOriginStartTime_), static_cast(ftraceOriginEndTime_)); } +void HtraceEventParser::AppendEvent(std::unique_ptr event) +{ +#ifdef SUPPORTTHREAD + std::lock_guard muxLockGuard(mutex_); +#endif + htraceEventList_.emplace_back(std::move(event)); +} + void HtraceEventParser::ParserCpuEvent(PbreaderDataSegment &tracePacket, SysTuning::ProtoReader::FtraceCpuDetailMsg_Reader &msg, bool &haveSplitSeg) @@ -515,12 +529,6 @@ bool HtraceEventParser::SchedSwitchEvent(const EventInfo &event) int32_t nextPrioValue = msg.next_prio(); uint32_t prevPidValue = msg.prev_pid(); uint32_t nextPidValue = msg.next_pid(); - if (!tids_.count(prevPidValue)) { - tids_.insert(prevPidValue); - } - if (!tids_.count(nextPidValue)) { - tids_.insert(nextPidValue); - } std::string prevCommStr = msg.prev_comm().ToStdString(); std::string nextCommStr = msg.next_comm().ToStdString(); auto prevState = msg.prev_state(); @@ -542,8 +550,9 @@ bool HtraceEventParser::SchedBlockReasonEvent(const EventInfo &event) auto caller = traceDataCache_->GetDataIndex( std::string_view("0x" + SysTuning::base::number(msg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX))); auto itid = streamFilters_->processFilter_->UpdateOrCreateThread(event.timeStamp, pid); - if (!streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.timeStamp, event.cpu, itid, ioWait, caller, - INVALID_UINT32)) { + if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.cpu, itid, ioWait, caller, INVALID_UINT32)) { + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED); + } else { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_NOTMATCH); } return true; @@ -597,21 +606,41 @@ bool HtraceEventParser::TaskNewtaskEvent(const EventInfo &event) const streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_NEWTASK, STAT_EVENT_NOTSUPPORTED); return true; } -bool HtraceEventParser::ParsePrintEvent(const EventInfo &event) +void HtraceEventParser::DealPrintEvent(const EventInfo &event, const std::string &bufferLine) { - streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PRINT, STAT_EVENT_RECEIVED); - ProtoReader::PrintFormat_Reader msg(event.detail); BytraceLine line; line.tgid = event.tgid; line.pid = event.pid; line.ts = event.timeStamp; const auto &taskName = traceDataCache_->GetDataFromDict(event.taskNameIndex); - printEventParser_.ParsePrintEvent(taskName, event.timeStamp, event.pid, msg.buf().ToStdString(), line); - if (!tids_.count(event.pid)) { - tids_.insert(event.pid); + printEventParser_.ParsePrintEvent(taskName, event.timeStamp, event.pid, bufferLine, line); +} +bool HtraceEventParser::ParsePrintEvent(const EventInfo &event) +{ + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PRINT, STAT_EVENT_RECEIVED); + ProtoReader::PrintFormat_Reader msg(event.detail); + DealPrintEvent(event, msg.buf().ToStdString()); + return true; +} +#ifdef ENABLE_FFRT +bool HtraceEventParser::ParseFfrtEvent(const EventInfo &event) +{ + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_FFRT, STAT_EVENT_RECEIVED); + ProtoReader::TraceEvent_Reader ffrtTrace(event.detail); + std::string bufferLine(ffrtTrace.trace_type().ToStdString()); + auto label = ffrtTrace.label().ToStdString(); + bufferLine.append("|").append(std::to_string(event.tgid)); + if (!label.empty()) { + RemoveNullTerminator(label); + bufferLine.append("|H:").append(label); + } + if (ffrtTrace.cookie()) { + bufferLine.append("|").append(std::to_string(ffrtTrace.cookie())); } + DealPrintEvent(event, bufferLine); return true; } +#endif bool HtraceEventParser::SchedWakeupEvent(const EventInfo &event) const { ProtoReader::SchedWakeupFormat_Reader msg(event.detail); @@ -901,9 +930,6 @@ void HtraceEventParser::FilterAllEventsReader() for (auto eventItor = htraceEventList_.begin(); eventItor != endOfList; ++eventItor) { auto event = eventItor->get(); if (event->tgid != INVALID_INT32) { - if (!pids_.count(event->tgid)) { - pids_.insert(event->tgid); - } streamFilters_->processFilter_->GetOrCreateThreadWithPid(event->tgid, event->tgid); } ProtoReaderDealEvent(event); @@ -926,9 +952,6 @@ void HtraceEventParser::FilterAllEvents() for (auto eventIter = htraceEventList_.begin(); eventIter != endOfList; ++eventIter) { auto event = eventIter->get(); if (event->tgid != INVALID_INT32) { - if (!pids_.count(event->tgid)) { - pids_.insert(event->tgid); - } streamFilters_->processFilter_->GetOrCreateThreadWithPid(event->tgid, event->tgid); } ProtoReaderDealEvent(event); @@ -949,9 +972,6 @@ void HtraceEventParser::FilterAllEvents() void HtraceEventParser::ProtoReaderDealEvent(EventInfo *eventInfo) { if (eventInfo->pid != INVALID_INT32) { - if (!tids_.count(eventInfo->pid)) { - tids_.insert(eventInfo->pid); - } streamFilters_->processFilter_->UpdateOrCreateThread(eventInfo->timeStamp, eventInfo->pid); } if (eventInfo->pid != INVALID_INT32 && eventInfo->tgid != INVALID_INT32) { diff --git a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.h b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.h index 0e318f4d8..fee2ec4fc 100644 --- a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.h +++ b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.h @@ -36,16 +36,6 @@ namespace SysTuning { namespace TraceStreamer { class HtraceEventParser : private EventParserBase { public: - HtraceEventParser(TraceDataCache *dataCache, const TraceStreamerFilters *filter); - ~HtraceEventParser(); - void ParseDataItem(PbreaderDataSegment &tracePacket, - ProtoReader::TracePluginResult_Reader &tracePluginResult, - bool &haveSplitSeg); - void FilterAllEventsReader(); - void FilterAllEvents(); - void Clear(); - -private: struct EventInfo { int32_t pid = 0; int32_t tgid = 0; @@ -56,6 +46,18 @@ private: std::string detail; }; +public: + HtraceEventParser(TraceDataCache *dataCache, const TraceStreamerFilters *filter); + ~HtraceEventParser(); + void ParseDataItem(PbreaderDataSegment &tracePacket, + ProtoReader::TracePluginResult_Reader &tracePluginResult, + bool &haveSplitSeg); + void AppendEvent(std::unique_ptr event); + void FilterAllEventsReader(); + void FilterAllEvents(); + void Clear(); + +private: // Initialization void InterruptEventInitialization(); void ClockEventInitialization(); @@ -111,7 +113,11 @@ private: bool ProcessFreeEvent(const EventInfo &event) const; bool TaskRenameEvent(const EventInfo &event) const; bool TaskNewtaskEvent(const EventInfo &event) const; + void DealPrintEvent(const EventInfo &event, const std::string &bufferLine); bool ParsePrintEvent(const EventInfo &event); +#ifdef ENABLE_FFRT + bool ParseFfrtEvent(const EventInfo &event); +#endif bool SchedWakeupEvent(const EventInfo &event) const; bool SchedWakeupNewEvent(const EventInfo &event) const; bool SchedWakingEvent(const EventInfo &event) const; @@ -139,8 +145,7 @@ private: bool OomScoreAdjUpdate(const EventInfo &event) const; using FuncCall = std::function; std::map eventToFunctionMap_ = {}; - std::unordered_set tids_ = {}; - std::unordered_set pids_ = {}; + std::deque> htraceEventList_ = {}; DataIndex workQueueId_ = 0; PrintEventParser printEventParser_; std::atomic lastOverwrite_{0}; @@ -148,7 +153,6 @@ private: std::atomic ftraceEndTime_{0}; std::atomic ftraceOriginStartTime_{std::numeric_limits::max()}; std::atomic ftraceOriginEndTime_{0}; - std::deque> htraceEventList_ = {}; const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup"); const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking"); const DataIndex schedWakeupNewName_ = traceDataCache_->GetDataIndex("sched_wakeup_new"); diff --git a/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.cpp b/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.cpp index 23a9c304b..08cfabae0 100644 --- a/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.cpp @@ -14,7 +14,10 @@ */ #include "pbreader_clock_detail_parser.h" #include "clock_filter_ex.h" +#include "common_types.pb.h" +#ifdef ENABLE_HTRACE #include "trace_plugin_result.pbreader.h" +#endif #include "measure_filter.h" #include "process_filter.h" #include "stat_filter.h" @@ -31,8 +34,8 @@ PbreaderClockDetailParser::PbreaderClockDetailParser(TraceDataCache *dataCache, traceDataCache_->GetDataIndex(config_.memNameMap_.at(static_cast(i))))); } } - PbreaderClockDetailParser::~PbreaderClockDetailParser() = default; +#ifdef ENABLE_HTRACE void PbreaderClockDetailParser::Parse(const ProtoReader::BytesView &tracePacket) const { if (traceDataCache_->isSplitFile_) { @@ -61,6 +64,7 @@ void PbreaderClockDetailParser::Parse(const ProtoReader::BytesView &tracePacket) } streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_SYNC, STAT_EVENT_RECEIVED); } +#endif void PbreaderClockDetailParser::Parse(const ProfilerTraceFileHeader *profilerTraceFileHeader) const { diff --git a/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.h b/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.h index f1bda4cad..5eee15815 100644 --- a/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.h +++ b/trace_streamer/src/parser/pbreader_parser/pbreader_clock_detail_parser.h @@ -33,7 +33,9 @@ class PbreaderClockDetailParser : public EventParserBase { public: PbreaderClockDetailParser(TraceDataCache *dataCache, const TraceStreamerFilters *filters); ~PbreaderClockDetailParser(); +#ifdef ENABLE_HTRACE void Parse(const ProtoReader::BytesView &tracePacket) const; +#endif void Parse(const ProfilerTraceFileHeader *profilerTraceFileHeader) const; private: diff --git a/trace_streamer/src/parser/pbreader_parser/pbreader_parser.cpp b/trace_streamer/src/parser/pbreader_parser/pbreader_parser.cpp index 91aafdf09..6f742dfe4 100644 --- a/trace_streamer/src/parser/pbreader_parser/pbreader_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/pbreader_parser.cpp @@ -40,6 +40,10 @@ PbreaderParser::PbreaderParser(TraceDataCache *dataCache, const TraceStreamerFil htraceCpuDetailParser_(std::make_unique(dataCache, filters)), htraceSymbolsDetailParser_(std::make_unique(dataCache, filters)), #endif +#ifdef ENABLE_FFRT + pbreaderFfrtParser_( + std::make_unique(dataCache, filters, htraceCpuDetailParser_->eventParser_.get())), +#endif #ifdef ENABLE_MEMORY pbreaderMemParser_(std::make_unique(dataCache, filters)), #endif @@ -158,6 +162,12 @@ void PbreaderParser::InitPluginNameIndex() ftracePluginIndex_.insert(traceDataCache_->GetDataIndex("/data/local/tmp/libftrace_plugin.z.so")); supportPluginNameIndex_.insert(ftracePluginIndex_.begin(), ftracePluginIndex_.end()); #endif +#ifdef ENABLE_FFRT + ffrtPluginIndex_ = traceDataCache_->GetDataIndex("ffrt-profiler"); + ffrtPluginConfigIndex_ = traceDataCache_->GetDataIndex("ffrt-profiler_config"); + supportPluginNameIndex_.insert(ffrtPluginIndex_); + supportPluginNameIndex_.insert(ffrtPluginConfigIndex_); +#endif #ifdef ENABLE_STREAM_EXTEND streamPluginIndex_ = traceDataCache_->GetDataIndex("stream-plugin"); supportPluginNameIndex_.insert(streamPluginIndex_); @@ -349,6 +359,11 @@ void PbreaderParser::FilterData(PbreaderDataSegment &seg, bool isSplitFile) htraceCpuDetailParser_->FilterAllEventsReader(); #endif } +#ifdef ENABLE_FFRT + else if (seg.dataType == DATA_SOURCE_TYPE_FFRT) { + pbreaderFfrtParser_->FilterAllEventsReader(); + } +#endif #ifdef ENABLE_NATIVE_HOOK else if (seg.dataType == DATA_SOURCE_TYPE_NATIVEHOOK) { pbreaderNativeHookParser_->Parse(seg, haveSplitSeg); @@ -472,6 +487,9 @@ bool PbreaderParser::SpliteDataBySegment(DataIndex pluginNameIndex, PbreaderData #ifdef ENABLE_HTRACE isOtherPlugin = isOtherPlugin || ftracePluginIndex_.count(pluginNameIndex); #endif +#ifdef ENABLE_FFRT + isOtherPlugin = isOtherPlugin || (ffrtPluginIndex_ == pluginNameIndex); +#endif #ifdef ENABLE_HISYSEVENT isOtherPlugin = isOtherPlugin || (hisyseventPluginIndex_ == pluginNameIndex); #endif @@ -510,6 +528,13 @@ void PbreaderParser::ParseDataByPluginName(PbreaderDataSegment &dataSeg, ParseFtrace(dataSeg); #endif } +#ifdef ENABLE_FFRT + else if (ffrtPluginIndex_ == pulginNameIndex) { + ParseFfrt(dataSeg); + } else if (ffrtPluginConfigIndex_ == pulginNameIndex) { + ParseFfrtConfig(dataSeg); + } +#endif #ifdef ENABLE_NATIVE_HOOK else if (nativeHookPluginIndex_.count(pulginNameIndex)) { ParseNativeHook(dataSeg, isSplitFile); @@ -726,7 +751,24 @@ void PbreaderParser::ParseFtrace(PbreaderDataSegment &dataSeg) } } #endif - +#ifdef ENABLE_FFRT +void PbreaderParser::ParseFfrtConfig(PbreaderDataSegment &dataSeg) +{ + pbreaderFfrtParser_->SetFfrtSrcClockid(dataSeg); + dataSeg.dataType = DATA_SOURCE_TYPE_FFRT_CONFIG; + dataSeg.status = TS_PARSE_STATUS_PARSED; +} +void PbreaderParser::ParseFfrt(PbreaderDataSegment &dataSeg) +{ + bool haveSplitSeg = false; + pbreaderFfrtParser_->Parser(dataSeg, haveSplitSeg); + if (haveSplitSeg) { + mPbreaderSplitData_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); + } + dataSeg.dataType = DATA_SOURCE_TYPE_FFRT; + dataSeg.status = TS_PARSE_STATUS_PARSED; +} +#endif #ifdef ENABLE_HTDUMP void PbreaderParser::ParseFPS(PbreaderDataSegment &dataSeg) { diff --git a/trace_streamer/src/parser/pbreader_parser/pbreader_parser.h b/trace_streamer/src/parser/pbreader_parser/pbreader_parser.h index 0881271f4..f1a3b8319 100644 --- a/trace_streamer/src/parser/pbreader_parser/pbreader_parser.h +++ b/trace_streamer/src/parser/pbreader_parser/pbreader_parser.h @@ -33,6 +33,9 @@ #include "htrace_cpu_detail_parser.h" #include "htrace_symbols_detail_parser.h" #endif +#ifdef ENABLE_FFRT +#include "pbreader_ffrt_parser.h" +#endif #include "htrace_plugin_time_parser.h" #ifdef ENABLE_CPUDATA #include "pbreader_cpu_data_parser.h" @@ -194,6 +197,10 @@ private: #ifdef ENABLE_HTRACE void ParseFtrace(PbreaderDataSegment &dataSeg); #endif +#ifdef ENABLE_FFRT + void ParseFfrtConfig(PbreaderDataSegment &dataSeg); + void ParseFfrt(PbreaderDataSegment &dataSeg); +#endif #ifdef ENABLE_HTDUMP void ParseFPS(PbreaderDataSegment &dataSeg); #endif @@ -259,6 +266,11 @@ private: bool onlyParseFtrace_ = false; #endif std::set ftracePluginIndex_ = {}; +#ifdef ENABLE_FFRT + DataIndex ffrtPluginIndex_ = {}; + DataIndex ffrtPluginConfigIndex_ = {}; + std::unique_ptr pbreaderFfrtParser_; +#endif #ifdef ENABLE_MEMORY std::unique_ptr pbreaderMemParser_; ClockId dataSourceTypeMemClockid_ = TS_CLOCK_UNKNOW; diff --git a/trace_streamer/src/parser/print_event_parser.cpp b/trace_streamer/src/parser/print_event_parser.cpp index f0a83d6a2..a9f7c5f8b 100644 --- a/trace_streamer/src/parser/print_event_parser.cpp +++ b/trace_streamer/src/parser/print_event_parser.cpp @@ -93,7 +93,7 @@ void PrintEventParser::ParseBeginEvent(const std::string &comm, if (index != INVALID_UINT32) { // add distributed data traceDataCache_->GetInternalSlicesData()->SetDistributeInfo(index, point.chainId_, point.spanId_, - point.parentSpanId_, point.flag_, point.args_); + point.parentSpanId_, point.flag_); if (pid == point.tgid_) { if (HandleFrameSliceBeginEvent(point.funcPrefixId_, index, point.funcArgs_, line)) { return; @@ -234,8 +234,8 @@ ParseResult PrintEventParser::HandlerB(std::string_view pointStr, TracePoint &ou TS_LOGD("point name is empty!"); return PARSE_ERROR; } - // Use $# to differentiate distributed data - if (outPoint.name_.find("$#") == std::string::npos) { + // Use ## to differentiate distributed data + if (outPoint.name_.find("##") == std::string::npos) { auto space = outPoint.name_.find(' '); if (space != std::string::npos) { outPoint.funcPrefix_ = outPoint.name_.substr(0, space); @@ -248,10 +248,8 @@ ParseResult PrintEventParser::HandlerB(std::string_view pointStr, TracePoint &ou } // Resolve distributed calls // the normal data mybe like: - // system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|[8b00e96b2,2,1]:C$#decodeFrame$#" - // "{\"Process\":\"DecodeVideoFrame\",\"frameTimestamp\":37313484466} \ - // system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n - const std::regex distributeMatcher = std::regex(R"((?:^\[([a-z0-9]+),(\d+),(\d+)\]:?([CS]?)\$#)?(.*)\$#(.*)$)"); + // system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|H:[8b00e96b2,2,1]#C##decodeFrame" + const std::regex distributeMatcher = std::regex(R"(H:\[([a-z0-9]+),([a-z0-9]+),([a-z0-9]+)\]#([CS]?)##(.*))"); std::smatch matcheLine; bool matched = std::regex_match(outPoint.name_, matcheLine, distributeMatcher); if (matched) { @@ -260,8 +258,6 @@ ParseResult PrintEventParser::HandlerB(std::string_view pointStr, TracePoint &ou outPoint.spanId_ = matcheLine[++index].str(); outPoint.parentSpanId_ = matcheLine[++index].str(); outPoint.flag_ = matcheLine[++index].str(); - outPoint.name_ = matcheLine[++index].str(); - outPoint.args_ = matcheLine[++index].str(); } return PARSE_SUCCESS; } diff --git a/trace_streamer/src/parser/ptreader_parser/bytrace_parser/bytrace_event_parser.cpp b/trace_streamer/src/parser/ptreader_parser/bytrace_parser/bytrace_event_parser.cpp index 2b248b046..c66641bcd 100644 --- a/trace_streamer/src/parser/ptreader_parser/bytrace_parser/bytrace_event_parser.cpp +++ b/trace_streamer/src/parser/ptreader_parser/bytrace_parser/bytrace_event_parser.cpp @@ -246,8 +246,7 @@ bool BytraceEventParser::BlockedReason(const ArgsMap &args, const BytraceLine &l return false; } auto iTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, tid.value()); - if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(line.ts, line.cpu, iTid, iowait.value(), caller, - delayValue)) { + if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(line.cpu, iTid, iowait.value(), caller, delayValue)) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED); } else { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_NOTMATCH); diff --git a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp index ff44bcfb7..998bed996 100644 --- a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp @@ -278,8 +278,10 @@ bool CpuDetailParser::SchedBlockReasonEvent(const RawTraceEventInfo &event) auto caller = traceDataCache_->GetDataIndex( std::string_view("0x" + SysTuning::base::number(reasonMsg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX))); auto itid = streamFilters_->processFilter_->UpdateOrCreateThread(event.msgPtr->timestamp(), reasonMsg.pid()); - if (!streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.msgPtr->timestamp(), event.cpuId, itid, - reasonMsg.io_wait(), caller, INVALID_UINT32)) { + if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.cpuId, itid, reasonMsg.io_wait(), caller, + INVALID_UINT32)) { + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED); + } else { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_NOTMATCH); } return true; diff --git a/trace_streamer/src/protos/types/plugins/ffrt_profiler/BUILD.gn b/trace_streamer/src/protos/types/plugins/ffrt_profiler/BUILD.gn new file mode 100644 index 000000000..66a13d4fc --- /dev/null +++ b/trace_streamer/src/protos/types/plugins/ffrt_profiler/BUILD.gn @@ -0,0 +1,90 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") +import("../../../protos.gni") + +ffrt_profiler_sources = [ + "./ffrt_profiler_config.proto", + "./ffrt_profiler_result.proto", +] + +####################################################### +proto_out_dir = "$root_gen_dir/cpp/" + rebase_path(".", "//") +proto_rel_out_dir = rebase_path(proto_out_dir, root_build_dir) + +ffrt_profiler_codegen = [] +ffrt_profiler_codegen_reader = [] +ffrt_profiler_codegen_all = [] +foreach(proto, ffrt_profiler_sources) { + name = get_path_info(proto, "name") + ffrt_profiler_codegen += [ + "$proto_out_dir/$name.pb.h", + "$proto_out_dir/$name.pb.cc", + ] + ffrt_profiler_codegen_reader += [ "$proto_out_dir/${name}.pbreader.h" ] +} +ffrt_profiler_codegen_all += ffrt_profiler_codegen +ffrt_profiler_codegen_all += ffrt_profiler_codegen_reader + +config("ffrt_profiler_include_config") { + include_dirs = [ "$proto_out_dir" ] +} + +####################################################### +action("ts_ffrt_profiler_cpp_gen") { + script = "${OHOS_TRACE_STREAMER_DIR_PROTOC}" + sources = ffrt_profiler_sources + outputs = ffrt_profiler_codegen_all + args = [ + "$libc_dir_proto", + "$root_output_dir_proto", + "$proto_rel_out_dir", + "--cpp_out", + "$proto_rel_out_dir", + "--proto_path", + rebase_path(".", root_build_dir), + ] + args += rebase_path(sources, root_build_dir) + if (!use_wasm && !is_test && !is_fuzz) { + deps = [ + "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})", + "${SRC}/proto_reader/protoc_plugin:protoreader_plugin(${host_toolchain})", + ] + } +} + +ohos_source_set("ts_ffrt_profiler_cpp") { + subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" + part_name = "${OHOS_PROFILER_PART_NAME}" + deps = [ ":ts_ffrt_profiler_cpp_gen" ] + public_deps = [ + "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite_static", + "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_static", + ] + include_dirs = [ "$proto_out_dir" ] + public_configs = [ ":ffrt_profiler_include_config" ] + sources = ffrt_profiler_codegen +} +ohos_source_set("ffrt_profiler_data_reader") { + subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" + part_name = "${OHOS_PROFILER_PART_NAME}" + deps = [ ":ts_ffrt_profiler_cpp_gen" ] + public_deps = [ + "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite_static", + "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_static", + ] + include_dirs = [ "$proto_out_dir" ] + public_configs = [ ":ffrt_profiler_include_config" ] + sources = ffrt_profiler_codegen_reader +} diff --git a/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_config.proto b/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_config.proto new file mode 100644 index 000000000..f05ef7007 --- /dev/null +++ b/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_config.proto @@ -0,0 +1,43 @@ +// Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +syntax = "proto3"; +option java_package = "ohos.devtools.datasources.transport.grpc.service"; +option optimize_for = LITE_RUNTIME; + +message FfrtProfilerConfig { + // Data collection when the program is running + repeated int64 pid = 1; + + // Data collection in program startup stage + repeated string startup_process_name = 2; + + // Data collection of program restart. + repeated string restart_process_name = 3; + + enum ClockId { + UNKNOW = 0; + BOOTTIME = 1; + REALTIME = 2; + REALTIME_COARSE = 3; + MONOTONIC = 4; + MONOTONIC_COARSE = 5; + MONOTONIC_RAW = 6; + }; + ClockId clock_id = 4; + uint32 smb_pages = 5; + uint32 flush_interval = 6; + + // false: Discard data when there is no space in shared memory. + // true: Block waiting when there is no space in the shared memory. + bool block = 7; +} \ No newline at end of file diff --git a/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_result.proto b/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_result.proto new file mode 100644 index 000000000..8a51a8239 --- /dev/null +++ b/trace_streamer/src/protos/types/plugins/ffrt_profiler/ffrt_profiler_result.proto @@ -0,0 +1,46 @@ + +// Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +syntax = "proto3"; +option java_package = "ohos.devtools.datasources.transport.grpc.service"; +option optimize_for = LITE_RUNTIME; + +message TraceEvent { + uint32 cpu = 1; + bytes trace_type = 2; + bytes label = 3; + uint64 cookie = 4; +} + +message RawEvent { + int32 type = 1; + bytes payload = 2; +} + +message FfrtProfilerEvent { + uint64 tv_sec = 1; + uint64 tv_nsec = 2; + uint32 pid = 4; + uint32 tid = 5; + bytes process_name = 6; + bytes thread_name = 7; + + oneof event { + TraceEvent trace = 8; + RawEvent raw = 9; + } +} + +message FfrtProfilerResult { + repeated FfrtProfilerEvent ffrt_event = 1; +} \ No newline at end of file diff --git a/trace_streamer/src/rpc/ffrt_converter.cpp b/trace_streamer/src/rpc/ffrt_converter.cpp index d44732eee..44e4f84f1 100644 --- a/trace_streamer/src/rpc/ffrt_converter.cpp +++ b/trace_streamer/src/rpc/ffrt_converter.cpp @@ -380,7 +380,7 @@ void FfrtConverter::ConvertFfrtThreadToFfrtTask(vector &results, Ty auto gid = WAKE_EVENT_DEFAULT_VALUE; for (auto &line : info.line) { auto mark = results[line]; - ProcessMarkWithSchedSwitch(results, line, tid, prio, mark); + ProcessMarkWithSchedSwitch(tid, prio, mark); if (mark.find("|FFRT") != std::string::npos || mark.find("|H:FFRT") != std::string::npos) { auto returnValue = ProcessMarkWithFFRT(results, line, threadName, prio, tid, pid, gid, taskLabels, mark); @@ -412,9 +412,7 @@ void FfrtConverter::ConvertFfrtThreadToFfrtTask(vector &results, Ty } return; } -void FfrtConverter::ProcessMarkWithSchedSwitch(vector &results, - const int &line, - const int &tid, +void FfrtConverter::ProcessMarkWithSchedSwitch(const int &tid, int &prio, const std::string &mark) { diff --git a/trace_streamer/src/rpc/ffrt_converter.h b/trace_streamer/src/rpc/ffrt_converter.h index 1745d2643..8fec872cd 100644 --- a/trace_streamer/src/rpc/ffrt_converter.h +++ b/trace_streamer/src/rpc/ffrt_converter.h @@ -65,9 +65,7 @@ private: int FindTid(string &log); std::string GetLabel(const std::string &mark); void ConvertFfrtThreadToFfrtTask(vector &results, TypeFfrtPid &ffrtPidsMap); - void ProcessMarkWithSchedSwitch(vector &results, - const int &line, - const int &tid, + void ProcessMarkWithSchedSwitch(const int &tid, int &prio, const std::string &mark); bool ProcessMarkWithFFRT(vector &results, diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp index 28c77b5d1..18558d87c 100644 --- a/trace_streamer/src/rpc/rpc_server.cpp +++ b/trace_streamer/src/rpc/rpc_server.cpp @@ -263,11 +263,11 @@ bool RpcServer::DetermineSystrace(const uint8_t *data, size_t len) bool RpcServer::SendBytraceSplitFileData(SplitFileCallBack splitFileCallBack, int32_t isFinish) { - int32_t firstPos = ts_->GetBytraceData()->MinSplitPos(); - int32_t lastPos = ts_->GetBytraceData()->MaxSplitPos(); + int32_t firstPos = ts_->GetPtreaderParser()->MinSplitPos(); + int32_t lastPos = ts_->GetPtreaderParser()->MaxSplitPos(); TS_CHECK_TRUE(firstPos != INVALID_INT32 && lastPos != INVALID_INT32 && lastPos >= firstPos, false, "firstPos(%d) or lastPos(%d) is INVALID_INT32!", firstPos, lastPos); - const auto &mTraceDataBytrace = ts_->GetBytraceData()->GetPtreaderSplitData(); + const auto &mTraceDataBytrace = ts_->GetPtreaderParser()->GetPtreaderSplitData(); // for 10% data int32_t tenPercentDataNum = 0.1 * (lastPos - firstPos); firstPos -= tenPercentDataNum; @@ -284,14 +284,14 @@ bool RpcServer::SendBytraceSplitFileData(SplitFileCallBack splitFileCallBack, in result += SIZE + std::to_string(mTraceDataBytrace[index].second); result += "},"; } - if (result != VALUE && !ts_->GetBytraceData()->GetPtreaderSplitData().empty()) { + if (result != VALUE && !ts_->GetPtreaderParser()->GetPtreaderSplitData().empty()) { result.pop_back(); result += "]}\r\n"; splitFileCallBack(result, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, isFinish); } TS_LOGI("MinSplitPos=%d, MaxSplitPos=%d, tenPercentDataNum=%d, firstPos=%d, lastPos=%d\nresult=%s", - ts_->GetBytraceData()->MinSplitPos(), ts_->GetBytraceData()->MaxSplitPos(), tenPercentDataNum, firstPos, - lastPos, result.data()); + ts_->GetPtreaderParser()->MinSplitPos(), ts_->GetPtreaderParser()->MaxSplitPos(), tenPercentDataNum, + firstPos, lastPos, result.data()); return true; } @@ -342,7 +342,7 @@ bool RpcServer::ParseSplitFileData(const uint8_t *data, ts_->GetFileType() == TRACE_FILETYPE_HI_SYSEVENT)) { SendBytraceSplitFileData(splitFileCallBack, 0); splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); - ts_->GetBytraceData()->ClearPtreaderSplitData(); + ts_->GetPtreaderParser()->ClearPtreaderSplitData(); ts_->GetTraceDataCache()->isSplitFile_ = false; return true; } @@ -364,9 +364,9 @@ bool RpcServer::ParseSplitFileData(const uint8_t *data, } #endif splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); - ts_->GetHtraceData()->ClearPbreaderSplitData(); + ts_->GetPbreaderParser()->ClearPbreaderSplitData(); #ifdef ENABLE_ARKTS - ts_->GetHtraceData()->GetJsMemoryData()->ClearArkTsSplitFileData(); + ts_->GetPbreaderParser()->GetJsMemoryData()->ClearArkTsSplitFileData(); #endif ts_->GetTraceDataCache()->isSplitFile_ = false; return true; @@ -376,20 +376,17 @@ void RpcServer::ProcHtraceSplitResult(SplitFileCallBack splitFileCallBack) uint64_t dataSize = 0; std::string result = VALUE; #ifdef ENABLE_NATIVE_HOOK - ts_->GetHtraceData()->ClearNativehookData(); + ts_->GetPbreaderParser()->ClearNativehookData(); #endif - for (const auto &itemHtrace : ts_->GetHtraceData()->GetPbreaderSplitData()) { - dataSize += itemHtrace.second; - result += OFFSET + std::to_string(itemHtrace.first); + for (const auto &itemHtrace : ts_->GetPbreaderParser()->GetPbreaderSplitData()) { result += SIZE + std::to_string(itemHtrace.second); - result += "},"; } - auto dataSourceType = ts_->GetHtraceData()->GetDataSourceType(); - auto profilerHeader = ts_->GetHtraceData()->GetProfilerHeader(); + auto dataSourceType = ts_->GetPbreaderParser()->GetDataSourceType(); + auto profilerHeader = ts_->GetPbreaderParser()->GetProfilerHeader(); #ifdef ENABLE_ARKTS if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { - dataSize += - ts_->GetHtraceData()->GetArkTsConfigData().size() + ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSize(); + dataSize += ts_->GetPbreaderParser()->GetArkTsConfigData().size() + + ts_->GetPbreaderParser()->GetJsMemoryData()->GetArkTsSize(); } #endif #ifdef ENABLE_NATIVE_HOOK @@ -405,15 +402,15 @@ void RpcServer::ProcHtraceSplitResult(SplitFileCallBack splitFileCallBack) #ifdef ENABLE_NATIVE_HOOK ProcHookCommSplitResult(splitFileCallBack); #endif - if (result != VALUE && !ts_->GetHtraceData()->GetPbreaderSplitData().empty()) { + if (result != VALUE && !ts_->GetPbreaderParser()->GetPbreaderSplitData().empty()) { result.pop_back(); result += "]}\r\n"; splitFileCallBack(result, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 0); } #ifdef ENABLE_ARKTS if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { - splitFileCallBack(ts_->GetHtraceData()->GetArkTsConfigData() + - ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSplitFileData(), + splitFileCallBack(ts_->GetPbreaderParser()->GetArkTsConfigData() + + ts_->GetPbreaderParser()->GetJsMemoryData()->GetArkTsSplitFileData(), (int32_t)SplitDataDataType::SPLIT_FILE_DATA, 0); } #endif @@ -440,7 +437,7 @@ void RpcServer::ProcHookCommSplitResult(SplitFileCallBack splitFileCallBack) #ifdef ENABLE_EBPF void RpcServer::ProcEbpfSplitResult(SplitFileCallBack splitFileCallBack, bool isLast) { - auto ebpfSplitResult = ts_->GetHtraceData()->GetEbpfDataParser()->GetEbpfSplitResult(); + auto ebpfSplitResult = ts_->GetPbreaderParser()->GetEbpfDataParser()->GetEbpfSplitResult(); std::string result = VALUE; for (auto ebpfIter = ebpfSplitResult.begin(); ebpfIter != ebpfSplitResult.end(); ++ebpfIter) { if (ebpfIter->type == (int32_t)SplitDataDataType::SPLIT_FILE_JSON) { @@ -468,7 +465,7 @@ void RpcServer::ProcEbpfSplitResult(SplitFileCallBack splitFileCallBack, bool is #ifdef ENABLE_HIPERF void RpcServer::ProcPerfSplitResult(SplitFileCallBack splitFileCallBack, bool isLast) { - auto perfSplitResult = ts_->GetHtraceData()->GetPerfSplitResult(); + auto perfSplitResult = ts_->GetPbreaderParser()->GetPerfSplitResult(); std::string result = VALUE; for (auto perfIter = perfSplitResult.begin(); perfIter != perfSplitResult.end(); ++perfIter) { if (perfIter->type == (int32_t)SplitDataDataType::SPLIT_FILE_JSON) { diff --git a/trace_streamer/src/table/base/include/table_base.h b/trace_streamer/src/table/base/include/table_base.h index b563a5d15..4f0a62d90 100644 --- a/trace_streamer/src/table/base/include/table_base.h +++ b/trace_streamer/src/table/base/include/table_base.h @@ -184,6 +184,7 @@ protected: } // needs to correspond to Cursor::Filter() virtual void EstimateFilterCost(FilterConstraints &fc, EstimatedIndexInfo &ei); + double CalculateFilterCost(int64_t rowCount, FilterConstraints &fc); virtual std::unique_ptr CreateCursor() = 0; int32_t Open(sqlite3_vtab_cursor **ppCursor); diff --git a/trace_streamer/src/table/base/table_base.cpp b/trace_streamer/src/table/base/table_base.cpp index 1d6382100..5ad82b7d7 100644 --- a/trace_streamer/src/table/base/table_base.cpp +++ b/trace_streamer/src/table/base/table_base.cpp @@ -341,6 +341,23 @@ void TableBase::Cursor::FilterId(unsigned char op, sqlite3_value *argv) } } +double TableBase::CalculateFilterCost(int64_t rowCount, FilterConstraints &fc) +{ + auto constraints = fc.GetConstraints(); + if (constraints.empty()) { // scan all rows + return rowCount; + } + double filterCost = 0.0; + for (int32_t i = 0; i < static_cast(constraints.size()); i++) { + if (rowCount <= 1) { + // only one row or nothing, needn't filter by constraint + filterCost += rowCount; + break; + } + FilterByConstraint(fc, filterCost, rowCount, i); + } + return filterCost; +} void TableBase::EstimateFilterCost(FilterConstraints &fc, EstimatedIndexInfo &ei) { constexpr double filterBaseCost = 1000.0; // set-up and tear-down @@ -353,22 +370,7 @@ void TableBase::EstimateFilterCost(FilterConstraints &fc, EstimatedIndexInfo &ei ei.estimatedCost += indexCost * rowCount; return; } - double filterCost = 0.0; - auto constraints = fc.GetConstraints(); - if (constraints.empty()) { // scan all rows - filterCost = rowCount; - } else { - for (int32_t i = 0; i < static_cast(constraints.size()); i++) { - if (rowCount <= 1) { - // only one row or nothing, needn't filter by constraint - filterCost += rowCount; - break; - } - FilterByConstraint(fc, filterCost, rowCount, i); - } - } - - ei.estimatedCost += filterCost; + ei.estimatedCost += CalculateFilterCost(rowCount, fc); ei.estimatedRows = rowCount; ei.estimatedCost += rowCount * indexCost; ei.isOrdered = true; diff --git a/trace_streamer/src/table/ftrace/callstack_table.cpp b/trace_streamer/src/table/ftrace/callstack_table.cpp index c5949e5df..1f3773752 100644 --- a/trace_streamer/src/table/ftrace/callstack_table.cpp +++ b/trace_streamer/src/table/ftrace/callstack_table.cpp @@ -31,8 +31,7 @@ enum class Index : int32_t { CHAIN_IDS, SPAN_IDS, PARENT_SPAN_IDS, - FLAGS, - ARGS + FLAGS }; CallStackTable::CallStackTable(const TraceDataCache *dataCache) : TableBase(dataCache) { @@ -50,7 +49,6 @@ CallStackTable::CallStackTable(const TraceDataCache *dataCache) : TableBase(data tableColumn_.push_back(TableBase::ColumnInfo("spanId", "TEXT")); tableColumn_.push_back(TableBase::ColumnInfo("parentSpanId", "TEXT")); tableColumn_.push_back(TableBase::ColumnInfo("flag", "TEXT")); - tableColumn_.push_back(TableBase::ColumnInfo("args", "TEXT")); tablePriKey_.push_back("callid"); tablePriKey_.push_back("ts"); tablePriKey_.push_back("depth"); @@ -206,10 +204,6 @@ void CallStackTable::Cursor::HandleTypeColumns(int32_t col) const SetTypeColumnTextNotEmpty(slicesObj_.Flags()[CurrentRow()].empty(), slicesObj_.Flags()[CurrentRow()].c_str()); break; - case Index::ARGS: - SetTypeColumnTextNotEmpty(slicesObj_.ArgsData()[CurrentRow()].empty(), - slicesObj_.ArgsData()[CurrentRow()].c_str()); - break; default: TS_LOGF("Unregistered column : %d", col); break; diff --git a/trace_streamer/src/table/ftrace/include/thread_table.h b/trace_streamer/src/table/ftrace/include/thread_table.h index add5f5dd6..3a7765def 100644 --- a/trace_streamer/src/table/ftrace/include/thread_table.h +++ b/trace_streamer/src/table/ftrace/include/thread_table.h @@ -37,15 +37,11 @@ private: double &threadfilterCost, size_t threadrowCount, uint32_t threadcurrenti) override; - int32_t Update(int32_t argc, sqlite3_value **argv, sqlite3_int64 *pRowid) override; class Cursor : public TableBase::Cursor { public: explicit Cursor(const TraceDataCache *dataCache, TableBase *table); ~Cursor() override; - void FilterIpid(unsigned char op, uint64_t value); - void FilterTid(unsigned char op, uint64_t value); - void FilterSwitchCount(unsigned char op, uint64_t value); void FilterIndex(int32_t col, unsigned char op, sqlite3_value *argv); int32_t Filter(const FilterConstraints &fc, sqlite3_value **argv) override; int32_t Column(int32_t col) const override; @@ -53,69 +49,6 @@ private: private: void SetNameColumn(const Thread &thread) const; - template - void HandleIpidConstraint(bool remove, - bool &changed, - Value value, - Size size, - const std::deque &threadQueue) - { - if (remove) { - for (auto idx = indexMapBack_->rowIndex_.begin(); idx != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*idx].switchCount_ != value) { - idx++; - } else { - changed = true; - rowIndexBak_.push_back(*idx); - idx++; - } - } - if (changed) { - indexMapBack_->rowIndex_ = rowIndexBak_; - } - } else { - for (auto idx = 0; idx < size; idx++) { - if (threadQueue[idx].switchCount_ == value) { - indexMapBack_->rowIndex_.push_back(idx); - } - } - } - indexMapBack_->FixSize(); - } - template - void HandleSwitchCount(bool remove, - bool &isChanged, - Value value, - Size size, - const std::deque &threadQueue) - { - if (remove) { - for (auto i = indexMapBack_->rowIndex_.begin(); i != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*i].internalPid_ != value) { - i++; - } else { - isChanged = true; - rowIndexBak_.push_back(*i); - i++; - } - } - if (isChanged) { - indexMapBack_->rowIndex_ = rowIndexBak_; - } - } else { - for (auto i = 0; i < size; i++) { - if (threadQueue[i].internalPid_ == value) { - indexMapBack_->rowIndex_.push_back(i); - } - } - } - indexMapBack_->FixSize(); - } - void HandleIpidConstraint(const std::deque &threadQueue, - std::size_t size, - bool remove, - bool changed); - std::vector rowIndexBak_; IndexMap *indexMapBack_ = nullptr; }; }; diff --git a/trace_streamer/src/table/ftrace/irq_table.cpp b/trace_streamer/src/table/ftrace/irq_table.cpp index 203cdbe9b..56c58da0e 100644 --- a/trace_streamer/src/table/ftrace/irq_table.cpp +++ b/trace_streamer/src/table/ftrace/irq_table.cpp @@ -17,23 +17,7 @@ namespace SysTuning { namespace TraceStreamer { -enum class Index : int32_t { - ID = 0, - TS, - DURS, - CALL_IDS, - CAT, - NAME, - DEPTH, - COOKIE_ID, - PARENT_ID, - ARGSET, - CHAIN_IDS, - SPAN_IDS, - PARENT_SPAN_IDS, - FLAG, - ARGS -}; +enum class Index : int32_t { ID = 0, TS, DURS, CALL_IDS, CAT, NAME, DEPTH, COOKIE_ID, PARENT_ID, ARGSET, FLAG }; IrqTable::IrqTable(const TraceDataCache *dataCache) : TableBase(dataCache) { tableColumn_.emplace_back(TableBase::ColumnInfo("id", "INTEGER")); @@ -46,11 +30,7 @@ IrqTable::IrqTable(const TraceDataCache *dataCache) : TableBase(dataCache) tableColumn_.emplace_back(TableBase::ColumnInfo("cookie", "INTEGER")); tableColumn_.emplace_back(TableBase::ColumnInfo("parent_id", "INTEGER")); tableColumn_.emplace_back(TableBase::ColumnInfo("argsetid", "INTEGER")); - tableColumn_.emplace_back(TableBase::ColumnInfo("chainId", "TEXT")); - tableColumn_.emplace_back(TableBase::ColumnInfo("spanId", "TEXT")); - tableColumn_.emplace_back(TableBase::ColumnInfo("parentSpanId", "TEXT")); tableColumn_.emplace_back(TableBase::ColumnInfo("flag", "TEXT")); - tableColumn_.emplace_back(TableBase::ColumnInfo("args", "TEXT")); tablePriKey_.emplace_back("callid"); tablePriKey_.emplace_back("ts"); tablePriKey_.emplace_back("depth"); @@ -177,21 +157,9 @@ void IrqTable::Cursor::HandleTypeColumns(int32_t column) const case Index::ARGSET: SetTypeColumnInt64(slicesObj_.ArgSetIdsData()[CurrentRow()], INVALID_UINT32); break; - case Index::CHAIN_IDS: - sqlite3_result_text(context_, slicesObj_.ChainIds()[CurrentRow()].c_str(), STR_DEFAULT_LEN, nullptr); - break; - case Index::SPAN_IDS: - sqlite3_result_text(context_, slicesObj_.SpanIds()[CurrentRow()].c_str(), STR_DEFAULT_LEN, nullptr); - break; - case Index::PARENT_SPAN_IDS: - sqlite3_result_text(context_, slicesObj_.ParentSpanIds()[CurrentRow()].c_str(), STR_DEFAULT_LEN, nullptr); - break; case Index::FLAG: sqlite3_result_text(context_, slicesObj_.Flags()[CurrentRow()].c_str(), STR_DEFAULT_LEN, nullptr); break; - case Index::ARGS: - sqlite3_result_text(context_, slicesObj_.ArgsData()[CurrentRow()].c_str(), STR_DEFAULT_LEN, nullptr); - break; default: TS_LOGF("Unregistered column : %d", column); break; diff --git a/trace_streamer/src/table/ftrace/thread_table.cpp b/trace_streamer/src/table/ftrace/thread_table.cpp index 0ba4f99b6..655d16f04 100644 --- a/trace_streamer/src/table/ftrace/thread_table.cpp +++ b/trace_streamer/src/table/ftrace/thread_table.cpp @@ -70,171 +70,7 @@ ThreadTable::Cursor::Cursor(const TraceDataCache *dataCache, TableBase *table) } ThreadTable::Cursor::~Cursor() {} -void ThreadTable::Cursor::FilterTid(unsigned char op, uint64_t value) -{ - bool remove = false; - if (indexMapBack_->HasData()) { - indexMapBack_->CovertToIndexMap(); - remove = true; - } - const auto &threadQueue = dataCache_->GetConstThreadData(); - auto size = threadQueue.size(); - switch (op) { - case SQLITE_INDEX_CONSTRAINT_EQ: - if (remove) { - for (auto i = indexMapBack_->rowIndex_.begin(); i != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*i].tid_ != value) { - i = indexMapBack_->rowIndex_.erase(i); - } else { - i++; - } - } - } else { - for (auto i = 0; i < size; i++) { - if (threadQueue[i].tid_ == value) { - indexMapBack_->rowIndex_.push_back(i); - } - } - } - indexMapBack_->FixSize(); - break; - case SQLITE_INDEX_CONSTRAINT_ISNOT: - case SQLITE_INDEX_CONSTRAINT_NE: - if (remove) { - for (auto i = indexMapBack_->rowIndex_.begin(); i != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*i].tid_ == value) { - i = indexMapBack_->rowIndex_.erase(i); - } else { - i++; - } - } - } else { - for (auto i = 0; i < size; i++) { - if (threadQueue[i].tid_ != value) { - indexMapBack_->rowIndex_.push_back(i); - } - } - } - indexMapBack_->FixSize(); - break; - default: - break; - } // end of switch (op) -} -void ThreadTable::Cursor::FilterIpid(unsigned char op, uint64_t value) -{ - bool isRemove = false; - if (indexMapBack_->HasData()) { - indexMapBack_->CovertToIndexMap(); - isRemove = true; - } - const auto &threadQueue = dataCache_->GetConstThreadData(); - auto thdQueueSize = threadQueue.size(); - rowIndexBak_.clear(); - bool changed = false; - switch (op) { - case SQLITE_INDEX_CONSTRAINT_EQ: - HandleIpidConstraint(isRemove, changed, value, thdQueueSize, threadQueue); - break; - case SQLITE_INDEX_CONSTRAINT_ISNULL: - HandleIpidConstraint(isRemove, changed, INVALID_UINT32, thdQueueSize, threadQueue); - break; - case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: - HandleIpidConstraint(threadQueue, thdQueueSize, isRemove, changed); - break; - default: - break; - } // end of switch (op) -} -void ThreadTable::Cursor::HandleIpidConstraint(const std::deque &threadQueue, - std::size_t size, - bool remove, - bool changed) -{ - if (remove) { - for (auto i = indexMapBack_->rowIndex_.begin(); i != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*i].internalPid_ == INVALID_UINT32) { - i++; - } else { - changed = true; - rowIndexBak_.push_back(*i); - i++; - } - } - if (changed) { - indexMapBack_->rowIndex_ = rowIndexBak_; - } - } else { - for (auto i = 0; i < size; i++) { - if (threadQueue[i].internalPid_ != INVALID_UINT32) { - indexMapBack_->rowIndex_.push_back(i); - } - } - } - indexMapBack_->FixSize(); -} -void ThreadTable::Cursor::FilterSwitchCount(unsigned char op, uint64_t value) -{ - bool remove = false; - if (indexMapBack_->HasData()) { - indexMapBack_->CovertToIndexMap(); - remove = true; - } - const auto &threadQueue = dataCache_->GetConstThreadData(); - auto size = threadQueue.size(); - rowIndexBak_.clear(); - bool changed = false; - switch (op) { - case SQLITE_INDEX_CONSTRAINT_EQ: - HandleIpidConstraint(remove, changed, value, size, threadQueue); - break; - case SQLITE_INDEX_CONSTRAINT_ISNULL: - HandleIpidConstraint(remove, changed, value, size, threadQueue); - break; - case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: - if (remove) { - for (auto i = indexMapBack_->rowIndex_.begin(); i != indexMapBack_->rowIndex_.end();) { - if (threadQueue[*i].switchCount_ == INVALID_UINT32) { - i++; - } else { - changed = true; - rowIndexBak_.push_back(*i); - i++; - } - } - if (changed) { - indexMapBack_->rowIndex_ = rowIndexBak_; - } - } else { - for (auto i = 0; i < size; i++) { - if (threadQueue[i].switchCount_ != INVALID_UINT32) { - indexMapBack_->rowIndex_.push_back(i); - } - } - } - indexMapBack_->FixSize(); - break; - default: - break; - } // end of switch (op) -} -void ThreadTable::Cursor::FilterIndex(int32_t col, unsigned char op, sqlite3_value *argv) -{ - switch (static_cast(col)) { - case Index::INTERNAL_PID: - FilterIpid(op, static_cast(sqlite3_value_int64(argv))); - break; - case Index::TID: - FilterTid(op, static_cast(sqlite3_value_int64(argv))); - break; - case Index::SWITCH_COUNT: - FilterSwitchCount(op, static_cast(sqlite3_value_int64(argv))); - break; - default: - // we can't filter all rows - break; - } -} + int32_t ThreadTable::Cursor::Filter(const FilterConstraints &fc, sqlite3_value **argv) { // reset indexMapBack_ @@ -255,11 +91,6 @@ int32_t ThreadTable::Cursor::Filter(const FilterConstraints &fc, sqlite3_value * case Index::ITID: FilterId(c.op, argv[c.idxInaConstraint]); break; - case Index::TID: - case Index::INTERNAL_PID: - case Index::SWITCH_COUNT: - FilterIndex(c.col, c.op, argv[c.idxInaConstraint]); - break; default: break; } @@ -325,7 +156,6 @@ int32_t ThreadTable::Cursor::Column(int32_t col) const sqlite3_result_int(context_, thread.switchCount_); break; } - default: TS_LOGF("Unregistered column : %d", col); break; @@ -341,30 +171,6 @@ void ThreadTable::Cursor::SetNameColumn(const Thread &thread) const } } -int32_t ThreadTable::Update(int32_t argc, sqlite3_value **argv, sqlite3_int64 *pRowid) -{ - if (argc <= 1) { - return SQLITE_READONLY; - } - if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { - return SQLITE_READONLY; - } - auto id = sqlite3_value_int64(argv[0]); - auto thread = wdataCache_->GetThreadData(static_cast(id)); - constexpr int32_t colOffset = 2; - for (auto i = colOffset; i < argc; i++) { - auto col = i - colOffset; - if (static_cast(col) != Index::INTERNAL_PID) { - continue; - } - auto ipid = static_cast(sqlite3_value_int(argv[i])); - if (ipid) { - thread->internalPid_ = ipid; - } - break; - } - return SQLITE_OK; -} void ThreadTable::Cursor::FilterId(unsigned char op, sqlite3_value *argv) { auto type = sqlite3_value_type(argv); diff --git a/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp index 0ee9d62b4..a6348cdc0 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp @@ -117,6 +117,7 @@ void DataDict::Finish() DataSourceClockIdData::DataSourceClockIdData() : dataSource2ClockIdMap_({{DATA_SOURCE_TYPE_TRACE, TS_CLOCK_UNKNOW}, + {DATA_SOURCE_TYPE_FFRT, TS_CLOCK_UNKNOW}, {DATA_SOURCE_TYPE_MEM, TS_CLOCK_UNKNOW}, {DATA_SOURCE_TYPE_HILOG, TS_CLOCK_UNKNOW}, {DATA_SOURCE_TYPE_NATIVEHOOK, TS_CLOCK_UNKNOW}, @@ -129,6 +130,7 @@ DataSourceClockIdData::DataSourceClockIdData() {DATA_SOURCE_TYPE_JSMEMORY, TS_CLOCK_UNKNOW}}), dataSource2PluginNameMap_({ {DATA_SOURCE_TYPE_TRACE, "ftrace-plugin"}, + {DATA_SOURCE_TYPE_FFRT, "ffrt-profiler"}, {DATA_SOURCE_TYPE_MEM, "memory-plugin"}, {DATA_SOURCE_TYPE_HILOG, "hilog-plugin"}, {DATA_SOURCE_TYPE_NATIVEHOOK, "nativehook"}, diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp index 6549be610..c52b4edc6 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp @@ -65,36 +65,20 @@ void CallStack::SetDistributeInfo(size_t index, const std::string &chainId, const std::string &spanId, const std::string &parentSpanId, - const std::string &flag, - const std::string &args) + const std::string &flag) { chainIds_[index] = chainId; spanIds_[index] = spanId; parentSpanIds_[index] = parentSpanId; flags_[index] = flag; - args_[index] = args; argSet_[index] = INVALID_UINT32; } -void CallStack::AppendDistributeInfo(const std::string &chainId, - const std::string &spanId, - const std::string &parentSpanId, - const std::string &flag, - const std::string &args) -{ - chainIds_.emplace_back(chainId); - spanIds_.emplace_back(spanId); - parentSpanIds_.emplace_back(parentSpanId); - flags_.emplace_back(flag); - args_.emplace_back(args); - argSet_.emplace_back(INVALID_UINT32); -} void CallStack::AppendDistributeInfo() { chainIds_.emplace_back(""); spanIds_.emplace_back(""); parentSpanIds_.emplace_back(""); flags_.emplace_back(""); - args_.emplace_back(""); argSet_.emplace_back(INVALID_UINT32); } void CallStack::SetDuration(size_t index, uint64_t timeStamp) @@ -174,10 +158,6 @@ const std::deque &CallStack::Flags() const { return flags_; } -const std::deque &CallStack::ArgsData() const -{ - return args_; -} const std::deque &CallStack::ArgSetIdsData() const { return argSet_; diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h index 4edddb78e..65232931f 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h @@ -41,13 +41,7 @@ public: const std::string &chainId, const std::string &spanId, const std::string &parentSpanId, - const std::string &flag, - const std::string &args); - void AppendDistributeInfo(const std::string &chainId, - const std::string &spanId, - const std::string &parentSpanId, - const std::string &flag, - const std::string &args); + const std::string &flag); void AppendDistributeInfo(); void SetDuration(size_t index, uint64_t timeStamp); void SetDurationWithFlag(size_t index, uint64_t timeStamp); @@ -70,13 +64,12 @@ public: spanIds_.clear(); parentSpanIds_.clear(); flags_.clear(); - args_.clear(); argSet_.clear(); } void ClearExportedData() override { EraseElements(timeStamps_, ids_, durs_, cats_, cookies_, callIds_, names_, depths_, chainIds_, spanIds_, - parentSpanIds_, flags_, args_, argSet_); + parentSpanIds_, flags_, argSet_); } const std::deque> &ParentIdData() const; const std::deque &CatsData() const; @@ -88,7 +81,6 @@ public: const std::deque &SpanIds() const; const std::deque &ParentSpanIds() const; const std::deque &Flags() const; - const std::deque &ArgsData() const; const std::deque &ArgSetIdsData() const; private: @@ -107,7 +99,6 @@ private: std::deque spanIds_ = {}; std::deque parentSpanIds_ = {}; std::deque flags_ = {}; - std::deque args_ = {}; std::deque argSet_ = {}; }; } // namespace TraceStdtype diff --git a/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.cpp index dcab9eec1..ca819b1e6 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.cpp @@ -52,24 +52,19 @@ const std::deque &JsHeapFiles::SelfSizeCount() const return selfSizeCount_; } -size_t JsHeapEdges::AppendNewData(uint32_t fileId, - uint32_t edgeIndex, - uint32_t type, - uint32_t nameOrIndex, - uint32_t toNode, - uint32_t fromNodeId, - uint32_t toNodeId) -{ - fileIds_.emplace_back(fileId); - edgeIndexs_.emplace_back(edgeIndex); - types_.emplace_back(type); - nameOrIndexs_.emplace_back(nameOrIndex); - toNodes_.emplace_back(toNode); - fromNodeIds_.emplace_back(fromNodeId); - toNodeIds_.emplace_back(toNodeId); +size_t JsHeapEdges::AppendNewData(const JsHeapEdgesRow &jsHeapEdgesRow) +{ + fileIds_.emplace_back(jsHeapEdgesRow.fileId); + edgeIndexs_.emplace_back(jsHeapEdgesRow.edgeIndex); + types_.emplace_back(jsHeapEdgesRow.type); + nameOrIndexs_.emplace_back(jsHeapEdgesRow.nameOrIndex); + toNodes_.emplace_back(jsHeapEdgesRow.toNode); + fromNodeIds_.emplace_back(jsHeapEdgesRow.fromNodeId); + toNodeIds_.emplace_back(jsHeapEdgesRow.toNodeId); ids_.emplace_back(Size()); return Size() - 1; } + const std::deque &JsHeapEdges::FileIds() const { return fileIds_; @@ -169,25 +164,17 @@ const std::deque &JsHeapLocation::Columns() const return columns_; } -size_t JsHeapNodes::AppendNewData(uint32_t fileId, - uint32_t nodeIndex, - uint32_t type, - uint32_t name, - uint32_t id, - uint32_t selfSize, - uint32_t edgeCount, - uint32_t traceNodeId, - uint32_t detachedNess) -{ - fileIds_.emplace_back(fileId); - nodeIndexs_.emplace_back(nodeIndex); - types_.emplace_back(type); - names_.emplace_back(name); - nodeIds_.emplace_back(id); - selfSizes_.emplace_back(selfSize); - edgeCounts_.emplace_back(edgeCount); - traceNodeIds_.emplace_back(traceNodeId); - detachedNess_.emplace_back(detachedNess); +size_t JsHeapNodes::AppendNewData(const JsHeapNodesRow &jsHeapNodesRow) +{ + fileIds_.emplace_back(jsHeapNodesRow.fileId); + nodeIndexs_.emplace_back(jsHeapNodesRow.nodeIndex); + types_.emplace_back(jsHeapNodesRow.type); + names_.emplace_back(jsHeapNodesRow.name); + nodeIds_.emplace_back(jsHeapNodesRow.id); + selfSizes_.emplace_back(jsHeapNodesRow.selfSize); + edgeCounts_.emplace_back(jsHeapNodesRow.edgeCount); + traceNodeIds_.emplace_back(jsHeapNodesRow.traceNodeId); + detachedNess_.emplace_back(jsHeapNodesRow.detachedNess); ids_.emplace_back(Size()); return Size() - 1; } @@ -270,23 +257,16 @@ const std::deque &JsHeapString::Strings() const return strings_; } -size_t JsHeapTraceFuncInfo::AppendNewData(uint32_t fileId, - uint32_t functionIndex, - uint32_t functionId, - uint32_t name, - uint32_t scriptName, - uint32_t scriptId, - uint32_t line, - uint32_t column) -{ - fileIds_.emplace_back(fileId); - functionIndexs_.emplace_back(functionIndex); - functionIds_.emplace_back(functionId); - names_.emplace_back(name); - scriptNames_.emplace_back(scriptName); - scriptIds_.emplace_back(scriptId); - lines_.emplace_back(line); - columns_.emplace_back(column); +size_t JsHeapTraceFuncInfo::AppendNewData(const JsHeapTraceFuncRow &jsHeapTraceFuncRow) +{ + fileIds_.emplace_back(jsHeapTraceFuncRow.fileId); + functionIndexs_.emplace_back(jsHeapTraceFuncRow.functionIndex); + functionIds_.emplace_back(jsHeapTraceFuncRow.functionId); + names_.emplace_back(jsHeapTraceFuncRow.name); + scriptNames_.emplace_back(jsHeapTraceFuncRow.scriptName); + scriptIds_.emplace_back(jsHeapTraceFuncRow.scriptId); + lines_.emplace_back(jsHeapTraceFuncRow.line); + columns_.emplace_back(jsHeapTraceFuncRow.column); ids_.emplace_back(Size()); return Size() - 1; } @@ -322,20 +302,14 @@ const std::deque &JsHeapTraceFuncInfo::Columns() const { return columns_; } - -size_t JsHeapTraceNode::AppendNewData(uint32_t fileId, - uint32_t traceNodeId, - uint32_t functionInfoIndex, - uint32_t count, - uint32_t size, - int32_t parentId) +size_t JsHeapTraceNode::AppendNewData(const JsHeapTraceNodeRow &jsHeapTraceNodeRow) { - fileIds_.emplace_back(fileId); - traceNodeIds_.emplace_back(traceNodeId); - functionInfoIndexs_.emplace_back(functionInfoIndex); - counts_.emplace_back(count); - sizes_.emplace_back(size); - parentIds_.emplace_back(parentId); + fileIds_.emplace_back(jsHeapTraceNodeRow.fileId); + traceNodeIds_.emplace_back(jsHeapTraceNodeRow.traceNodeId); + functionInfoIndexs_.emplace_back(jsHeapTraceNodeRow.functionInfoIndex); + counts_.emplace_back(jsHeapTraceNodeRow.count); + sizes_.emplace_back(jsHeapTraceNodeRow.size); + parentIds_.emplace_back(jsHeapTraceNodeRow.parentId); ids_.emplace_back(Size()); return Size() - 1; } @@ -363,26 +337,17 @@ const std::deque &JsHeapTraceNode::ParentIds() const { return parentIds_; } - -size_t JsCpuProfilerNode::AppendNewData(uint32_t functionId, - uint32_t functionName, - std::string scriptId, - uint32_t url, - uint32_t lineNumber, - uint32_t columnNumber, - uint32_t hitCount, - std::string children, - uint32_t parent) -{ - functionIds_.emplace_back(functionId); - functionNames_.emplace_back(functionName); - scriptIds_.emplace_back(scriptId); - urls_.emplace_back(url); - lineNumbers_.emplace_back(lineNumber); - columnNumbers_.emplace_back(columnNumber); - hitCounts_.emplace_back(hitCount); - children_.emplace_back(children); - parents_.emplace_back(parent); +size_t JsCpuProfilerNode::AppendNewData(const JsCpuProfilerNodeRow &jsCpuProfilerNodeRow) +{ + functionIds_.emplace_back(jsCpuProfilerNodeRow.functionId); + functionNames_.emplace_back(jsCpuProfilerNodeRow.functionName); + scriptIds_.emplace_back(jsCpuProfilerNodeRow.scriptId); + urls_.emplace_back(jsCpuProfilerNodeRow.url); + lineNumbers_.emplace_back(jsCpuProfilerNodeRow.lineNumber); + columnNumbers_.emplace_back(jsCpuProfilerNodeRow.columnNumber); + hitCounts_.emplace_back(jsCpuProfilerNodeRow.hitCount); + children_.emplace_back(jsCpuProfilerNodeRow.children); + parents_.emplace_back(jsCpuProfilerNodeRow.parent); ids_.emplace_back(Size()); return Size() - 1; } @@ -449,22 +414,15 @@ const std::deque &JsCpuProfilerSample::Durs() const { return durs_; } - -size_t JsConfig::AppendNewData(uint32_t pid, - uint64_t type, - uint32_t interval, - uint32_t captureNumericValue, - uint32_t trackAllocation, - uint32_t cpuProfiler, - uint32_t cpuProfilerInterval) -{ - pids_.emplace_back(pid); - types_.emplace_back(type); - intervals_.emplace_back(interval); - captureNumericValues_.emplace_back(captureNumericValue); - trackAllocations_.emplace_back(trackAllocation); - cpuProfilers_.emplace_back(cpuProfiler); - cpuProfilerIntervals_.emplace_back(cpuProfilerInterval); +size_t JsConfig::AppendNewData(const JsConfigRow &jsConfigRow) +{ + pids_.emplace_back(jsConfigRow.pid); + types_.emplace_back(jsConfigRow.type); + intervals_.emplace_back(jsConfigRow.interval); + captureNumericValues_.emplace_back(jsConfigRow.captureNumericValue); + trackAllocations_.emplace_back(jsConfigRow.trackAllocation); + cpuProfilers_.emplace_back(jsConfigRow.cpuProfiler); + cpuProfilerIntervals_.emplace_back(jsConfigRow.cpuProfilerInterval); ids_.emplace_back(Size()); return Size() - 1; } diff --git a/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.h index 17fd3f68b..d3da64893 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype/htrace/arkts_stdtype.h @@ -48,16 +48,18 @@ private: std::deque endTimes_ = {}; std::deque selfSizeCount_ = {}; }; - +struct JsHeapEdgesRow { + uint32_t fileId = INVALID_UINT32; + uint32_t edgeIndex = INVALID_UINT32; + uint32_t type = INVALID_UINT32; + uint32_t nameOrIndex = INVALID_UINT32; + uint32_t toNode = INVALID_UINT32; + uint32_t fromNodeId = INVALID_UINT32; + uint32_t toNodeId = INVALID_UINT32; +}; class JsHeapEdges : public CacheBase { public: - size_t AppendNewData(uint32_t fileId, - uint32_t edgeIndex, - uint32_t type, - uint32_t nameOrIndex, - uint32_t toNode, - uint32_t fromNodeId, - uint32_t toNodeId); + size_t AppendNewData(const JsHeapEdgesRow &jsHeapEdgesRow); const std::deque &FileIds() const; const std::deque &EdgeIndexs() const; const std::deque &Types() const; @@ -139,17 +141,20 @@ private: std::deque columns_ = {}; }; +struct JsHeapNodesRow { + uint32_t fileId = INVALID_UINT32; + uint32_t nodeIndex = INVALID_UINT32; + uint32_t type = INVALID_UINT32; + uint32_t name = INVALID_UINT32; + uint32_t id = INVALID_UINT32; + uint32_t selfSize = INVALID_UINT32; + uint32_t edgeCount = INVALID_UINT32; + uint32_t traceNodeId = INVALID_UINT32; + uint32_t detachedNess = INVALID_UINT32; +}; class JsHeapNodes : public CacheBase { public: - size_t AppendNewData(uint32_t fileId, - uint32_t nodeIndex, - uint32_t type, - uint32_t name, - uint32_t id, - uint32_t selfSize, - uint32_t edgeCount, - uint32_t traceNodeId, - uint32_t detachedNess); + size_t AppendNewData(const JsHeapNodesRow &jsHeapNodesRow); const std::deque &FileIds() const; const std::deque &NodeIndexs() const; const std::deque &Types() const; @@ -225,16 +230,19 @@ private: std::deque strings_ = {}; }; +struct JsHeapTraceFuncRow { + uint32_t fileId = INVALID_UINT32; + uint32_t functionIndex = INVALID_UINT32; + uint32_t functionId = INVALID_UINT32; + uint32_t name = INVALID_UINT32; + uint32_t scriptName = INVALID_UINT32; + uint32_t scriptId = INVALID_UINT32; + uint32_t line = INVALID_UINT32; + uint32_t column = INVALID_UINT32; +}; class JsHeapTraceFuncInfo : public CacheBase { public: - size_t AppendNewData(uint32_t fileId, - uint32_t functionIndex, - uint32_t functionId, - uint32_t name, - uint32_t scriptName, - uint32_t scriptId, - uint32_t line, - uint32_t column); + size_t AppendNewData(const JsHeapTraceFuncRow &jsHeapTraceFuncRow); const std::deque &FileIds() const; const std::deque &FunctionIndexs() const; const std::deque &FunctionIds() const; @@ -266,15 +274,17 @@ private: std::deque lines_ = {}; std::deque columns_ = {}; }; - +struct JsHeapTraceNodeRow { + uint32_t fileId = INVALID_UINT32; + uint32_t traceNodeId = INVALID_UINT32; + uint32_t functionInfoIndex = INVALID_UINT32; + uint32_t count = INVALID_UINT32; + uint32_t size = INVALID_UINT32; + int32_t parentId = INVALID_INT32; +}; class JsHeapTraceNode : public CacheBase { public: - size_t AppendNewData(uint32_t fileId, - uint32_t traceNodeId, - uint32_t functionInfoIndex, - uint32_t count, - uint32_t size, - int32_t parentId); + size_t AppendNewData(const JsHeapTraceNodeRow &jsHeapTraceNodeRow); const std::deque &FileIds() const; const std::deque &TraceNodeIDs() const; const std::deque &FunctionInfoIndexs() const; @@ -300,16 +310,18 @@ private: std::deque sizes_ = {}; std::deque parentIds_ = {}; }; - +struct JsConfigRow { + uint32_t pid = INVALID_UINT32; + uint64_t type = INVALID_UINT64; + uint32_t interval = INVALID_UINT32; + uint32_t captureNumericValue = INVALID_UINT32; + uint32_t trackAllocation = INVALID_UINT32; + uint32_t cpuProfiler = INVALID_UINT32; + uint32_t cpuProfilerInterval = INVALID_UINT32; +}; class JsConfig : public CacheBase { public: - size_t AppendNewData(uint32_t pid, - uint64_t type, - uint32_t interval, - uint32_t captureNumericValue, - uint32_t trackAllocation, - uint32_t cpuProfiler, - uint32_t cpuProfilerInterval); + size_t AppendNewData(const JsConfigRow &jsConfigRow); const std::deque &Pids() const; const std::deque &Types() const; const std::deque &Intervals() const; @@ -338,18 +350,20 @@ private: std::deque cpuProfilers_ = {}; std::deque cpuProfilerIntervals_ = {}; }; - +struct JsCpuProfilerNodeRow { + uint32_t functionId = INVALID_UINT32; + uint32_t functionName = INVALID_UINT32; + std::string scriptId = ""; + uint32_t url = INVALID_UINT32; + uint32_t lineNumber = INVALID_UINT32; + uint32_t columnNumber = INVALID_UINT32; + uint32_t hitCount = INVALID_UINT32; + std::string children = ""; + uint32_t parent = INVALID_UINT32; +}; class JsCpuProfilerNode : public CacheBase { public: - size_t AppendNewData(uint32_t functionId, - uint32_t functionName, - std::string scriptId, - uint32_t url, - uint32_t lineNumber, - uint32_t columnNumber, - uint32_t hitCount, - std::string children, - uint32_t parent); + size_t AppendNewData(const JsCpuProfilerNodeRow &jsCpuProfilerNodeRow); const std::deque &FunctionIds() const; const std::deque &FunctionNames() const; const std::deque &ScriptIds() const; diff --git a/trace_streamer/src/trace_streamer/trace_streamer_selector.h b/trace_streamer/src/trace_streamer/trace_streamer_selector.h index 51a5b297a..c34ba7246 100644 --- a/trace_streamer/src/trace_streamer/trace_streamer_selector.h +++ b/trace_streamer/src/trace_streamer/trace_streamer_selector.h @@ -67,7 +67,7 @@ public: void UpdateHMKernelTraceStatus(bool status); void InitMetricsMap(std::map &metricsMap); const std::string MetricsSqlQuery(const std::string &metrics); - auto GetBytraceData() + auto GetPtreaderParser() { return ptreaderParser_.get(); } @@ -77,7 +77,7 @@ public: return rawTraceParser_.get(); } #endif - auto GetHtraceData() + auto GetPbreaderParser() { return pbreaderParser_.get(); } diff --git a/trace_streamer/src/version.cpp b/trace_streamer/src/version.cpp index c30eff2f4..26280280a 100644 --- a/trace_streamer/src/version.cpp +++ b/trace_streamer/src/version.cpp @@ -17,7 +17,7 @@ namespace SysTuning { namespace TraceStreamer { size_t g_loadSize = 0; size_t g_fileSize = 0; -const std::string TRACE_STREAMER_VERSION = "4.0.5"; // version -const std::string TRACE_STREAMER_PUBLISH_VERSION = "2024/03/15"; // publish datetime +const std::string TRACE_STREAMER_VERSION = "4.1.1"; // version +const std::string TRACE_STREAMER_PUBLISH_VERSION = "2024/04/22"; // publish datetime } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/test/BUILD.gn b/trace_streamer/test/BUILD.gn index 917347abe..e05211d4c 100644 --- a/trace_streamer/test/BUILD.gn +++ b/trace_streamer/test/BUILD.gn @@ -53,6 +53,7 @@ if (is_test) { "unittest/pbreader_parser/htrace_irq_event_test.cpp", "unittest/pbreader_parser/native_memory/native_hook_parser_test.cpp", "unittest/pbreader_parser/pbreader_cpu_data_parser_test.cpp", + "unittest/pbreader_parser/pbreader_ffrt_parser_test.cpp", "unittest/pbreader_parser/pbreader_mem_parser_test.cpp", "unittest/pbreader_parser/pbreader_network_parser_test.cpp", "unittest/pbreader_parser/pbreader_process_parser_test.cpp", @@ -75,6 +76,7 @@ if (is_test) { "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/smartperf_host:ts_all_sph_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/cpu_data:ts_cpu_data_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/diskio_data:ts_diskio_data_cpp", + "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ffrt_profiler:ts_ffrt_profiler_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ftrace_data/${device_kernel_version}:ts_ftrace_data_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/hidump_data:ts_hidump_data_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/hilog_data:ts_hilog_data_cpp", diff --git a/trace_streamer/test/resource/pbreader_ffrt.htrace b/trace_streamer/test/resource/pbreader_ffrt.htrace new file mode 100644 index 0000000000000000000000000000000000000000..ce94b2aff53b745673c82b4b1c08f9211ff3740c GIT binary patch literal 14330 zcmeI3TTm2N8pr8uj0uUAY)tLeT3fZ&KILIID;Te}4;zxDl1;Wu8B@tac3Gpal}c7p zN~*TDs4YOnk-N<>45-Lm?jVGV$Z!*f5#;J9BBG$kRYpKS1cdFz`JZz-)12vf+C0Pu zvF7{t|D5xEzpu}kZrt_$u1`MRy~}%ko16WQ;1(nO>o>+L|IHI;Y+=9L7q@dy{DZlj zx~l8@-+S%X|M80bUFjdIWbyfn$%h7{pMSX7XiWCL@y7Z6hLxZ1v_Jd&SD*T?#AiM~ zv+`5E=Ev|SCTZQC=Y9+m`DqS6W#Ipuft}L$?r-?{9Sr#Ww+H?GzWT=ZpwB-41Abrq zbHi_6|AqXy5BWU6_fUY3@4tOF3U3Al37ghz7yRU_*D0>v`Mk$ln>=50+fWr0%9>4LXLGc$hci-+JW__kNM54+ zk?^|Uwb5bqeHHLN@omj%i53hT-v_d9rrmeEMQ>k$S1jY}{_a8Fy#c;^ z_8$7${j^{=CtR%&a`NHCp(HGqY6bA~IZY z&S{t_hTBd2qMIbY4>*2jWIs$UeKrMtYLh#Y{U}=a3&$*3HajW(B^TZlT(Dv`x_;-& zyFT&p_TIh6$J1vMnc8&SbhKa;+*ZZN79zQ!xYSKqT-i3jGjQ{t+>`9%wp=cYL z>x$9$tb~WwE7wJ!B~!Y7{x+0~DXCz1GPe&>y1wUG3`cL@g@TzhsZGJ%Qc?JVQ|V&4 z()sp`FO3htY=tCy?ie!yzvNPwM^vCNi+SN zGt&ZT1ov$F$Pu;~m>HOn*U2OA`Yzzv&?L+Kc@?5i%jp2aVaXfKc~n0KZ)Tz-d^mWX z7rr&NpcclBD=l;hVFfX}iGNOQ@ZX-@$GzC$!EvST2*T<&U&3*1R4A0rI5z8bkkVPL zVL8q+hC#v33S^d*M%;xN-v(|W zzNcd@h(a@`AyU|e2p&j;FEdH9hMv|_yzuz1s3-2 zvo^v;(X3>a!fCX}?2Wj%qZnoyaPJaJp=O3AXOFqya)cGd2Ebd%BxB4b7gpRqQvqLQ zSYp=wNHWvh4I%d{Rm?~?q*<$Y;n@CawJ>ncY^+6CkpV~CYt8jgI>UXUx&cy(`&t(F zghn$IOoGU{qj}hZutwa2hOXcWO}H29+Mr(*camardP@>r)E@_sH102rDw+i2Fms0F=&f&o>T2N^yUY#l1IX z7z!qx1oy`LQG_+(o|yFjS7^dLvDyZ`bKJw4Cm?2Livven)fB=S0PZSnZ~>M3)6?)~ zh9=x4K9bCwb_0q%cXJkIiedxz?Sz_yra35?VM%y+>WNC2%&MgNk_$`hk6hrHCEFx3 z&E3#ySyVA24L@&tim)OBj<|>AEko%H_u<~4zuUhrP~2Z)agWr8K*6RHhne{P!w74{ zy)WS?uF!=0=wK-H&T${i(Lv147Px0N9Y=U|+zBd;=fk09%m^wyryE^3U*8^#fSICv z0C)%SwX{gS$2i+WFS||jB}T!QnIu_5a%D6x+}R$Z5++kg&|6&ShR_(1XI4`qnGJIG zhAMe)K*J}@#==aIFGt)hwm2xA;ePIJJfswNcNX`)n+Z^`=>+a)XHFul5%;d~)3`zt z?)M{-p?8jZaeOMo>}-L1ct|?J8gL(}&V-sZ!vofi;w*#}X$HU^^r7Lv%w-p_sm#oQ zF*7blY?Qmi#pBK)EEK&)RsVt93Q_=j5din7=n5h#?d@sj0i$V{l zGtSAKfkK#`l)zU}2$e^SmmiiwN_l^o<=rq}4h55Za+^) z%ronGDw#PwHmwv(dc2>})}mrYCZ2PxO)ZRj@R8aMgq;w4Vz5;dKIQCL@>60$@Iuv9 z_$pFM2`0I-rnQMe8>clg4pB(rfH%z^md35)DrV%&Q9t((VRhaK!Iq^-C>6<4A-JMl znxW>Gh1TguFs1~rlL#j1%LwWeg)5wnNR>MRwJ4jLfgf8coM*aY<`CA%dtUfFuF%B0 z?#v?e&Uuf_Sb~_HEqD(XgM94YRy6RQ(i8$UYX;s+ijE+xC?Vl}Gf84iW+k3edxm7`TOCQcz%pjKu_-Q&-t_ zglU4L_hj_#-K9wz6s!R_TP~a8g*(qptA$Z)L&0N&6*sq)V!s`@g%&$9_X(7=*lQHU zUMgRJM6nk7Za#bDDHP7ich8Wj*Zv+`9~$%z`6eJi%P$|n<4&98@ASxoVy9+=z~8ah zTS>9ch({n}YlUKG7()@J36kCt(O>$QOH9*ifA2EeWPl$t99d$WMKW{R0RU+%J3+;a zEG@C(v|1P-4WuU{>jvAl++EheVMl3X-)q6N*(pBAs10nFT2y z4R;iKHar(sI2M~eLJtYahm6TSId*=ZR){cNg!GPtcJ^|c2@1x5l&?8C(*+iqs%m*= zXU9$A{ zfr8Z8-wy?AK&p9ZfEOMv98?RVv*Sxf5Oyr~w!rPQ*tgQhprplqQPJ7ih2xMY)>O(kjWk~v2YY&$7=5gWF8EcrWeNvf8{i$oOJR#qNY$C zd?_35iXG)deo35Q;xHd8Gmjd~#D~F9Q3Fa+W@Q`{&PWo2jF4(1sUam1SE!IgA15A< zJp~<8TC$3$gd~LNDx`t-E8inLHU)Zk zkOKCN)j&!M__CsaP2pp4+K&XHtsRDnrPDp7|KbsYP{<+dXs`qX){@h96@H4f(C?V! z#u2r64N{HezHPgSD^$wuNm@0eB-Eh2@1urp!Ih~kF*|u&XK+qr6`?$ zG7beZ9Jwpww^E?X%y4C`zv=_6cixI3$Y2 z(C$vGiG)Hio=UmR6VZ@rEcb{`#1$&#rVo=sEoIO#86^e0cWcm~y&-zWDqu#}EIlry zyUNLXLk8_{ljAZkz>k?6Dfe={i5IqI)~JNZ(h91F4cedoOwHWgZ?CwbSkK__4D{Gc zjLlg_qi}`O^r>>w1^C6B#N|Bl%{6KpisD=cr1gxi M{EwQFsN5vsf1;$$UH||9 literal 0 HcmV?d00001 diff --git a/trace_streamer/test/unittest/filter/task_pool_filter_test.cpp b/trace_streamer/test/unittest/filter/task_pool_filter_test.cpp index 35da2ff7c..7717739c6 100644 --- a/trace_streamer/test/unittest/filter/task_pool_filter_test.cpp +++ b/trace_streamer/test/unittest/filter/task_pool_filter_test.cpp @@ -53,20 +53,8 @@ HWTEST_F(TaskPoolFilterTest, CheckTheSameTaskTest, TestSize.Level1) } class TaskPoolData { public: - TaskPoolData(InternalTid expectAllocationItid, - InternalTid expectExecuteItid, - InternalTid expectReturnItid, - uint64_t taskId, - uint32_t priority, - uint32_t executeState, - uint32_t returnState) - : expectAllocationItid_(expectAllocationItid), - expectExecuteItid_(expectExecuteItid), - expectReturnItid_(expectReturnItid), - taskId_(taskId), - priority_(priority), - executeState_(executeState), - returnState_(returnState){}; + TaskPoolData(uint64_t taskId, uint32_t priority, uint32_t executeState, uint32_t returnState) + : taskId_(taskId), priority_(priority), executeState_(executeState), returnState_(returnState){}; TaskPoolData(size_t index, const TaskPoolInfo *taskpool) : expectAllocationItid_(taskpool->allocationItids_[index]), expectExecuteItid_(taskpool->executeItids_[index]), @@ -76,11 +64,17 @@ public: executeState_(taskpool->executeStates_[index]), returnState_(taskpool->returnStates_[index]){}; friend bool operator==(const TaskPoolData &first, const TaskPoolData &second); + void InitExpectId(InternalTid expectAllocationItid, InternalTid expectExecuteItid, InternalTid expectReturnItid) + { + expectAllocationItid_ = expectAllocationItid; + expectExecuteItid_ = expectExecuteItid; + expectReturnItid_ = expectReturnItid; + } private: - InternalTid expectAllocationItid_; - InternalTid expectExecuteItid_; - InternalTid expectReturnItid_; + InternalTid expectAllocationItid_ = INVALID_UINT64; + InternalTid expectExecuteItid_ = INVALID_UINT64; + InternalTid expectReturnItid_ = INVALID_UINT64; uint32_t taskId_; uint32_t priority_; uint32_t executeState_; @@ -134,7 +128,8 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest1, TestSize.Level1) printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(1, INVALID_INT32, INVALID_INT32, 9, 1, 1, INVALID_INT32); + TaskPoolData firstExpect(9, 1, 1, INVALID_INT32); + firstExpect.InitExpectId(1, INVALID_INT32, INVALID_INT32); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; @@ -142,14 +137,16 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest1, TestSize.Level1) printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, 1, INVALID_INT32, 9, 1, 1, INVALID_INT32); + TaskPoolData secondExpect(9, 1, 1, INVALID_INT32); + secondExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "H:Task PerformTask End: taskId : 1, executeId : 9, performResult : IsCanceled"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, INVALID_INT32, 9, 1, 1, INVALID_INT32); + TaskPoolData thirdExpect(9, 1, 1, INVALID_INT32); + thirdExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(thirdResult == thirdExpect); } @@ -170,21 +167,24 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest2, TestSize.Level1) PrintEventParser printEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(INVALID_INT32, 1, INVALID_INT32, 1, INVALID_INT32, INVALID_INT32, INVALID_INT32); + TaskPoolData firstExpect(1, INVALID_INT32, INVALID_INT32, INVALID_INT32); + firstExpect.InitExpectId(INVALID_INT32, 1, INVALID_INT32); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; taskPoolStr = "B|16502|H:Task Allocation: taskId : 1, executeId : 1, priority : 1, executeState : 1"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, 1, INVALID_INT32, 1, 1, 1, INVALID_INT32); + TaskPoolData secondExpect(1, 1, 1, INVALID_INT32); + secondExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "B|16502|H:Task PerformTask End: taskId : 1, executeId : 1, performResult : IsCanceled"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, 1, 1, 1, 1, 0); + TaskPoolData thirdExpect(1, 1, 1, 0); + thirdExpect.InitExpectId(1, 1, 1); EXPECT_TRUE(thirdResult == thirdExpect); } @@ -205,21 +205,24 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest3, TestSize.Level1) PrintEventParser printEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(INVALID_INT32, INVALID_INT32, 1, 1, INVALID_INT32, INVALID_INT32, 1); + TaskPoolData firstExpect(1, INVALID_INT32, INVALID_INT32, 1); + firstExpect.InitExpectId(INVALID_INT32, INVALID_INT32, 1); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; taskPoolStr = "B|16502|H:Task Allocation: taskId : 1, executeId : 1, priority : 1, executeState : 1"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, INVALID_INT32, 1, 1, 1, 1, 1); + TaskPoolData secondExpect(1, 1, 1, 1); + secondExpect.InitExpectId(1, INVALID_INT32, 1); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "B|16502|H:Task Perform: taskId : 1, executeId : 1"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, 1, 1, 1, 1, 1); + TaskPoolData thirdExpect(1, 1, 1, 1); + thirdExpect.InitExpectId(1, 1, 1); EXPECT_TRUE(thirdResult == thirdExpect); comm = "TaskWorkThread"; @@ -247,7 +250,8 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest4, TestSize.Level1) printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(1, INVALID_INT32, INVALID_INT32, 544997587840, 1, 1, INVALID_INT32); + TaskPoolData firstExpect(544997587840, 1, 1, INVALID_INT32); + firstExpect.InitExpectId(1, INVALID_INT32, INVALID_INT32); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; @@ -255,14 +259,16 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest4, TestSize.Level1) printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, 1, INVALID_INT32, 544997587840, 1, 1, INVALID_INT32); + TaskPoolData secondExpect(544997587840, 1, 1, INVALID_INT32); + secondExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "H:Task PerformTask End: taskId : 544997587840, performResult : IsCanceled"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, INVALID_INT32, 544997587840, 1, 1, INVALID_INT32); + TaskPoolData thirdExpect(544997587840, 1, 1, INVALID_INT32); + thirdExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(thirdResult == thirdExpect); } @@ -283,22 +289,24 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest5, TestSize.Level1) PrintEventParser printEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(INVALID_INT32, 1, INVALID_INT32, 544997587840, INVALID_INT32, INVALID_INT32, - INVALID_INT32); + TaskPoolData firstExpect(544997587840, INVALID_INT32, INVALID_INT32, INVALID_INT32); + firstExpect.InitExpectId(INVALID_INT32, 1, INVALID_INT32); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; taskPoolStr = "B|8821|H:Task Allocation: taskId : 544997587840, priority : 1, executeState : 1"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, 1, INVALID_INT32, 544997587840, 1, 1, INVALID_INT32); + TaskPoolData secondExpect(544997587840, 1, 1, INVALID_INT32); + secondExpect.InitExpectId(1, 1, INVALID_INT32); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "B|8821|H:Task PerformTask End: taskId : 544997587840, performResult : IsCanceled"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, 1, 544997587840, 1, 1, 0); + TaskPoolData thirdExpect(544997587840, 1, 1, 0); + thirdExpect.InitExpectId(1, 1, 1); EXPECT_TRUE(thirdResult == thirdExpect); } @@ -319,21 +327,24 @@ HWTEST_F(TaskPoolFilterTest, TaskPoolEventTest6, TestSize.Level1) PrintEventParser printEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData firstResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData firstExpect(INVALID_INT32, INVALID_INT32, 1, 544997587840, INVALID_INT32, INVALID_INT32, 1); + TaskPoolData firstExpect(544997587840, INVALID_INT32, INVALID_INT32, 1); + firstExpect.InitExpectId(INVALID_INT32, INVALID_INT32, 1); EXPECT_TRUE(firstResult == firstExpect); comm = "e.myapplication"; taskPoolStr = "B|8821|H:Task Allocation: taskId : 544997587840, priority : 1, executeState : 1"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData secondResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData secondExpect(1, INVALID_INT32, 1, 544997587840, 1, 1, 1); + TaskPoolData secondExpect(544997587840, 1, 1, 1); + secondExpect.InitExpectId(1, INVALID_INT32, 1); EXPECT_TRUE(secondResult == secondExpect); comm = "TaskWorkThread"; taskPoolStr = "B|8821|H:Task Perform: taskId : 544997587840"; printEvent.ParsePrintEvent(comm, ts, pid, taskPoolStr, line); TaskPoolData thirdResult(0, stream_.traceDataCache_->GetTaskPoolData()); - TaskPoolData thirdExpect(1, 1, 1, 544997587840, 1, 1, 1); + TaskPoolData thirdExpect(544997587840, 1, 1, 1); + thirdExpect.InitExpectId(1, 1, 1); EXPECT_TRUE(thirdResult == thirdExpect); comm = "TaskWorkThread"; diff --git a/trace_streamer/test/unittest/interface/split_file_data_test.cpp b/trace_streamer/test/unittest/interface/split_file_data_test.cpp index 45c076915..4fc29d823 100644 --- a/trace_streamer/test/unittest/interface/split_file_data_test.cpp +++ b/trace_streamer/test/unittest/interface/split_file_data_test.cpp @@ -76,12 +76,12 @@ protected: return false; } - auto splitResult = ta->GetHtraceData()->GetEbpfDataParser()->GetEbpfSplitResult(); + auto splitResult = ta->GetPbreaderParser()->GetEbpfDataParser()->GetEbpfSplitResult(); uint64_t headDataSize = 0; - for (const auto &itemHtrace : ta->GetHtraceData()->GetPbreaderSplitData()) { + for (const auto &itemHtrace : ta->GetPbreaderParser()->GetPbreaderSplitData()) { headDataSize += itemHtrace.second; } - auto profilerHeader = ta->GetHtraceData()->GetProfilerHeader(); + auto profilerHeader = ta->GetPbreaderParser()->GetProfilerHeader(); profilerHeader.data.length = PROFILE_HEADER + headDataSize; std::string bufferData(reinterpret_cast(&profilerHeader), sizeof(profilerHeader)); uint64_t dataSize = 0; @@ -93,7 +93,7 @@ protected: auto combinedBuf = std::make_unique(dataSize + PROFILE_HEADER + headDataSize); std::copy(bufferData.begin(), bufferData.end(), combinedBuf.get()); std::streamsize currentOffset = PROFILE_HEADER; - for (const auto &itemHtrace : ta->GetHtraceData()->GetPbreaderSplitData()) { + for (const auto &itemHtrace : ta->GetPbreaderParser()->GetPbreaderSplitData()) { inputFile.seekg(itemHtrace.first); inputFile.read(reinterpret_cast(combinedBuf.get()) + currentOffset, itemHtrace.second); currentOffset += itemHtrace.second; @@ -139,9 +139,9 @@ HWTEST_F(SplitFileDataTest, SplitFileDataByHtraceTest, TestSize.Level1) EXPECT_TRUE(false); } uint64_t dataSize = 0; - auto profilerHeader = ta->GetHtraceData()->GetProfilerHeader(); + auto profilerHeader = ta->GetPbreaderParser()->GetProfilerHeader(); - for (const auto &itemHtrace : ta->GetHtraceData()->GetPbreaderSplitData()) { + for (const auto &itemHtrace : ta->GetPbreaderParser()->GetPbreaderSplitData()) { dataSize += itemHtrace.second; } profilerHeader.data.length = PROFILE_HEADER + dataSize; @@ -149,7 +149,7 @@ HWTEST_F(SplitFileDataTest, SplitFileDataByHtraceTest, TestSize.Level1) std::unique_ptr combinedBuf = std::make_unique(dataSize + PROFILE_HEADER); std::copy(buffer.begin(), buffer.end(), combinedBuf.get()); std::streamsize currentOffset = PROFILE_HEADER; - for (const auto &itemHtrace : ta->GetHtraceData()->GetPbreaderSplitData()) { + for (const auto &itemHtrace : ta->GetPbreaderParser()->GetPbreaderSplitData()) { inputFile.seekg(itemHtrace.first); inputFile.read(reinterpret_cast(combinedBuf.get()) + currentOffset, itemHtrace.second); currentOffset += itemHtrace.second; @@ -181,8 +181,8 @@ HWTEST_F(SplitFileDataTest, SplitFileDataBySystraceTest, TestSize.Level1) ParseData(ta, tracePath); std::unique_ptr ts = std::make_unique(); - EXPECT_TRUE( - ts->ParseTraceDataSegment(std::move(dataBuf_), ta->GetBytraceData()->GetPtreaderSplitData().size(), 1, 1)); + EXPECT_TRUE(ts->ParseTraceDataSegment(std::move(dataBuf_), + ta->GetPtreaderParser()->GetPtreaderSplitData().size(), 1, 1)); } else { EXPECT_TRUE(false); } diff --git a/trace_streamer/test/unittest/pbreader_parser/pbreader_ffrt_parser_test.cpp b/trace_streamer/test/unittest/pbreader_parser/pbreader_ffrt_parser_test.cpp new file mode 100644 index 000000000..a00d58a27 --- /dev/null +++ b/trace_streamer/test/unittest/pbreader_parser/pbreader_ffrt_parser_test.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "export_test.h" +#include "ffrt_profiler_config.pb.h" +#include "pbreader_parser.h" +#include "trace_streamer_selector.h" + +using namespace testing::ext; +using namespace SysTuning::TraceStreamer; + +namespace SysTuning { +namespace TraceStreamer { +class PbreaderFfrtParserTest : public ::testing::Test { +public: + void SetUp() + { + selector_.InitFilter(); + selector_.pbreaderParser_ = + std::make_unique(selector_.GetTraceDataCache(), selector_.GetStreamFilter()); + ffrtDetailParser_ = std::make_unique( + selector_.GetTraceDataCache(), selector_.GetStreamFilter(), + selector_.GetPbreaderParser()->htraceCpuDetailParser_->eventParser_.get()); + } + + void TearDown() {} + +private: + void SetFfrtSrcClockid(FfrtProfilerConfig::ClockId destClockId) + { + PbreaderDataSegment dataSeg; + FfrtProfilerConfig ffrtCfg; + ffrtCfg.set_clock_id(destClockId); + dataSeg.seg = std::make_shared(); + ffrtCfg.SerializeToString(dataSeg.seg.get()); + dataSeg.protoData.data_ = reinterpret_cast(dataSeg.seg->data()); + dataSeg.protoData.size_ = dataSeg.seg->size(); + ffrtDetailParser_->SetFfrtSrcClockid(dataSeg); + EXPECT_EQ(ffrtDetailParser_->ffrtClockid_, destClockId); + } + +public: + SysTuning::TraceStreamer::TraceStreamerSelector selector_ = {}; + std::unique_ptr ffrtDetailParser_; +}; +/** + * @tc.name: SetFfrtSrcClockid + * @tc.desc: Set Ffrt Src Clockid + * @tc.type: FUNC + */ +HWTEST_F(PbreaderFfrtParserTest, SetFfrtSrcClockid, TestSize.Level1) +{ + TS_LOGI("test45-1"); + SetFfrtSrcClockid(FfrtProfilerConfig::BOOTTIME); + SetFfrtSrcClockid(FfrtProfilerConfig::REALTIME); + SetFfrtSrcClockid(FfrtProfilerConfig::REALTIME_COARSE); + SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC); + SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC_COARSE); + SetFfrtSrcClockid(FfrtProfilerConfig::MONOTONIC_RAW); +} +/** + * @tc.name: ParserAll + * @tc.desc: Parser All + * @tc.type: FUNC + */ +HWTEST_F(PbreaderFfrtParserTest, ParserAll, TestSize.Level1) +{ + TS_LOGI("test45-2"); + const std::string ffrtBinPath = "../../test/resource/pbreader_ffrt.htrace"; + EXPECT_TRUE(ParseTraceFile(selector_, ffrtBinPath)); +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp b/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp index 872ee700c..2c5d4a96e 100644 --- a/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp +++ b/trace_streamer/test/unittest/ptreader_parser/event_parser_test.cpp @@ -557,9 +557,8 @@ HWTEST_F(EventParserTest, ParsDistribute, TestSize.Level1) { TS_LOGI("test5-21"); const uint8_t str[] = - "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|[8b00e96b2,2,1]:C$#decodeFrame$#" - "{\"Process\":\"DecodeVideoFrame\",\"frameTimestamp\":37313484466}\n \ - system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n"; + "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|H:[8b00e96b2,2,1]#C##decodeFrame\n" + "system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n"; auto buf = std::make_unique(G_BUF_SIZE); if (memcpy_s(buf.get(), G_BUF_SIZE, str, sizeof(str))) { EXPECT_TRUE(false); @@ -586,12 +585,8 @@ HWTEST_F(EventParserTest, ParsPairsOfDistributeEvent, TestSize.Level1) { TS_LOGI("test5-22"); const uint8_t str[] = - "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|[8b00e96b2,2,1]:C$#decodeFrame$#" - "{\"Process\":\"DecodeVideoFrame\",\"frameTimestamp\":37313484466} \ - system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n" - "startVC-7601 ( 7601) [002] ...1 174330.387420: tracing_mark_write: B|7601|[8b00e96b2,2,1]:S$#startVCFrame$#" - "{\"Process\":\"DecodeVideoFrame\",\"frameTimestamp\":37313484466} \ - startVC-7601 (7601)[002]... 1 174330.487622 : tracing_mark_write : E | 7601 \n"; + "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|H:[8b00e96b2,2,1]#C##decodeFrame\n" + "startVC-7601 ( 7601) [002] ...1 174330.387420: tracing_mark_write: B|7601|H:[8b00e96b2,2,1]#S##startVCFrame\n"; auto buf = std::make_unique(G_BUF_SIZE); if (memcpy_s(buf.get(), G_BUF_SIZE, str, sizeof(str))) { EXPECT_TRUE(false); @@ -622,9 +617,8 @@ HWTEST_F(EventParserTest, ParsDistributeWithNoFlag, TestSize.Level1) { TS_LOGI("test5-23"); const uint8_t str[] = - "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|[8b00e96b2,2,1]$#decodeFrame$#" - "{\"Process\":\"DecodeVideoFrame\",\"frameTimestamp\":37313484466} \ - system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n"; + "system-1298 ( 1298) [001] ...1 174330.287420: tracing_mark_write: B|1298|H:[8b00e96b2,2,1]###decodeFrame\n" + "system - 1298(1298)[001]... 1 174330.287622 : tracing_mark_write : E | 1298 \n"; auto buf = std::make_unique(G_BUF_SIZE); if (memcpy_s(buf.get(), G_BUF_SIZE, str, sizeof(str))) { EXPECT_TRUE(false); -- Gitee