From f25469bb719ff91852858d48b50a4635e8ee35fa Mon Sep 17 00:00:00 2001 From: daishaodong Date: Tue, 14 Jun 2022 12:23:01 +0800 Subject: [PATCH 1/2] native memory and perf Signed-off-by: daishaodong --- host/ide/build.js | 2 + host/ide/package.json | 19 +- host/ide/server/main.go | 25 + host/ide/src/base-ui/button/LitButton.ts | 9 +- host/ide/src/base-ui/checkbox/LitCheckBox.ts | 8 +- .../base-ui/checkbox/LitCheckBoxWithText.ts | 37 +- host/ide/src/base-ui/icon.svg | 2192 ++++++++++++- host/ide/src/base-ui/menu/LitMainMenu.ts | 125 +- host/ide/src/base-ui/menu/LitMainMenuItem.ts | 132 +- host/ide/src/base-ui/popover/LitPopoverV.ts | 110 +- .../base-ui/progress-bar/LitProgressBar.ts | 89 +- host/ide/src/base-ui/radiobox/LitRadioBox.ts | 5 +- host/ide/src/base-ui/select/LitSelect.ts | 1203 +++---- .../ide/src/base-ui/select/LitSelectOption.ts | 74 +- host/ide/src/base-ui/slider/LitSlider.ts | 211 +- host/ide/src/base-ui/switch/lit-switch.ts | 7 +- .../ide/src/base-ui/table/lit-table-column.ts | 14 +- host/ide/src/base-ui/table/lit-table.ts | 519 +-- host/ide/src/base-ui/tabs/lit-tabpane.ts | 20 +- host/ide/src/command/cmd.ts | 40 + host/ide/src/figures/Options.jpg | Bin 0 -> 130484 bytes host/ide/src/figures/PerfProfile.jpg | Bin 0 -> 149159 bytes host/ide/src/figures/ProcessesHistory.jpg | Bin 0 -> 143406 bytes host/ide/src/figures/Samplelist.jpg | Bin 0 -> 174714 bytes host/ide/src/figures/Scheduling.jpg | Bin 0 -> 71861 bytes .../src/figures/abilitymonitorflowchart.jpg | Bin 0 -> 106077 bytes host/ide/src/figures/callstack.jpg | Bin 0 -> 206004 bytes host/ide/src/figures/callstackclick.jpg | Bin 0 -> 19084 bytes host/ide/src/figures/callstackselect.jpg | Bin 0 -> 127570 bytes host/ide/src/figures/chart.jpg | Bin 0 -> 61715 bytes host/ide/src/figures/command.jpg | Bin 0 -> 63489 bytes host/ide/src/figures/cpu.jpg | Bin 0 -> 113908 bytes host/ide/src/figures/cpu_frequency.png | Bin 0 -> 36246 bytes host/ide/src/figures/cpubyprocess.jpg | Bin 0 -> 167455 bytes host/ide/src/figures/cpubythread.jpg | Bin 0 -> 186540 bytes host/ide/src/figures/cpuclick.jpg | Bin 0 -> 100490 bytes host/ide/src/figures/cpusage.jpg | Bin 0 -> 156691 bytes host/ide/src/figures/cpusummary.jpg | Bin 0 -> 118284 bytes host/ide/src/figures/datamining.jpg | Bin 0 -> 139108 bytes host/ide/src/figures/disktab.jpg | Bin 0 -> 140396 bytes host/ide/src/figures/dump_and_mem.png | Bin 0 -> 5805 bytes host/ide/src/figures/excutecommand.jpg | Bin 0 -> 101387 bytes host/ide/src/figures/filters.png | Bin 0 -> 49833 bytes host/ide/src/figures/fps.jpg | Bin 0 -> 7002 bytes host/ide/src/figures/fpsselect.jpg | Bin 0 -> 92018 bytes host/ide/src/figures/gray.jpg | Bin 0 -> 31408 bytes host/ide/src/figures/heaviesttrace1.jpg | Bin 0 -> 150002 bytes host/ide/src/figures/highlit.jpg | Bin 0 -> 19856 bytes host/ide/src/figures/htrace.jpg | Bin 0 -> 97938 bytes host/ide/src/figures/liveprocess.jpg | Bin 0 -> 129259 bytes host/ide/src/figures/log.png | Bin 0 -> 4037 bytes host/ide/src/figures/main.jpg | Bin 0 -> 7630 bytes host/ide/src/figures/mem_usage.png | Bin 0 -> 30381 bytes host/ide/src/figures/memorytab.jpg | Bin 0 -> 163099 bytes host/ide/src/figures/network.jpg | Bin 0 -> 160666 bytes host/ide/src/figures/opentrace.jpg | Bin 0 -> 21461 bytes host/ide/src/figures/perfsetting.jpg | Bin 0 -> 55866 bytes host/ide/src/figures/process.jpg | Bin 0 -> 134828 bytes host/ide/src/figures/process_thread.png | Bin 0 -> 1841 bytes host/ide/src/figures/samplecounter.jpg | Bin 0 -> 137322 bytes host/ide/src/figures/smartperf_framework.png | Bin 0 -> 19831 bytes host/ide/src/figures/summary.jpg | Bin 0 -> 151155 bytes host/ide/src/figures/systraceconfig.jpg | Bin 0 -> 36103 bytes host/ide/src/figures/thread_state.png | Bin 0 -> 1906 bytes host/ide/src/figures/threadclick.jpg | Bin 0 -> 57375 bytes host/ide/src/figures/threadinfo.jpg | Bin 0 -> 169830 bytes host/ide/src/figures/threadselect.jpg | Bin 0 -> 138639 bytes host/ide/src/figures/time.jpg | Bin 0 -> 25236 bytes host/ide/src/figures/trace.jpg | Bin 0 -> 120151 bytes host/ide/src/figures/trace2.jpg | Bin 0 -> 174774 bytes .../ide/src/figures/trace_streamer_stream.png | Bin 0 -> 22417 bytes host/ide/src/icon.svg | 2174 ++++++++++++- host/ide/src/img/help.png | Bin 0 -> 488 bytes host/ide/src/img/normal_off.png | Bin 0 -> 1076 bytes host/ide/src/img/normal_on.png | Bin 0 -> 1399 bytes host/ide/src/img/screening.png | Bin 0 -> 296 bytes host/ide/src/index.html | 4 +- host/ide/src/trace/SpApplication.ts | 468 +-- host/ide/src/trace/bean/AbilityMonitor.ts | 128 + host/ide/src/trace/bean/BoxSelection.ts | 13 +- .../src/trace/bean/CpuAbilityMonitorStruct.ts | 28 + .../trace/bean/DiskAbilityMonitorStruct.ts | 61 + host/ide/src/trace/bean/HeapBean.ts | 22 +- host/ide/src/trace/bean/HeapStruct.ts | 2 +- host/ide/src/trace/bean/HeapTreeDataBean.ts | 18 +- .../trace/bean/MemoryAbilityMonitorStruct.ts | 61 + host/ide/src/trace/bean/NativeHook.ts | 189 +- .../trace/bean/NetworkAbilityMonitorStruct.ts | 60 + host/ide/src/trace/bean/PerfProfile.ts | 191 ++ host/ide/src/trace/bean/SearchFuncBean.ts | 33 + host/ide/src/trace/bean/StateProcessThread.ts | 24 + host/ide/src/trace/bean/WakeupBean.ts | 1 + .../trace/component/DisassemblingWindow.ts | 205 ++ host/ide/src/trace/component/FrameChart.ts | 544 ++++ host/ide/src/trace/component/SpFilter.ts | 84 + host/ide/src/trace/component/SpHelp.ts | 227 ++ host/ide/src/trace/component/SpInfoAndStas.ts | 226 +- host/ide/src/trace/component/SpMetrics.ts | 350 +- host/ide/src/trace/component/SpQuerySQL.ts | 387 ++- host/ide/src/trace/component/SpRecordTrace.ts | 406 ++- .../trace/component/SpRecyclerSystemTrace.ts | 69 +- host/ide/src/trace/component/SpSystemTrace.ts | 1665 +++++++++- host/ide/src/trace/component/SpWelcomePage.ts | 33 +- host/ide/src/trace/component/Sptext.ts | 52 +- host/ide/src/trace/component/StackBar.ts | 29 +- .../trace/component/hiperf/PerfDataQuery.ts | 357 +++ .../src/trace/component/hiperf/SpHiPerf.ts | 389 +++ .../trace/component/metrics/CpuStrategy.ts | 110 + .../metrics/DistributeTermStrategy.ts | 115 + .../trace/component/metrics/MemAggStrategy.ts | 78 + .../trace/component/metrics/MemStrategy.ts | 57 + .../component/metrics/MetaDataStrategy.ts | 57 + .../component/metrics/SysCallsStrategy.ts | 45 + .../component/metrics/SysCallsTopStrategy.ts | 72 + .../component/metrics/TraceStatsStrategy.ts | 45 + .../component/metrics/TraceTaskStrategy.ts | 49 + .../trace/component/setting/SpAllocations.ts | 251 +- .../trace/component/setting/SpProbesConfig.ts | 174 +- .../trace/component/setting/SpRecordPerf.ts | 589 ++++ .../component/setting/SpRecordSetting.ts | 251 +- .../trace/component/setting/SpTraceCommand.ts | 175 +- .../setting/bean/ProfilerServiceTypes.ts | 37 + .../setting/utils/PluginConvertUtils.ts | 111 +- .../component/trace/TimerShaftElement.ts | 287 +- .../trace/component/trace/base/ColorUtils.ts | 2 +- .../trace/component/trace/base/RangeSelect.ts | 5 + .../trace/component/trace/base/TraceRow.ts | 523 +-- .../trace/base/TraceRowRecyclerView.ts | 72 +- .../trace/component/trace/base/TraceSheet.ts | 328 +- .../src/trace/component/trace/base/Utils.ts | 346 +- .../trace/component/trace/search/Search.ts | 141 +- .../component/trace/sheet/TabPaneBoxChild.ts | 48 +- .../trace/sheet/TabPaneContextSwitch.ts | 35 +- .../component/trace/sheet/TabPaneCounter.ts | 49 +- .../trace/component/trace/sheet/TabPaneCpu.ts | 27 +- .../trace/sheet/TabPaneCpuAbility.ts | 165 + .../trace/sheet/TabPaneCpuByProcess.ts | 35 +- .../trace/sheet/TabPaneCpuByThread.ts | 41 +- .../component/trace/sheet/TabPaneCpuUsage.ts | 44 +- .../trace/sheet/TabPaneCurrentSelection.ts | 112 +- .../trace/sheet/TabPaneDiskAbility.ts | 178 ++ .../component/trace/sheet/TabPaneFilter.ts | 1037 ++++-- .../trace/component/trace/sheet/TabPaneFps.ts | 27 +- .../component/trace/sheet/TabPaneHeap.ts | 168 +- .../trace/sheet/TabPaneHistoryProcesses.ts | 200 ++ .../trace/sheet/TabPaneLiveProcesses.ts | 188 ++ .../trace/sheet/TabPaneMemoryAbility.ts | 256 ++ .../trace/sheet/TabPaneNMCallInfo.ts | 483 ++- .../trace/sheet/TabPaneNMSampleList.ts | 312 +- .../trace/sheet/TabPaneNMStatstics.ts | 173 +- .../component/trace/sheet/TabPaneNMemory.ts | 285 +- .../trace/sheet/TabPaneNetworkAbility.ts | 168 + .../trace/component/trace/sheet/TabPanePTS.ts | 46 +- .../trace/component/trace/sheet/TabPaneSPT.ts | 46 +- .../component/trace/sheet/TabPaneSlices.ts | 32 +- .../trace/sheet/TabPaneThreadStates.ts | 50 +- .../trace/sheet/TabPaneThreadSwitch.ts | 32 +- .../component/trace/sheet/TabPerfProfile.ts | 463 +++ .../trace/sheet/TabPerfSampleList.ts | 200 ++ .../component/trace/sheet/TabProgressBar.ts | 66 +- .../trace/component/trace/timer-shaft/Flag.ts | 5 +- .../component/trace/timer-shaft/RangeRuler.ts | 20 +- .../component/trace/timer-shaft/SportRuler.ts | 113 +- .../trace/timer-shaft/TabPaneFlag.ts | 88 +- host/ide/src/trace/database/Procedure.ts | 12 +- .../ide/src/trace/database/ProcedureWorker.ts | 380 ++- .../src/trace/database/ProcedureWorkerCPU.ts | 57 +- .../trace/database/ProcedureWorkerCommon.ts | 181 +- .../database/ProcedureWorkerCpuAbility.ts | 110 + .../database/ProcedureWorkerDiskIoAbility.ts | 104 + .../src/trace/database/ProcedureWorkerFunc.ts | 10 +- .../src/trace/database/ProcedureWorkerHeap.ts | 8 +- .../database/ProcedureWorkerHiPerfCPU.ts | 143 + .../database/ProcedureWorkerHiPerfProcess.ts | 124 + .../database/ProcedureWorkerHiPerfThread.ts | 123 + .../database/ProcedureWorkerMemoryAbility.ts | 106 + .../database/ProcedureWorkerNetworkAbility.ts | 102 + .../trace/database/ProcedureWorkerProcess.ts | 7 +- .../trace/database/ProcedureWorkerThread.ts | 27 +- host/ide/src/trace/database/SqlLite.ts | 2846 +++++++++++++---- host/ide/src/trace/database/TempSql.ts | 170 +- host/ide/src/trace/database/TraceWorker.ts | 40 +- .../ide/src/trace/database/TraceWorkerRoot.ts | 36 + host/ide/src/trace/grpc/HiProfilerClient.ts | 15 +- host/ide/src/trace/grpc/ProfilerClient.ts | 203 +- host/ide/src/trace/grpc/ProfilerController.ts | 44 +- .../test/base-ui/checkbox/LitCheckBox.test.ts | 101 + .../checkbox/LitCheckBoxWithText.test.ts | 57 +- .../base-ui/checkbox/LitCheckGroup.test.ts | 29 + host/ide/test/base-ui/icon/LitIcon.test.ts | 39 + .../ide/test/base-ui/menu/LitMainMenu.test.ts | 76 + .../base-ui/menu/LitMainMenuGroup.test.ts | 90 +- .../test/base-ui/menu/LitMainMenuItem.test.ts | 96 + .../base-ui/popover/LitPopContent.test.ts | 42 + .../test/base-ui/popover/LitPopover.test.ts | 326 ++ .../test/base-ui/popover/LitPopoverV.test.ts | 441 +++ .../progress-bar/LitProgressBar.test.ts | 53 +- .../test/base-ui/radiobox/LitRadioBox.test.ts | 167 + .../ide/test/base-ui/select/LitSelect.test.ts | 374 +++ .../base-ui/select/LitSelectOption.test.ts | 88 + .../ide/test/base-ui/slider/LitSlider.test.ts | 125 +- .../ide/test/base-ui/switch/LitSwitch.test.ts | 76 + host/ide/test/base-ui/table/LitTable.test.ts | 375 ++- .../test/base-ui/table/LitTableColumn.test.ts | 14 + .../test/base-ui/table/LitTableGroup.test.ts | 11 + .../test/base-ui/table/TableRowObject.test.ts | 23 + host/ide/test/base-ui/tabs/LitTabpane.test.ts | 36 +- host/ide/test/base-ui/tabs/LitTabs.test.ts | 415 ++- host/ide/test/log/Log.test.ts | 24 + host/ide/test/trace/SpApplication.test.ts | 260 +- .../test/trace/bean/AbilityMonitor.test.ts | 390 +++ host/ide/test/trace/bean/BaseStruct.test.ts | 1 + host/ide/test/trace/bean/BoxSelection.test.ts | 171 +- .../ide/test/trace/bean/CpuFreqStruct.test.ts | 35 + host/ide/test/trace/bean/CpuStruct.test.ts | 19 + host/ide/test/trace/bean/CpuUsage.test.ts | 60 + .../bean/DiskAbilityMonitorStruct.test.ts | 56 + host/ide/test/trace/bean/FpsStruct.test.ts | 44 + host/ide/test/trace/bean/FuncStruct.test.ts | 8 +- host/ide/test/trace/bean/HeapBean.test.ts | 58 + .../test/trace/bean/HeapTreeDataBean.test.ts | 55 + .../bean/MemoryAbilityMonitorStruct.test.ts | 57 + host/ide/test/trace/bean/NativeHook.test.ts | 354 ++ .../bean/NetworkAbilityMonitorStruct.test.ts | 55 + host/ide/test/trace/bean/PerfProfile.test.ts | 264 ++ .../trace/bean/StateProcessThread.test.ts | 151 +- host/ide/test/trace/bean/ThreadStruct.test.ts | 5 + .../component/DisassemblingWindow.test.ts | 34 + .../test/trace/component/FrameChart.test.ts | 172 +- .../ide/test/trace/component/SpFilter.test.ts | 90 + .../trace/component/SpInfoAndStas.test.ts | 190 ++ .../test/trace/component/SpMetrics.test.ts | 181 ++ .../test/trace/component/SpQuerySQL.test.ts | 174 + .../trace/component/SpRecordTrace.test.ts | 32 +- .../component/SpRecyclerSystemTrace.test.ts | 60 +- .../trace/component/SpSystemTrace.test.ts | 135 +- .../trace/component/SpWelcomePage.test.ts | 49 + host/ide/test/trace/component/Sptext.test.ts | 57 + .../ide/test/trace/component/StackBar.test.ts | 24 + .../component/hiperf/PerfDataQuery.test.ts | 548 ++++ .../component/metrics/CpuStrategy.test.ts | 42 + .../metrics/DistributeTermStrategy.test.ts | 38 + .../component/metrics/MemAggStrategy.test.ts | 74 + .../component/metrics/MemStrategy.test.ts | 32 + .../metrics/MetaDataStrategy.test.ts | 30 + .../metrics/SysCallsStrategy.test.ts | 32 + .../metrics/SysCallsTopStrategy.test.ts | 35 + .../metrics/TraceStatsStrategy.test.ts | 30 + .../metrics/TraceTaskStrategy.test.ts | 31 + .../component/setting/SpAllocations.test.ts | 154 +- .../component/setting/SpCheckDesBox.test.ts | 45 + .../component/setting/SpProbesConfig.test.ts | 101 +- .../component/setting/SpRecordPerf.test.ts | 199 ++ .../component/setting/SpRecordSetting.test.ts | 123 + .../component/setting/SpTraceCommand.test.ts | 98 +- .../setting/utils/PluginConvertUtils.test.ts | 2 +- .../component/trace/TimerShaftElement.test.ts | 215 +- .../component/trace/base/RangeSelect.test.ts | 5 + .../component/trace/base/TraceRow.test.ts | 500 ++- .../trace/base/TraceRowRecyclerView.test.ts | 79 +- .../component/trace/base/TraceSheet.test.ts | 279 +- .../trace/component/trace/base/Utils.test.ts | 111 +- .../component/trace/search/Search.test.ts | 155 + .../trace/sheet/TabPaneBoxChild.test.ts | 69 +- .../trace/sheet/TabPaneContextSwitch.test.ts | 32 + .../trace/sheet/TabPaneCounter.test.ts | 45 +- .../component/trace/sheet/TabPaneCpu.test.ts | 22 + .../trace/sheet/TabPaneCpuAbility.test.ts | 56 + .../trace/sheet/TabPaneCpuByProcess.test.ts | 44 +- .../trace/sheet/TabPaneCpuByThread.test.ts | 66 +- .../trace/sheet/TabPaneCpuUsage.test.ts | 67 + .../sheet/TabPaneCurrentSelection.test.ts | 71 +- .../trace/sheet/TabPaneDiskAbility.test.ts | 57 + .../trace/sheet/TabPaneFilter.test.ts | 323 ++ .../component/trace/sheet/TabPaneFps.test.ts | 62 + .../component/trace/sheet/TabPaneHeap.test.ts | 310 ++ .../sheet/TabPaneHistoryProcesses.test.ts | 64 + .../trace/sheet/TabPaneLiveProcesses.test.ts | 72 + .../trace/sheet/TabPaneMemoryAbility.test.ts | 54 + .../trace/sheet/TabPaneNMCallInfo.test.ts | 408 +++ .../trace/sheet/TabPaneNMSampleList.test.ts | 253 ++ .../trace/sheet/TabPaneNMStatstics.test.ts | 371 +++ .../trace/sheet/TabPaneNMemory.test.ts | 115 + .../trace/sheet/TabPaneNetworkAbility.test.ts | 57 + .../component/trace/sheet/TabPanePTS.test.ts | 98 +- .../component/trace/sheet/TabPaneSPT.test.ts | 115 + .../trace/sheet/TabPaneSlices.test.ts | 37 +- .../trace/sheet/TabPaneThreadStates.test.ts | 50 +- .../trace/sheet/TabPaneThreadSwitch.test.ts | 43 +- .../trace/sheet/TabPerfProfile.test.ts | 63 + .../component/trace/timer-shaft/Flag.test.ts | 24 + .../component/trace/timer-shaft/Graph.test.ts | 24 + .../trace/timer-shaft/RangeRuler.test.ts | 139 +- .../trace/timer-shaft/SportRuler.test.ts | 245 +- .../trace/timer-shaft/TabPaneFlag.test.ts | 70 +- .../trace/timer-shaft/TimeRuler.test.ts | 7 +- .../ide/test/trace/database/Procedure.test.ts | 12 +- .../trace/database/ProcedureWorker.test.ts | 38 + .../trace/database/ProcedureWorkerCPU.test.ts | 80 + .../database/ProcedureWorkerCommon.test.ts | 212 ++ .../ProcedureWorkerCpuAbility.test.ts | 60 + .../ProcedureWorkerDiskIoAbility.test.ts | 60 + .../trace/database/ProcedureWorkerFPS.test.ts | 86 + .../database/ProcedureWorkerFreq.test.ts | 61 + .../database/ProcedureWorkerFunc.test.ts | 66 + .../database/ProcedureWorkerHeap.test.ts | 60 + .../database/ProcedureWorkerHiPerfCPU.test.ts | 55 + .../ProcedureWorkerHiPerfProcess.test.ts | 47 + .../ProcedureWorkerHiPerfThread.test.ts | 47 + .../trace/database/ProcedureWorkerMem.test.ts | 48 + .../ProcedureWorkerMemoryAbility.test.ts | 45 + .../ProcedureWorkerNetworkAbility.test.ts | 45 + .../database/ProcedureWorkerProcess.test.ts | 43 + .../database/ProcedureWorkerThread.test.ts | 160 + .../database/ProcedureWorkerTimeline.test.ts | 92 + host/ide/test/trace/database/SqlLite.test.ts | 27 + .../test/trace/grpc/HiProfilerClient.test.ts | 2 +- .../test/trace/grpc/ProfilerClient.test.ts | 35 +- .../trace/grpc/ProfilerController.test.ts | 56 + host/trace_streamer/BUILD.gn | 5 + host/trace_streamer/README.md | 260 +- host/trace_streamer/build.sh | 90 +- host/trace_streamer/build/test.gni | 23 + host/trace_streamer/doc/README.md | 260 +- ..._streamer.md => compile_trace_streamer.md} | 83 +- host/trace_streamer/doc/compiler_ut.md | 28 + host/trace_streamer/doc/des_binder.md | 62 + host/trace_streamer/doc/des_stat.md | 74 +- ...port_eventlist.md => des_support_event.md} | 0 host/trace_streamer/doc/des_tables.md | 418 ++- host/trace_streamer/doc/des_wakup.md | 3 + host/trace_streamer/figures/dump_and_mem.png | Bin 5805 -> 6834 bytes host/trace_streamer/gn/BUILD.gn | 98 +- host/trace_streamer/gn/CONFIG.gn | 41 +- host/trace_streamer/gn/toolchain/BUILD.gn | 13 +- host/trace_streamer/gn/wasm.gni | 6 +- .../libprotobuf_lite_la_SOURCES.pri | 64 - .../buildprotobuf/libprotoc_la_SOURCES.pri | 173 - .../prebuilts/buildprotobuf/protobuf.pri | 69 - .../prebuilts/buildprotobuf/protobufbuild.gn | 346 ++ .../buildsqlite/sqlite3build.gn} | 45 +- host/trace_streamer/prebuilts/protos/BUILD.gn | 31 +- host/trace_streamer/src/BUILD.gn | 65 +- host/trace_streamer/src/base/BUILD.gn | 2 + host/trace_streamer/src/base/log.cpp | 5 - host/trace_streamer/src/base/meta.cpp | 18 + host/trace_streamer/src/base/meta.h | 23 + host/trace_streamer/src/base/string_help.cpp | 67 + host/trace_streamer/src/base/string_help.h | 26 + host/trace_streamer/src/base/ts_common.h | 5 +- host/trace_streamer/src/cfg/cfg.pri | 19 - .../src/cfg/trace_streamer_config.cpp | 150 +- .../src/cfg/trace_streamer_config.h | 15 + host/trace_streamer/src/ext/sqlite_ext.pri | 16 - .../src/filter/binder_filter.cpp | 133 +- .../trace_streamer/src/filter/binder_filter.h | 150 +- host/trace_streamer/src/filter/clock_filter.h | 4 + host/trace_streamer/src/filter/cpu_filter.cpp | 143 +- host/trace_streamer/src/filter/cpu_filter.h | 78 - host/trace_streamer/src/filter/filter.pri | 43 - host/trace_streamer/src/filter/irq_filter.h | 12 +- .../src/filter/measure_filter.h | 12 +- .../src/filter/perf_data_filter.cpp | 92 + .../src/filter/perf_data_filter.h | 52 + .../src/filter/slice_filter.cpp | 61 +- host/trace_streamer/src/filter/slice_filter.h | 5 +- host/trace_streamer/src/include/file.h | 30 + .../src/include/string_to_numerical.h | 32 +- host/trace_streamer/src/main.cpp | 69 +- .../src/multi_platform/BUILD.gn | 305 -- .../src/multi_platform/global.pri | 75 - .../src/multi_platform/protogen.pri | 107 - .../bytrace_parser/bytrace_event_parser.cpp | 193 +- .../bytrace_parser/bytrace_event_parser.h | 41 +- .../parser/bytrace_parser/bytrace_parser.cpp | 108 +- .../parser/bytrace_parser/bytrace_parser.h | 4 +- host/trace_streamer/src/parser/common_types.h | 50 +- .../parser/hiperf_parser/BUILD.gn} | 56 +- .../parser/hiperf_parser/hiperf/BUILD.gn} | 73 +- .../parser/hiperf_parser/hiperf/callstack.cpp | 662 ++++ .../hiperf_parser/hiperf/debug_logger.cpp | 294 ++ .../hiperf_parser/hiperf/dwarf_encoding.cpp | 163 + .../parser/hiperf_parser/hiperf/elf_file.cpp | 359 +++ .../hiperf_parser/hiperf/elf_header.cpp | 194 ++ .../hiperf_parser/hiperf/elf_symbol.cpp | 129 + .../parser/hiperf_parser/hiperf/hashlist.hpp | 26 + .../hiperf_parser/hiperf/include/callstack.h | 135 + .../hiperf/include/debug_logger.h | 336 ++ .../hiperf/include/dwarf_encoding.h | 193 ++ .../hiperf_parser/hiperf/include/elf_parser.h | 305 ++ .../hiperf_parser/hiperf/include/hashlist.h | 1146 +++++++ .../hiperf/include/mem_map_item.h | 101 + .../hiperf/include/noncopyable.h | 26 + .../hiperf_parser/hiperf/include/option.h | 140 + .../hiperf/include/perf_event_record.h | 436 +++ .../hiperf/include/perf_events.h | 523 +++ .../hiperf/include/perf_file_format.h | 260 ++ .../hiperf/include/perf_file_reader.h | 126 + .../hiperf/include/perf_record_format.h | 358 +++ .../hiperf_parser/hiperf/include/register.h | 184 ++ .../hiperf_parser/hiperf/include/report.h | 559 ++++ .../hiperf/include/ring_buffer.h | 58 + .../hiperf/include/subcommand_dump.h | 119 + .../hiperf/include/subcommand_help.h | 45 + .../hiperf/include/symbols_file.h | 351 ++ .../hiperf/include/tracked_command.h | 76 + .../hiperf_parser/hiperf/include/utilities.h | 350 ++ .../hiperf/include/virtual_runtime.h | 170 + .../hiperf/include/virtual_thread.h | 111 + .../hiperf_parser/hiperf/linux/file_ex.h | 34 + .../hiperf_parser/hiperf/linux/securec.h | 564 ++++ .../hiperf_parser/hiperf/linux/securectype.h | 281 ++ .../hiperf_parser/hiperf/linux/unique_fd.h | 191 ++ .../parser/hiperf_parser/hiperf/option.cpp | 180 ++ .../hiperf/perf_event_record.cpp | 892 ++++++ .../hiperf_parser/hiperf/perf_events.cpp | 1645 ++++++++++ .../hiperf_parser/hiperf/perf_file_format.cpp | 488 +++ .../hiperf_parser/hiperf/perf_file_reader.cpp | 487 +++ .../hiperf_parser/hiperf/program_header.cpp | 83 + .../parser/hiperf_parser/hiperf/register.cpp | 273 ++ .../parser/hiperf_parser/hiperf/report.cpp | 656 ++++ .../hiperf_parser/hiperf/ring_buffer.cpp | 112 + .../hiperf_parser/hiperf/section_header.cpp | 106 + .../hiperf_parser/hiperf/subcommand.cpp | 112 + .../parser/hiperf_parser/hiperf/subcommand.h | 98 + .../hiperf_parser/hiperf/subcommand_dump.cpp | 530 +++ .../hiperf_parser/hiperf/subcommand_help.cpp | 73 + .../hiperf_parser/hiperf/symbols_file.cpp | 1347 ++++++++ .../parser/hiperf_parser/hiperf/utilities.cpp | 547 ++++ .../hiperf_parser/hiperf/virtual_runtime.cpp | 706 ++++ .../hiperf_parser/hiperf/virtual_thread.cpp | 363 +++ .../parser/hiperf_parser/perf_data_parser.cpp | 243 ++ .../parser/hiperf_parser/perf_data_parser.h | 87 + .../src/parser/htrace_parser/BUILD.gn | 28 +- .../htrace_clock_detail_parser.cpp | 11 +- .../htrace_clock_detail_parser.h | 8 +- .../htrace_parser/htrace_cpu_data_parser.cpp | 77 + .../htrace_parser/htrace_cpu_data_parser.h | 77 + .../htrace_cpu_detail_parser.cpp | 12 +- .../htrace_cpu_detail_parser.h | 3 +- .../htrace_parser/htrace_disk_io_parser.cpp | 82 + .../htrace_parser/htrace_disk_io_parser.h | 52 + .../htrace_event_parser.cpp | 235 +- .../htrace_event_parser/htrace_event_parser.h | 31 +- .../htrace_parser/htrace_hidump_parser.cpp | 36 +- .../htrace_parser/htrace_hidump_parser.h | 11 +- .../htrace_parser/htrace_hilog_parser.cpp | 35 +- .../htrace_parser/htrace_hilog_parser.h | 8 +- .../htrace_parser/htrace_mem_parser.cpp | 37 +- .../parser/htrace_parser/htrace_mem_parser.h | 10 +- .../htrace_native_hook_parser.cpp | 191 +- .../htrace_parser/htrace_native_hook_parser.h | 26 +- .../htrace_parser/htrace_network_parser.cpp | 80 + .../htrace_parser/htrace_network_parser.h | 51 + .../parser/htrace_parser/htrace_parser.cpp | 240 +- .../src/parser/htrace_parser/htrace_parser.h | 27 +- .../htrace_plugin_time_parser.cpp | 65 + .../htrace_parser/htrace_plugin_time_parser.h | 41 + .../htrace_parser/htrace_process_parser.cpp | 83 + .../htrace_parser/htrace_process_parser.h | 58 + .../htrace_symbols_detail_parser.cpp | 14 +- .../htrace_symbols_detail_parser.h | 2 +- host/trace_streamer/src/parser/parser.pri | 51 - .../src/parser/print_event_parser.cpp | 61 +- .../src/parser/print_event_parser.h | 2 +- host/trace_streamer/src/protos/README_zh.md | 4 +- host/trace_streamer/src/protos/protogen.sh | 26 +- host/trace_streamer/src/protos/protos.gni | 26 +- .../plugins/cpu_data/cpu_plugin_result.proto | 4 + .../diskio_data/diskio_plugin_config.proto | 7 +- .../diskio_data/diskio_plugin_result.proto | 57 + .../memory_data/memory_plugin_common.proto | 1 + .../memory_data/memory_plugin_result.proto | 1 + .../native_hook/native_hook_result.proto | 19 + .../network_data/network_plugin_result.proto | 20 + .../process_data/process_plugin_result.proto | 27 + host/trace_streamer/src/rpc/http_server.cpp | 56 +- host/trace_streamer/src/rpc/http_server.h | 2 +- host/trace_streamer/src/rpc/http_socket.cpp | 2 +- host/trace_streamer/src/rpc/http_socket.h | 6 +- host/trace_streamer/src/rpc/rpc.pri | 17 - host/trace_streamer/src/rpc/rpc_server.cpp | 26 +- host/trace_streamer/src/rpc/rpc_server.h | 3 + host/trace_streamer/src/rpc/wasm_func.cpp | 9 +- host/trace_streamer/src/rpc/wasm_func.h | 17 + host/trace_streamer/src/table/args_table.cpp | 169 +- host/trace_streamer/src/table/args_table.h | 14 +- .../src/table/callstack_table.cpp | 167 +- .../src/table/callstack_table.h | 13 +- .../src/table/clk_event_filter_table.cpp | 174 +- .../src/table/clk_event_filter_table.h | 12 +- .../src/table/clock_event_filter_table.cpp | 173 +- .../src/table/clock_event_filter_table.h | 12 +- .../src/table/cpu_measure_filter_table.cpp | 172 +- .../src/table/cpu_measure_filter_table.h | 12 +- .../src/table/cpu_usage_info_table.cpp | 83 + .../src/table/cpu_usage_info_table.h | 50 + .../src/table/data_dict_table.cpp | 163 +- .../src/table/data_dict_table.h | 12 +- .../src/table/data_type_table.cpp | 161 +- .../src/table/data_type_table.h | 13 +- ...heap_frame_table.cpp => disk_io_table.cpp} | 105 +- .../table/{heap_table.h => disk_io_table.h} | 25 +- .../src/table/filter_constraints.cpp | 132 + .../src/table/filter_constraints.h | 66 + .../trace_streamer/src/table/filter_table.cpp | 169 +- host/trace_streamer/src/table/filter_table.h | 16 +- .../trace_streamer/src/table/hidump_table.cpp | 167 +- host/trace_streamer/src/table/hidump_table.h | 12 +- host/trace_streamer/src/table/index_map.cpp | 74 + host/trace_streamer/src/table/index_map.h | 142 + .../src/table/instants_table.cpp | 371 ++- .../trace_streamer/src/table/instants_table.h | 62 +- host/trace_streamer/src/table/irq_table.cpp | 163 +- host/trace_streamer/src/table/irq_table.h | 12 +- .../src/table/live_process_table.cpp | 136 + .../src/table/live_process_table.h | 50 + host/trace_streamer/src/table/log_table.cpp | 8 +- host/trace_streamer/src/table/log_table.h | 11 +- .../src/table/measure_filter_table.cpp | 8 +- .../src/table/measure_filter_table.h | 11 +- .../src/table/measure_table.cpp | 239 +- host/trace_streamer/src/table/measure_table.h | 60 +- host/trace_streamer/src/table/meta_table.cpp | 9 +- host/trace_streamer/src/table/meta_table.h | 12 +- .../src/table/native_hook_frame_table.cpp | 254 ++ .../src/table/native_hook_frame_table.h | 51 + .../{heap_table.cpp => native_hook_table.cpp} | 231 +- .../src/table/native_hook_table.h | 51 + .../src/table/network_table.cpp | 126 + .../{heap_frame_table.h => network_table.h} | 25 +- .../src/table/perf_call_chain_table.cpp | 234 ++ .../src/table/perf_call_chain_table.h | 51 + .../src/table/perf_files_table.cpp | 233 ++ .../src/table/perf_files_table.h | 51 + .../src/table/perf_report_table.cpp | 72 + .../src/table/perf_report_table.h | 49 + .../src/table/perf_sample_table.cpp | 286 ++ .../src/table/perf_sample_table.h | 52 + .../src/table/perf_thread_table.cpp | 256 ++ .../src/table/perf_thread_table.h | 52 + .../src/table/process_filter_table.cpp | 8 +- .../src/table/process_filter_table.h | 11 +- .../table/process_measure_filter_table.cpp | 173 +- .../src/table/process_measure_filter_table.h | 12 +- .../src/table/process_table.cpp | 200 +- host/trace_streamer/src/table/process_table.h | 15 +- host/trace_streamer/src/table/range_table.cpp | 13 +- host/trace_streamer/src/table/range_table.h | 12 +- host/trace_streamer/src/table/raw_table.cpp | 162 +- host/trace_streamer/src/table/raw_table.h | 12 +- .../src/table/sched_slice_table.cpp | 239 +- .../src/table/sched_slice_table.h | 15 +- host/trace_streamer/src/table/stat_table.cpp | 8 +- host/trace_streamer/src/table/stat_table.h | 12 +- .../src/table/symbols_table.cpp | 163 +- host/trace_streamer/src/table/symbols_table.h | 12 +- .../src/table/system_call_table.cpp | 8 +- .../src/table/system_call_table.h | 11 +- .../src/table/system_event_filter_table.cpp | 176 +- .../src/table/system_event_filter_table.h | 15 +- host/trace_streamer/src/table/table.pri | 78 - host/trace_streamer/src/table/table_base.cpp | 162 +- host/trace_streamer/src/table/table_base.h | 77 +- .../src/table/thread_filter_table.cpp | 8 +- .../src/table/thread_filter_table.h | 11 +- .../src/table/thread_state_table.cpp | 298 +- .../src/table/thread_state_table.h | 65 +- .../trace_streamer/src/table/thread_table.cpp | 182 +- host/trace_streamer/src/table/thread_table.h | 14 +- .../src/trace_data/trace_data.pri | 28 - .../src/trace_data/trace_data_cache.cpp | 104 +- .../src/trace_data/trace_data_cache_base.h | 35 +- .../trace_data/trace_data_cache_reader.cpp | 44 +- .../src/trace_data/trace_data_cache_reader.h | 13 +- .../trace_data/trace_data_cache_writer.cpp | 70 +- .../src/trace_data/trace_data_cache_writer.h | 14 +- .../src/trace_data/trace_data_db.cpp | 120 +- .../src/trace_data/trace_data_db.h | 10 +- .../src/trace_data/trace_stdtype.cpp | 567 +++- .../src/trace_data/trace_stdtype.h | 385 ++- host/trace_streamer/src/trace_streamer.pro | 79 - .../src/trace_streamer/trace_streamer.pri | 21 - .../trace_streamer/trace_streamer_filters.cpp | 1 + .../trace_streamer/trace_streamer_filters.h | 2 + .../trace_streamer_selector.cpp | 18 + .../trace_streamer/trace_streamer_selector.h | 6 +- host/trace_streamer/src/ts.gni | 11 +- host/trace_streamer/test/BUILD.gn | 219 +- .../trace_streamer/test/test_fuzzer/README.md | 49 + .../test/test_fuzzer/bytrace_fuzzer/BUILD.gn | 79 + .../bytrace_fuzzer/bytrace_fuzzer.cpp | 52 + .../bytrace_fuzzer/bytrace_fuzzer.h | 19 + .../test_fuzzer/bytrace_fuzzer/project.xml | 25 + .../test/test_fuzzer/htrace_fuzzer/BUILD.gn | 79 + .../htrace_fuzzer/htrace_fuzzer.cpp | 48 + .../test_fuzzer/htrace_fuzzer/htrace_fuzzer.h | 18 + .../test_fuzzer/htrace_fuzzer/project.xml | 25 + .../test/test_fuzzer/selector_fuzzer/BUILD.gn | 79 + .../test_fuzzer/selector_fuzzer/project.xml | 25 + .../selector_fuzzer/selector_fuzzer.cpp | 48 + .../selector_fuzzer/selector_fuzzer.h | 19 + host/trace_streamer/test/test_ts.gni | 17 +- .../test/unittest/binder_filter_test.cpp | 14 - .../test/unittest/bytrace_parser_test.cpp | 37 +- .../test/unittest/clock_filter_test.cpp | 14 +- .../test/unittest/cpu_filter_test.cpp | 44 +- .../test/unittest/event_parser_test.cpp | 187 +- .../test/unittest/hidump_parser_test.cpp | 160 + .../test/unittest/hilog_parser_test.cpp | 6 + .../unittest/htrace_binder_event_test.cpp | 43 +- .../unittest/htrace_cpu_data_parser_test.cpp | 312 ++ .../unittest/htrace_diskio_parser_test.cpp | 330 ++ .../unittest/htrace_event_parser_test.cpp | 56 +- .../test/unittest/htrace_irq_event_test.cpp | 75 +- .../test/unittest/htrace_mem_parser_test.cpp | 12 +- .../unittest/htrace_network_parser_test.cpp | 300 ++ .../unittest/htrace_process_parser_test.cpp | 299 ++ .../unittest/htrace_sys_mem_parser_test.cpp | 35 +- .../unittest/htrace_sys_vmem_parser_test.cpp | 12 +- .../test/unittest/http_server_test.cpp | 361 +++ .../test/unittest/irq_filter_test.cpp | 94 +- .../test/unittest/measure_filter_test.cpp | 24 +- .../test/unittest/native_hook_parser_test.cpp | 2021 ++++++++++++ .../test/unittest/parser_test.cpp | 91 +- .../test/unittest/process_filter_test.cpp | 34 +- .../test/unittest/rpc_server_test.cpp | 110 + .../test/unittest/slice_filter_test.cpp | 20 +- .../test/unittest/wasm_func_test.cpp | 107 + 629 files changed, 71368 insertions(+), 9652 deletions(-) create mode 100644 host/ide/src/command/cmd.ts create mode 100644 host/ide/src/figures/Options.jpg create mode 100644 host/ide/src/figures/PerfProfile.jpg create mode 100644 host/ide/src/figures/ProcessesHistory.jpg create mode 100644 host/ide/src/figures/Samplelist.jpg create mode 100644 host/ide/src/figures/Scheduling.jpg create mode 100644 host/ide/src/figures/abilitymonitorflowchart.jpg create mode 100644 host/ide/src/figures/callstack.jpg create mode 100644 host/ide/src/figures/callstackclick.jpg create mode 100644 host/ide/src/figures/callstackselect.jpg create mode 100644 host/ide/src/figures/chart.jpg create mode 100644 host/ide/src/figures/command.jpg create mode 100644 host/ide/src/figures/cpu.jpg create mode 100644 host/ide/src/figures/cpu_frequency.png create mode 100644 host/ide/src/figures/cpubyprocess.jpg create mode 100644 host/ide/src/figures/cpubythread.jpg create mode 100644 host/ide/src/figures/cpuclick.jpg create mode 100644 host/ide/src/figures/cpusage.jpg create mode 100644 host/ide/src/figures/cpusummary.jpg create mode 100644 host/ide/src/figures/datamining.jpg create mode 100644 host/ide/src/figures/disktab.jpg create mode 100644 host/ide/src/figures/dump_and_mem.png create mode 100644 host/ide/src/figures/excutecommand.jpg create mode 100644 host/ide/src/figures/filters.png create mode 100644 host/ide/src/figures/fps.jpg create mode 100644 host/ide/src/figures/fpsselect.jpg create mode 100644 host/ide/src/figures/gray.jpg create mode 100644 host/ide/src/figures/heaviesttrace1.jpg create mode 100644 host/ide/src/figures/highlit.jpg create mode 100644 host/ide/src/figures/htrace.jpg create mode 100644 host/ide/src/figures/liveprocess.jpg create mode 100644 host/ide/src/figures/log.png create mode 100644 host/ide/src/figures/main.jpg create mode 100644 host/ide/src/figures/mem_usage.png create mode 100644 host/ide/src/figures/memorytab.jpg create mode 100644 host/ide/src/figures/network.jpg create mode 100644 host/ide/src/figures/opentrace.jpg create mode 100644 host/ide/src/figures/perfsetting.jpg create mode 100644 host/ide/src/figures/process.jpg create mode 100644 host/ide/src/figures/process_thread.png create mode 100644 host/ide/src/figures/samplecounter.jpg create mode 100644 host/ide/src/figures/smartperf_framework.png create mode 100644 host/ide/src/figures/summary.jpg create mode 100644 host/ide/src/figures/systraceconfig.jpg create mode 100644 host/ide/src/figures/thread_state.png create mode 100644 host/ide/src/figures/threadclick.jpg create mode 100644 host/ide/src/figures/threadinfo.jpg create mode 100644 host/ide/src/figures/threadselect.jpg create mode 100644 host/ide/src/figures/time.jpg create mode 100644 host/ide/src/figures/trace.jpg create mode 100644 host/ide/src/figures/trace2.jpg create mode 100644 host/ide/src/figures/trace_streamer_stream.png create mode 100644 host/ide/src/img/help.png create mode 100644 host/ide/src/img/normal_off.png create mode 100644 host/ide/src/img/normal_on.png create mode 100644 host/ide/src/img/screening.png create mode 100644 host/ide/src/trace/bean/AbilityMonitor.ts create mode 100644 host/ide/src/trace/bean/CpuAbilityMonitorStruct.ts create mode 100644 host/ide/src/trace/bean/DiskAbilityMonitorStruct.ts create mode 100644 host/ide/src/trace/bean/MemoryAbilityMonitorStruct.ts create mode 100644 host/ide/src/trace/bean/NetworkAbilityMonitorStruct.ts create mode 100644 host/ide/src/trace/bean/PerfProfile.ts create mode 100644 host/ide/src/trace/bean/SearchFuncBean.ts create mode 100644 host/ide/src/trace/component/DisassemblingWindow.ts create mode 100644 host/ide/src/trace/component/FrameChart.ts create mode 100644 host/ide/src/trace/component/SpFilter.ts create mode 100644 host/ide/src/trace/component/SpHelp.ts create mode 100644 host/ide/src/trace/component/hiperf/PerfDataQuery.ts create mode 100644 host/ide/src/trace/component/hiperf/SpHiPerf.ts create mode 100644 host/ide/src/trace/component/metrics/CpuStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/DistributeTermStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/MemAggStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/MemStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/MetaDataStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/SysCallsStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/SysCallsTopStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/TraceStatsStrategy.ts create mode 100644 host/ide/src/trace/component/metrics/TraceTaskStrategy.ts create mode 100644 host/ide/src/trace/component/setting/SpRecordPerf.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneCpuAbility.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneDiskAbility.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneHistoryProcesses.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneLiveProcesses.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneMemoryAbility.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPaneNetworkAbility.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPerfProfile.ts create mode 100644 host/ide/src/trace/component/trace/sheet/TabPerfSampleList.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerCpuAbility.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerDiskIoAbility.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerHiPerfCPU.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerHiPerfProcess.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerHiPerfThread.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerMemoryAbility.ts create mode 100644 host/ide/src/trace/database/ProcedureWorkerNetworkAbility.ts create mode 100644 host/ide/src/trace/database/TraceWorkerRoot.ts create mode 100644 host/ide/test/base-ui/popover/LitPopoverV.test.ts create mode 100644 host/ide/test/base-ui/select/LitSelect.test.ts create mode 100644 host/ide/test/base-ui/select/LitSelectOption.test.ts create mode 100644 host/ide/test/base-ui/table/TableRowObject.test.ts create mode 100644 host/ide/test/log/Log.test.ts create mode 100644 host/ide/test/trace/bean/AbilityMonitor.test.ts create mode 100644 host/ide/test/trace/bean/BaseStruct.test.ts create mode 100644 host/ide/test/trace/bean/DiskAbilityMonitorStruct.test.ts create mode 100644 host/ide/test/trace/bean/HeapBean.test.ts create mode 100644 host/ide/test/trace/bean/HeapTreeDataBean.test.ts create mode 100644 host/ide/test/trace/bean/MemoryAbilityMonitorStruct.test.ts create mode 100644 host/ide/test/trace/bean/NativeHook.test.ts create mode 100644 host/ide/test/trace/bean/NetworkAbilityMonitorStruct.test.ts create mode 100644 host/ide/test/trace/bean/PerfProfile.test.ts create mode 100644 host/ide/test/trace/component/DisassemblingWindow.test.ts create mode 100644 host/ide/test/trace/component/SpFilter.test.ts create mode 100644 host/ide/test/trace/component/SpInfoAndStas.test.ts create mode 100644 host/ide/test/trace/component/SpMetrics.test.ts create mode 100644 host/ide/test/trace/component/SpQuerySQL.test.ts create mode 100644 host/ide/test/trace/component/SpWelcomePage.test.ts create mode 100644 host/ide/test/trace/component/Sptext.test.ts create mode 100644 host/ide/test/trace/component/hiperf/PerfDataQuery.test.ts create mode 100644 host/ide/test/trace/component/metrics/CpuStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/DistributeTermStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/MemAggStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/MemStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/MetaDataStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/SysCallsStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/SysCallsTopStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/TraceStatsStrategy.test.ts create mode 100644 host/ide/test/trace/component/metrics/TraceTaskStrategy.test.ts create mode 100644 host/ide/test/trace/component/setting/SpCheckDesBox.test.ts create mode 100644 host/ide/test/trace/component/setting/SpRecordPerf.test.ts create mode 100644 host/ide/test/trace/component/trace/search/Search.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneCpuAbility.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneDiskAbility.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneFilter.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneFps.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneHeap.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneHistoryProcesses.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneLiveProcesses.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneMemoryAbility.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneNMCallInfo.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneNMSampleList.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneNMStatstics.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneNMemory.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPaneNetworkAbility.test.ts create mode 100644 host/ide/test/trace/component/trace/sheet/TabPerfProfile.test.ts create mode 100644 host/ide/test/trace/component/trace/timer-shaft/Flag.test.ts create mode 100644 host/ide/test/trace/component/trace/timer-shaft/Graph.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorker.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerCPU.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerCommon.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerCpuAbility.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerDiskIoAbility.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerFPS.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerFreq.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerFunc.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerHeap.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerHiPerfCPU.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerHiPerfProcess.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerHiPerfThread.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerMem.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerMemoryAbility.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerNetworkAbility.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerProcess.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerThread.test.ts create mode 100644 host/ide/test/trace/database/ProcedureWorkerTimeline.test.ts create mode 100644 host/ide/test/trace/database/SqlLite.test.ts create mode 100644 host/ide/test/trace/grpc/ProfilerController.test.ts rename host/trace_streamer/doc/{des_compile_trace_streamer.md => compile_trace_streamer.md} (40%) create mode 100644 host/trace_streamer/doc/compiler_ut.md create mode 100644 host/trace_streamer/doc/des_binder.md rename host/trace_streamer/doc/{des_support_eventlist.md => des_support_event.md} (100%) create mode 100644 host/trace_streamer/doc/des_wakup.md delete mode 100644 host/trace_streamer/prebuilts/buildprotobuf/libprotobuf_lite_la_SOURCES.pri delete mode 100644 host/trace_streamer/prebuilts/buildprotobuf/libprotoc_la_SOURCES.pri delete mode 100644 host/trace_streamer/prebuilts/buildprotobuf/protobuf.pri create mode 100644 host/trace_streamer/prebuilts/buildprotobuf/protobufbuild.gn rename host/trace_streamer/{src/base/base.pri => prebuilts/buildsqlite/sqlite3build.gn} (38%) create mode 100644 host/trace_streamer/src/base/meta.cpp create mode 100644 host/trace_streamer/src/base/meta.h create mode 100644 host/trace_streamer/src/base/string_help.cpp create mode 100644 host/trace_streamer/src/base/string_help.h delete mode 100644 host/trace_streamer/src/cfg/cfg.pri delete mode 100644 host/trace_streamer/src/ext/sqlite_ext.pri delete mode 100644 host/trace_streamer/src/filter/filter.pri create mode 100644 host/trace_streamer/src/filter/perf_data_filter.cpp create mode 100644 host/trace_streamer/src/filter/perf_data_filter.h delete mode 100644 host/trace_streamer/src/multi_platform/BUILD.gn delete mode 100644 host/trace_streamer/src/multi_platform/global.pri delete mode 100644 host/trace_streamer/src/multi_platform/protogen.pri rename host/trace_streamer/{prebuilts/buildprotobuf/protobuf.pro => src/parser/hiperf_parser/BUILD.gn} (42%) rename host/trace_streamer/{prebuilts/buildsqlite/sqlite.pro => src/parser/hiperf_parser/hiperf/BUILD.gn} (32%) create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/callstack.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/debug_logger.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/dwarf_encoding.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_file.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_header.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_symbol.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/hashlist.hpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/callstack.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/debug_logger.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/dwarf_encoding.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/elf_parser.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/hashlist.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/mem_map_item.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/noncopyable.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/option.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_event_record.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_events.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_format.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_reader.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_record_format.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/register.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/report.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/ring_buffer.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_dump.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_help.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/symbols_file.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/tracked_command.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/utilities.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_runtime.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_thread.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/file_ex.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securec.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securectype.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/unique_fd.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/option.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_event_record.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_events.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_format.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_reader.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/program_header.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/register.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/report.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/ring_buffer.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/section_header.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.h create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand_dump.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand_help.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/symbols_file.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/utilities.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/virtual_runtime.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/hiperf/virtual_thread.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp create mode 100644 host/trace_streamer/src/parser/hiperf_parser/perf_data_parser.h create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_cpu_data_parser.cpp create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_cpu_data_parser.h create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_disk_io_parser.cpp create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_disk_io_parser.h create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_network_parser.cpp create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_network_parser.h create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_plugin_time_parser.cpp create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_plugin_time_parser.h create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_process_parser.cpp create mode 100644 host/trace_streamer/src/parser/htrace_parser/htrace_process_parser.h delete mode 100644 host/trace_streamer/src/parser/parser.pri delete mode 100644 host/trace_streamer/src/rpc/rpc.pri create mode 100644 host/trace_streamer/src/table/cpu_usage_info_table.cpp create mode 100644 host/trace_streamer/src/table/cpu_usage_info_table.h rename host/trace_streamer/src/table/{heap_frame_table.cpp => disk_io_table.cpp} (36%) rename host/trace_streamer/src/table/{heap_table.h => disk_io_table.h} (61%) create mode 100644 host/trace_streamer/src/table/filter_constraints.cpp create mode 100644 host/trace_streamer/src/table/filter_constraints.h create mode 100644 host/trace_streamer/src/table/index_map.cpp create mode 100644 host/trace_streamer/src/table/index_map.h create mode 100644 host/trace_streamer/src/table/live_process_table.cpp create mode 100644 host/trace_streamer/src/table/live_process_table.h create mode 100644 host/trace_streamer/src/table/native_hook_frame_table.cpp create mode 100644 host/trace_streamer/src/table/native_hook_frame_table.h rename host/trace_streamer/src/table/{heap_table.cpp => native_hook_table.cpp} (32%) create mode 100644 host/trace_streamer/src/table/native_hook_table.h create mode 100644 host/trace_streamer/src/table/network_table.cpp rename host/trace_streamer/src/table/{heap_frame_table.h => network_table.h} (61%) create mode 100644 host/trace_streamer/src/table/perf_call_chain_table.cpp create mode 100644 host/trace_streamer/src/table/perf_call_chain_table.h create mode 100644 host/trace_streamer/src/table/perf_files_table.cpp create mode 100644 host/trace_streamer/src/table/perf_files_table.h create mode 100644 host/trace_streamer/src/table/perf_report_table.cpp create mode 100644 host/trace_streamer/src/table/perf_report_table.h create mode 100644 host/trace_streamer/src/table/perf_sample_table.cpp create mode 100644 host/trace_streamer/src/table/perf_sample_table.h create mode 100644 host/trace_streamer/src/table/perf_thread_table.cpp create mode 100644 host/trace_streamer/src/table/perf_thread_table.h delete mode 100644 host/trace_streamer/src/table/table.pri delete mode 100644 host/trace_streamer/src/trace_data/trace_data.pri delete mode 100644 host/trace_streamer/src/trace_streamer.pro delete mode 100644 host/trace_streamer/src/trace_streamer/trace_streamer.pri create mode 100644 host/trace_streamer/test/test_fuzzer/README.md create mode 100644 host/trace_streamer/test/test_fuzzer/bytrace_fuzzer/BUILD.gn create mode 100644 host/trace_streamer/test/test_fuzzer/bytrace_fuzzer/bytrace_fuzzer.cpp create mode 100644 host/trace_streamer/test/test_fuzzer/bytrace_fuzzer/bytrace_fuzzer.h create mode 100644 host/trace_streamer/test/test_fuzzer/bytrace_fuzzer/project.xml create mode 100644 host/trace_streamer/test/test_fuzzer/htrace_fuzzer/BUILD.gn create mode 100644 host/trace_streamer/test/test_fuzzer/htrace_fuzzer/htrace_fuzzer.cpp create mode 100644 host/trace_streamer/test/test_fuzzer/htrace_fuzzer/htrace_fuzzer.h create mode 100644 host/trace_streamer/test/test_fuzzer/htrace_fuzzer/project.xml create mode 100644 host/trace_streamer/test/test_fuzzer/selector_fuzzer/BUILD.gn create mode 100644 host/trace_streamer/test/test_fuzzer/selector_fuzzer/project.xml create mode 100644 host/trace_streamer/test/test_fuzzer/selector_fuzzer/selector_fuzzer.cpp create mode 100644 host/trace_streamer/test/test_fuzzer/selector_fuzzer/selector_fuzzer.h create mode 100644 host/trace_streamer/test/unittest/hidump_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/htrace_cpu_data_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/htrace_diskio_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/htrace_network_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/htrace_process_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/http_server_test.cpp create mode 100644 host/trace_streamer/test/unittest/native_hook_parser_test.cpp create mode 100644 host/trace_streamer/test/unittest/rpc_server_test.cpp create mode 100644 host/trace_streamer/test/unittest/wasm_func_test.cpp diff --git a/host/ide/build.js b/host/ide/build.js index 6a5fbd5..dcdde43 100644 --- a/host/ide/build.js +++ b/host/ide/build.js @@ -24,6 +24,8 @@ const outDir = "dist" const staticPath = [ "/src/img", "/server/cert", + "/src/doc", + "/src/figures", ] const staticFiles = [ diff --git a/host/ide/package.json b/host/ide/package.json index bc4e0ea..8d9652f 100644 --- a/host/ide/package.json +++ b/host/ide/package.json @@ -1,12 +1,12 @@ { "name": "SmartPerf", "version": "1.0.0", - "description": "SmartPerf", + "description": "Smart Perf", "main": "index.js", "scripts": { "compile": "node ./build.js", - "test": "jest", - "test-c": "jest --coverage" + "test": "jest -u", + "test-c": "jest --coverage -u" }, "jest": { "testEnvironment": "jsdom", @@ -18,7 +18,8 @@ "!/dist/trace/database/uuidv4.min.js", "!/dist/trace/database/worker.sql-wasm.js", "!/dist/trace/database/worker.sql-wasm-debug.js", - "!/node_modules/" + "!/dist/trace/database/trace_streamer_builtin.js" + ], "globals": { "useWb": true @@ -26,7 +27,8 @@ "setupFiles": [ "jsdom-worker", "jest-canvas-mock" - ] + ], + "setupFilesAfterEnv":["/jest.setup.js"] }, "repository": { "type": "git", @@ -44,7 +46,10 @@ "jest": "*", "jest-canvas-mock": "^2.3.1", "typescript": "^4.2.3", - "jsdom-worker": "^0.2.1" + "jsdom-worker": "^0.2.1", + "jest-environment-jsdom": "^28.1.0", + "node-fetch": "^2.6.7" }, - "dependencies": {} + "dependencies": { + } } diff --git a/host/ide/server/main.go b/host/ide/server/main.go index 995cffe..dfd01a3 100644 --- a/host/ide/server/main.go +++ b/host/ide/server/main.go @@ -20,6 +20,7 @@ import ( "crypto/rsa" "crypto/x509" "crypto/x509/pkix" + "encoding/json" "encoding/pem" "math/big" "net" @@ -120,6 +121,7 @@ func main() { mime.AddExtensionType(".js", "application/javascript") log.Println(mime.TypeByExtension(".js")) mux.HandleFunc("/upload", uploadHandler) + mux.HandleFunc("/logger", consoleHandler) mux.Handle("/upload/", http.StripPrefix("/upload/", http.FileServer(http.Dir(exPath+"/upload")))) fs := http.FileServer(http.Dir(exPath + "/")) mux.Handle("/application/", http.StripPrefix("/application/", cors(fs, version))) @@ -135,6 +137,29 @@ func main() { select {} } +type LoggerReq struct { + FileName string `json:"fileName"` + FileSize string `json:"fileSize"` +} + +func consoleHandler(w http.ResponseWriter, r *http.Request) { + chekDir(exPath + "/logger") + var now = time.Now() + var fileName = fmt.Sprintf("%d-%d-%d", now.Year(), now.Month(), now.Day()) + dst, err := os.OpenFile(exPath+"/logger/"+fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND|os.O_SYNC, 0666) + CheckErr(err) + contentType := r.Header["Content-Type"] + if len(contentType) > 0 { + contentTypeName := contentType[0] + if strings.HasPrefix(contentTypeName, "application/json") { + decoder := json.NewDecoder(r.Body) + var req LoggerReq + decoder.Decode(&req) + dst.WriteString(fmt.Sprintf("%s %s (%s M)\n", now.Format("2006-01-02 15:04:05"), req.FileName, req.FileSize)) + fmt.Fprintf(w, fmt.Sprintf("日志写入成功%s", exPath)) + } + } +} func uploadHandler(w http.ResponseWriter, r *http.Request) { defer func() { var err = recover() diff --git a/host/ide/src/base-ui/button/LitButton.ts b/host/ide/src/base-ui/button/LitButton.ts index 516e1b8..fefe7e8 100644 --- a/host/ide/src/base-ui/button/LitButton.ts +++ b/host/ide/src/base-ui/button/LitButton.ts @@ -13,14 +13,15 @@ * limitations under the License. */ -import {BaseElement} from "../BaseElement.js"; +import {BaseElement, element} from "../BaseElement.js"; +@element('lit-button') export class LitButton extends BaseElement { + initElements(): void { + } + initHtml(): string { return ""; } - initElements(): void { - - } } \ No newline at end of file diff --git a/host/ide/src/base-ui/checkbox/LitCheckBox.ts b/host/ide/src/base-ui/checkbox/LitCheckBox.ts index a6b5d91..2939dd7 100644 --- a/host/ide/src/base-ui/checkbox/LitCheckBox.ts +++ b/host/ide/src/base-ui/checkbox/LitCheckBox.ts @@ -60,11 +60,10 @@ export class LitCheckBox extends BaseElement { return ` `; diff --git a/host/ide/src/base-ui/checkbox/LitCheckBoxWithText.ts b/host/ide/src/base-ui/checkbox/LitCheckBoxWithText.ts index 2de00a3..78ff088 100644 --- a/host/ide/src/base-ui/checkbox/LitCheckBoxWithText.ts +++ b/host/ide/src/base-ui/checkbox/LitCheckBoxWithText.ts @@ -70,24 +70,25 @@ export class LitCheckBoxWithText extends BaseElement { initHtml(): string { return ` - - - + + + + `; } diff --git a/host/ide/src/base-ui/icon.svg b/host/ide/src/base-ui/icon.svg index 168c113..65d5e04 100644 --- a/host/ide/src/base-ui/icon.svg +++ b/host/ide/src/base-ui/icon.svg @@ -1 +1,2191 @@ - + \ No newline at end of file diff --git a/host/ide/src/base-ui/menu/LitMainMenu.ts b/host/ide/src/base-ui/menu/LitMainMenu.ts index 008f584..04dcb8b 100644 --- a/host/ide/src/base-ui/menu/LitMainMenu.ts +++ b/host/ide/src/base-ui/menu/LitMainMenu.ts @@ -89,73 +89,74 @@ export class LitMainMenu extends BaseElement { initHtml(): string { return ` - + } + .header{ + display: grid; + background-color: var(--dark-background1,#FFFFFF); + border-bottom: 1px solid var(--dark-background1,#EFEFEF); + color: #47A7E0; + font-size: 1.4rem; + padding-left: 20px; + /*padding-right: 10px;*/ + gap: 0 20px; + box-sizing: border-box; + width: 100%; + height: 56px; + grid-template-columns: min-content 1fr min-content; + grid-template-rows: auto; + } + .header *{ + align-self: center; + user-select: none; + } + .version{ + color: #94979d; + padding: 20px; + font-size: 0.6rem; + width: 100%; + text-align: right; + } + *{ + box-sizing: border-box; + } + .menu-button{ + height: 47px; + width: 48px; + display: flex; + align-content: center; + justify-content: right; + cursor: pointer; + } +
- + +
- -
`; } } diff --git a/host/ide/src/base-ui/menu/LitMainMenuItem.ts b/host/ide/src/base-ui/menu/LitMainMenuItem.ts index 4af57f1..25a854e 100644 --- a/host/ide/src/base-ui/menu/LitMainMenuItem.ts +++ b/host/ide/src/base-ui/menu/LitMainMenuItem.ts @@ -85,72 +85,72 @@ export class LitMainMenuItem extends BaseElement { initHtml(): string { return ` - - - -`; + + + + `; } attributeChangedCallback(name: string, oldValue: string, newValue: string) { diff --git a/host/ide/src/base-ui/popover/LitPopoverV.ts b/host/ide/src/base-ui/popover/LitPopoverV.ts index 6fd0a08..eee4038 100644 --- a/host/ide/src/base-ui/popover/LitPopoverV.ts +++ b/host/ide/src/base-ui/popover/LitPopoverV.ts @@ -13,32 +13,32 @@ * limitations under the License. */ -import {element,BaseElement} from "../BaseElement.js"; +import {BaseElement, element} from "../BaseElement.js"; @element("lit-popover") export class LitPopover extends BaseElement { static get observedAttributes() { return [ - 'title',/*标题*/ - 'trigger',/*触发条件 hover | click | focus[未实现]*/ - 'width',/*自定义高度*/ - 'placement',/*设置方向 topLeft top topRight leftTop left leftBottom rightTop right rightBottom bottomLeft bottom bottomRight*/ - 'visible'/*控制popover是否显示*/ + 'title', + 'trigger', + 'width', + 'placement', + 'visible' ] } - initElements(): void { - } - get visible(){ + get visible() { return this.getAttribute('visible') || 'false'; } - set visible(value){ + + set visible(value) { if (value) { this.setAttribute('visible', 'true'); - }else{ + } else { this.setAttribute('visible', 'false'); } } + get trigger() { return this.getAttribute('trigger') || 'hover' } @@ -51,7 +51,7 @@ export class LitPopover extends BaseElement { return this.getAttribute('title'); } - set title(value:any) { + set title(value: any) { this.setAttribute('title', value); } @@ -63,13 +63,15 @@ export class LitPopover extends BaseElement { this.setAttribute('width', value); } - get haveRadio(){ + get haveRadio() { return this.getAttribute("haveRadio") } + initElements(): void { + + } + initHtml() { - // super(); - // const shadowRoot = this.attachShadow({mode: 'open'}); return ` -
-
-
-
+ +
+
+
+
`; } - } \ No newline at end of file diff --git a/host/ide/src/base-ui/radiobox/LitRadioBox.ts b/host/ide/src/base-ui/radiobox/LitRadioBox.ts index daef135..d5bf7bb 100644 --- a/host/ide/src/base-ui/radiobox/LitRadioBox.ts +++ b/host/ide/src/base-ui/radiobox/LitRadioBox.ts @@ -185,7 +185,10 @@ export class LitRadioBox extends BaseElement { `; diff --git a/host/ide/src/base-ui/select/LitSelect.ts b/host/ide/src/base-ui/select/LitSelect.ts index 460cac9..5f01625 100644 --- a/host/ide/src/base-ui/select/LitSelect.ts +++ b/host/ide/src/base-ui/select/LitSelect.ts @@ -17,586 +17,635 @@ import {BaseElement, element} from "../BaseElement.js"; @element('lit-select') export class LitSelect extends BaseElement { - private focused:any; - private inputElement:any; - private clearElement:any; - private iconElement:any; - private searchElement:any; - private multipleRootElement:any; - static get observedAttributes() { - return [ - 'value',//默认值 - 'default-value',//默认值 - 'placeholder',//placeholder - 'disabled', - 'loading',//是否处于加载状态 - 'allow-clear',//是否允许清除 - 'show-search',//是否允许搜索 - 'list-height',//设置弹窗滚动高度 默认256px - 'border',//是否显示边框 - 'mode',// mode='multiple'多选 - ]; - } - initElements(): void { - - } - - get value() { - return this.getAttribute('value') || this.defaultValue; - } - - set value(value) { - this.setAttribute('value', value); - } - - get border() { - return this.getAttribute('border') || 'true'; - } - - set border(value) { - if (value) { - this.setAttribute('border', 'true'); - } else { - this.setAttribute('border', 'false'); - } - } - - get listHeight() { - return this.getAttribute('list-height') || '256px'; - } - - set listHeight(value) { - this.setAttribute('list-height', value); - } - - get defaultPlaceholder() { - return this.getAttribute('placeholder') || '请选择'; - } - - get showSearch() { - return this.hasAttribute('show-search'); - } - - set defaultValue(value) { - this.setAttribute('default-value', value); - } - - get defaultValue() { - return this.getAttribute('default-value') || ''; - } - - set placeholder(value) { - this.setAttribute('placeholder', value); - } - - get placeholder() { - return this.getAttribute('placeholder') || this.defaultPlaceholder; - } - - get loading() { - return this.hasAttribute('loading'); - } - - set loading(value) { - if (value) { - this.setAttribute('loading', ''); - } else { - this.removeAttribute('loading') - } - } - - initHtml() { - // super(); - // const shadowRoot = this.attachShadow({mode: 'open'}); - return` + private focused: any; + private inputElement: any; + private clearElement: any; + private iconElement: any; + private searchElement: any; + private multipleRootElement: any; + + static get observedAttributes() { + return [ + 'value', + 'default-value', + 'placeholder', + 'disabled', + 'loading', + 'allow-clear', + 'show-search', + 'list-height', + 'border', + 'mode', + ]; + } + + get value() { + return this.getAttribute('value') || this.defaultValue; + } + + set value(value) { + this.setAttribute('value', value); + } + + get rounded() { + return this.hasAttribute("rounded"); + } + + set rounded(rounded: boolean) { + if (rounded) { + this.setAttribute("rounded", ''); + } else { + this.removeAttribute("rounded"); + } + } + + get placement(): string { + return this.getAttribute("placement") || ""; + } + + set placement(placement: string) { + if (placement) { + this.setAttribute("placement", placement); + } else { + this.removeAttribute("placement"); + } + } + + get border() { + return this.getAttribute('border') || 'true'; + } + + set border(value) { + if (value) { + this.setAttribute('border', 'true'); + } else { + this.setAttribute('border', 'false'); + } + } + + get listHeight() { + return this.getAttribute('list-height') || '256px'; + } + + set listHeight(value) { + this.setAttribute('list-height', value); + } + + get defaultPlaceholder() { + return this.getAttribute('placeholder') || '请选择'; + } + + set canInsert(can:boolean) { + if (can) { + this.setAttribute("canInsert",''); + } else { + this.removeAttribute("canInsert") + } + } + + get canInsert() { + return this.hasAttribute("canInsert") + } + get showSearch() { + return this.hasAttribute('show-search'); + } + + get defaultValue() { + return this.getAttribute('default-value') || ''; + } + + set defaultValue(value) { + this.setAttribute('default-value', value); + } + + get placeholder() { + return this.getAttribute('placeholder') || this.defaultPlaceholder; + } + + set placeholder(value) { + this.setAttribute('placeholder', value); + } + + get loading() { + return this.hasAttribute('loading'); + } + + set loading(value) { + if (value) { + this.setAttribute('loading', ''); + } else { + this.removeAttribute('loading') + } + } + + set dataSource(value: any) { + value.forEach((a: any) => { + let option = document.createElement('lit-select-option'); + option.setAttribute('value', a.key); + option.textContent = a.val; + this.append(option) + }) + this.initOptions(); + } + + initElements(): void { + } + + initHtml() { + return ` -
-
- - - - -
-
- - -
+ +
+
+
+ + + + +
+
+ + +
` - } - - isMultiple() { - return this.hasAttribute('mode') && this.getAttribute('mode') === 'multiple' - } - - newTag(value:any, text:any) { - let tag:any = document.createElement('div'); - let icon:any = document.createElement('lit-icon'); - icon.classList.add('tag-close') - icon.name = 'close' - let span = document.createElement('span'); - tag.classList.add('tag'); - span.dataset['value'] = value; - span.textContent = text; - tag.append(span); - tag.append(icon); - icon.onclick = (ev:any) => { - tag.parentElement.removeChild(tag); - this.querySelector(`lit-select-option[value=${value}]`)!.removeAttribute('selected') - if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { - this.inputElement.style.width = 'auto'; - this.inputElement.placeholder = this.defaultPlaceholder; - } - ev.stopPropagation(); - } - tag.value = value; - tag.dataset['value'] = value; - tag.text = text; - tag.dataset['text'] = text; - return tag; - } - - //当 custom element首次被插入文档DOM时,被调用。 - connectedCallback() { - this.tabIndex = 0;//设置当前组件为可以获取焦点 - this.focused = false; - this.inputElement = this.shadowRoot!.querySelector('input'); - this.clearElement = this.shadowRoot!.querySelector('.clear'); - this.iconElement = this.shadowRoot!.querySelector('.icon'); - this.searchElement = this.shadowRoot!.querySelector('.search'); - this.multipleRootElement = this.shadowRoot!.querySelector('.multipleRoot'); - //点击清理 清空input值,展示placeholder, - this.clearElement.onclick = (ev:any) => { - if (this.isMultiple()) { - let delNodes:Array = [] - this.multipleRootElement.childNodes.forEach((a:any) => { - if (a.tagName === 'DIV') { - delNodes.push(a); - } - }) - for (let i = 0; i < delNodes.length; i++) { - delNodes[i].remove(); - } - if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { - this.inputElement.style.width = 'auto'; - this.inputElement.placeholder = this.defaultPlaceholder; - } - } - this.querySelectorAll('lit-select-option').forEach(a => a.removeAttribute('selected')); - this.inputElement.value = '' - this.clearElement.style.display = 'none'; - this.iconElement.style.display = 'flex'; - this.blur(); - ev.stopPropagation();//这里不会因为点击清理而触发 选择栏目显示或者隐藏 - this.dispatchEvent(new CustomEvent('onClear', {detail: ev}))//向外派发清理事件 - } - //初始化时遍历所有的option节点 - this.initOptions(); - //当前控件点击时 如果时select本身 需要显示 或 隐藏选择栏目,通过this.focused变量控制(默认为false) - this.onclick = (ev:any) => { - if (ev.target.tagName === 'LIT-SELECT') { - if (this.focused === false) { - this.inputElement.focus(); - this.focused = true; - } else { - this.blur(); - this.focused = false; - } - } - } - this.onmouseover = this.onfocus = ev => { - if (this.hasAttribute('allow-clear')) { - if (this.inputElement.value.length > 0 || this.inputElement.placeholder !== this.defaultPlaceholder) { - this.clearElement.style.display = 'flex' - this.iconElement.style.display = 'none'; - } else { - this.clearElement.style.display = 'none' - this.iconElement.style.display = 'flex'; - } - } - } - this.onmouseout = this.onblur = ev => { - if (this.hasAttribute('allow-clear')) { - this.clearElement.style.display = 'none'; - this.iconElement.style.display = 'flex'; - } - this.focused = false; - } - //输入框获取焦点时,value值 暂存于 placeholder 然后value值清空,这样值会以placeholder形式灰色展示,鼠标位于第一个字符 - this.inputElement.onfocus = (ev:any) => { - if (this.hasAttribute('disabled')) return;//如果控件处于disabled状态 直接忽略 - if (this.inputElement.value.length > 0) { - this.inputElement.placeholder = this.inputElement.value; - this.inputElement.value = '' - } - if (this.hasAttribute('show-search')) {//如果有show-search属性 需要显示放大镜,隐藏向下的箭头 - this.searchElement.style.display = 'flex'; - this.iconElement.style.display = 'none'; - } - this.querySelectorAll('lit-select-option').forEach(a => {//input获取焦点时显示所有可选项,相当于清理了搜索结果 - // @ts-ignore - a.style.display = 'flex'; - }) - } - //当输入框失去焦点的时候 placeholder 的值 保存到value上,input显示值 - this.inputElement.onblur = (ev:any) => { - if (this.hasAttribute('disabled')) return;//如果控件处于disabled状态 直接忽略 - if (this.isMultiple()) { - if (this.hasAttribute('show-search')) {//如果有show-search属性 失去焦点需要 隐藏放大镜图标,显示默认的向下箭头图标 - this.searchElement.style.display = 'none'; - this.iconElement.style.display = 'flex'; - } - } else { - if (this.inputElement.placeholder !== this.defaultPlaceholder) {//如果placeholder为 请输入(默认值)不做处理 - this.inputElement.value = this.inputElement.placeholder; //placeholder 保存的值放入 value中 - this.inputElement.placeholder = this.defaultPlaceholder;//placeholder 值为 默认值(请输入) - } - if (this.hasAttribute('show-search')) {//如果有show-search属性 失去焦点需要 隐藏放大镜图标,显示默认的向下箭头图标 - this.searchElement.style.display = 'none'; - this.iconElement.style.display = 'flex'; - } - } - } - //输入框每次文本变化 会匹配搜索的option 显示或者隐藏,达到搜索的效果 - this.inputElement.oninput = (ev:any) => { - let els = [...this.querySelectorAll('lit-select-option')]; - if (!ev.target.value) { - els.forEach((a:any) => a.style.display = 'flex'); - } else { - els.forEach((a:any) => { - let value = a.getAttribute('value'); - if (value.toLowerCase().indexOf(ev.target.value.toLowerCase()) !== -1 || - a.textContent.toLowerCase().indexOf(ev.target.value.toLowerCase()) !== -1) { - a.style.display = 'flex'; - } else { - a.style.display = 'none'; - } - }) - } - } - //输入框按下回车键,自动输入当前搜索出来的第一行,及display!='none'的第一个,搜索会隐藏其他行 - this.inputElement.onkeydown = (ev:any) => { - if (ev.key === 'Backspace') { - if (this.isMultiple()) { - let tag = this.multipleRootElement.lastElementChild.previousElementSibling; - if (tag) { - this.querySelector(`lit-select-option[value=${tag.value}]`)?.removeAttribute('selected'); - tag.remove() - if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { - this.inputElement.style.width = 'auto'; - this.inputElement.placeholder = this.defaultPlaceholder; - } - } - } else { - this.clear(); - this.dispatchEvent(new CustomEvent('onClear', {detail: ev}))//向外派发清理事件 - } - } else if (ev.key === 'Enter') { - let filter = [...this.querySelectorAll('lit-select-option')].filter((a:any) => a.style.display !== 'none'); - if (filter.length > 0) { - this.inputElement.value = filter[0].textContent; - this.inputElement.placeholder = filter[0].textContent; - this.blur(); - // @ts-ignore - this.value=filter[0].getAttribute('value') - this.dispatchEvent(new CustomEvent('change', { - detail: { - selected: true, - value: filter[0].getAttribute('value'), - text: filter[0].textContent - } - }));//向外层派发change事件,返回当前选中项 - } - } - } - } - - initOptions(){ - this.querySelectorAll('lit-select-option').forEach(a => { - //如果节点的值为 当前控件的默认值 defalut-value则 显示该值对应的option文本 - if (this.isMultiple()) { - a.setAttribute('check', ''); - if (a.getAttribute('value') === this.defaultValue) { - let tag = this.newTag(a.getAttribute('value'), a.textContent); - this.multipleRootElement.insertBefore(tag, this.inputElement); - this.inputElement.placeholder = ''; - this.inputElement.value = ''; - this.inputElement.style.width = '1px'; - a.setAttribute('selected', ''); - } - // this.inputElement.focus(); - } else { - if (a.getAttribute('value') === this.defaultValue) { - this.inputElement.value = a.textContent; - a.setAttribute('selected', ''); - } - } - //每个option设置onSelected事件 接受当前点击的option - a.addEventListener('onSelected', (e:any) => { - //所有option设置为未选中状态 - if (this.isMultiple()) {//多选 - if (a.hasAttribute('selected')) { - let tag = this.shadowRoot!.querySelector(`div[data-value=${e.detail.value}]`); - // @ts-ignore - tag.parentElement!.removeChild(tag); - e.detail.selected = false; - } else { - let tag = this.newTag(e.detail.value, e.detail.text); - this.multipleRootElement.insertBefore(tag, this.inputElement); - this.inputElement.placeholder = ''; - this.inputElement.value = ''; - this.inputElement.style.width = '1px'; - } - if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { - this.inputElement.style.width = 'auto'; - this.inputElement.placeholder = this.defaultPlaceholder; - } - this.inputElement.focus(); - } else {//单选 - [...this.querySelectorAll('lit-select-option')].forEach(a => a.removeAttribute('selected')) - this.blur();//失去焦点,隐藏选择栏目列表 - // @ts-ignore - this.inputElement.value = e.detail.text; - } - //设置当前option为选择状态 - if (a.hasAttribute('selected')) { - a.removeAttribute('selected') - } else { - a.setAttribute('selected', '') - } - //设置input的值为当前选择的文本 - // @ts-ignore - this.value = e.detail.value; - this.dispatchEvent(new CustomEvent('change', {detail: e.detail}));//向外层派发change事件,返回当前选中项 - }) - }) - } - //js调用清理选项 - clear() { - this.inputElement.value = ''; - this.inputElement.placeholder = this.defaultPlaceholder; - } - - //重置为默认值 - reset() { - this.querySelectorAll('lit-select-option').forEach(a => { - //如果节点的值为 当前控件的默认值 defalut-value则 显示该值对应的option文本 - [...this.querySelectorAll('lit-select-option')].forEach(a => a.removeAttribute('selected')) - if (a.getAttribute('value') === this.defaultValue) { - this.inputElement.value = a.textContent; - a.setAttribute('selected', ''); - } - }) - } - - //当 custom element从文档DOM中删除时,被调用。 - disconnectedCallback() { - - } - - //当 custom element被移动到新的文档时,被调用。 - adoptedCallback() { - } - - //当 custom element增加、删除、修改自身属性时,被调用。 - attributeChangedCallback(name:any, oldValue:any, newValue:any) { - if (name === 'value' && this.inputElement) { - if(newValue){ - [...this.querySelectorAll('lit-select-option')].forEach(a => { - if (a.getAttribute('value') === newValue) { - a.setAttribute('selected', ''); - this.inputElement.value = a.textContent; - } else { - a.removeAttribute('selected') - } - }) - }else{ - this.clear(); - } - } - } - set dataSource(value:any){ - value.forEach((a:any)=>{ - let option = document.createElement('lit-select-option'); - option.setAttribute('value',a.key); - option.textContent = a.val; - this.append(option) - }) - this.initOptions(); - } + } + + isMultiple() { + return this.hasAttribute('mode') && this.getAttribute('mode') === 'multiple' + } + + newTag(value: any, text: any) { + let tag: any = document.createElement('div'); + let icon: any = document.createElement('lit-icon'); + icon.classList.add('tag-close') + icon.name = 'close' + let span = document.createElement('span'); + tag.classList.add('tag'); + span.dataset['value'] = value; + span.textContent = text; + tag.append(span); + tag.append(icon); + icon.onclick = (ev: any) => { + tag.parentElement.removeChild(tag); + this.querySelector(`lit-select-option[value=${value}]`)!.removeAttribute('selected') + if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { + this.inputElement.style.width = 'auto'; + this.inputElement.placeholder = this.defaultPlaceholder; + } + ev.stopPropagation(); + } + tag.value = value; + tag.dataset['value'] = value; + tag.text = text; + tag.dataset['text'] = text; + return tag; + } + + connectedCallback() { + this.tabIndex = 0; + this.focused = false; + this.inputElement = this.shadowRoot!.querySelector('input'); + this.clearElement = this.shadowRoot!.querySelector('.clear'); + this.iconElement = this.shadowRoot!.querySelector('.icon'); + this.searchElement = this.shadowRoot!.querySelector('.search'); + this.multipleRootElement = this.shadowRoot!.querySelector('.multipleRoot'); + this.clearElement.onclick = (ev: any) => { + if (this.isMultiple()) { + let delNodes: Array = [] + this.multipleRootElement.childNodes.forEach((a: any) => { + if (a.tagName === 'DIV') { + delNodes.push(a); + } + }) + for (let i = 0; i < delNodes.length; i++) { + delNodes[i].remove(); + } + if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { + this.inputElement.style.width = 'auto'; + this.inputElement.placeholder = this.defaultPlaceholder; + } + } + this.querySelectorAll('lit-select-option').forEach(a => a.removeAttribute('selected')); + this.inputElement.value = '' + this.clearElement.style.display = 'none'; + this.iconElement.style.display = 'flex'; + this.blur(); + ev.stopPropagation(); + this.dispatchEvent(new CustomEvent('onClear', {detail: ev})) + } + this.initOptions(); + this.onclick = (ev: any) => { + if (ev.target.tagName === 'LIT-SELECT') { + if (this.focused === false) { + this.inputElement.focus(); + this.focused = true; + } else { + this.blur(); + this.focused = false; + } + } + } + this.onmouseover = this.onfocus = ev => { + if (this.focused === false && this.hasAttribute("adaptive-expansion")) { + let body = this.shadowRoot!.querySelector(".body"); + if (this.parentElement!.offsetTop < body!.clientHeight) { + body!.classList.add('body-bottom'); + } else { + body!.classList.remove('body-bottom'); + } + } + if (this.hasAttribute('allow-clear')) { + if (this.inputElement.value.length > 0 || this.inputElement.placeholder !== this.defaultPlaceholder) { + this.clearElement.style.display = 'flex' + this.iconElement.style.display = 'none'; + } else { + this.clearElement.style.display = 'none' + this.iconElement.style.display = 'flex'; + } + } + } + this.onmouseout = this.onblur = ev => { + if (this.hasAttribute('allow-clear')) { + this.clearElement.style.display = 'none'; + this.iconElement.style.display = 'flex'; + } + this.focused = false; + } + this.inputElement.onfocus = (ev: any) => { + if (this.hasAttribute('disabled')) return; + if (this.inputElement.value.length > 0) { + this.inputElement.placeholder = this.inputElement.value; + this.inputElement.value = '' + } + if (this.hasAttribute('show-search')) { + this.searchElement.style.display = 'flex'; + this.iconElement.style.display = 'none'; + } + this.querySelectorAll('lit-select-option').forEach(a => { + // @ts-ignore + a.style.display = 'flex'; + }) + } + this.inputElement.onblur = (ev: any) => { + if (this.hasAttribute('disabled')) return; + if (this.isMultiple()) { + if (this.hasAttribute('show-search')) { + this.searchElement.style.display = 'none'; + this.iconElement.style.display = 'flex'; + } + } else { + if (this.inputElement.placeholder !== this.defaultPlaceholder) { + this.inputElement.value = this.inputElement.placeholder; + this.inputElement.placeholder = this.defaultPlaceholder; + } + if (this.hasAttribute('show-search')) { + this.searchElement.style.display = 'none'; + this.iconElement.style.display = 'flex'; + } + } + } + this.inputElement.oninput = (ev: any) => { + let els = [...this.querySelectorAll('lit-select-option')]; + if(this.hasAttribute("show-search")) { + if (!ev.target.value) { + els.forEach((a: any) => a.style.display = 'flex'); + } else { + els.forEach((a: any) => { + let value = a.getAttribute('value'); + if (value.toLowerCase().indexOf(ev.target.value.toLowerCase()) !== -1 || + a.textContent.toLowerCase().indexOf(ev.target.value.toLowerCase()) !== -1) { + a.style.display = 'flex'; + } else { + a.style.display = 'none'; + } + }) + } + } else { + this.value = ev.target.value + } + } + this.inputElement.onkeydown = (ev: any) => { + if (ev.key === 'Backspace') { + if (this.isMultiple()) { + let tag = this.multipleRootElement.lastElementChild.previousElementSibling; + if (tag) { + this.querySelector(`lit-select-option[value=${tag.value}]`)?.removeAttribute('selected'); + tag.remove() + if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { + this.inputElement.style.width = 'auto'; + this.inputElement.placeholder = this.defaultPlaceholder; + } + } + } else { + this.clear(); + this.dispatchEvent(new CustomEvent('onClear', {detail: ev}))//向外派发清理事件 + } + } else if (ev.key === 'Enter') { + if (!this.canInsert) { + let filter = [...this.querySelectorAll('lit-select-option')].filter((a: any) => a.style.display !== 'none'); + if (filter.length > 0) { + this.inputElement.value = filter[0].textContent; + this.inputElement.placeholder = filter[0].textContent; + this.blur(); + // @ts-ignore + this.value = filter[0].getAttribute('value') + this.dispatchEvent(new CustomEvent('change', { + detail: { + selected: true, + value: filter[0].getAttribute('value'), + text: filter[0].textContent + } + })); + } + } + } + } + } + + initOptions() { + this.querySelectorAll('lit-select-option').forEach(a => { + if (this.isMultiple()) { + a.setAttribute('check', ''); + if (a.getAttribute('value') === this.defaultValue) { + let tag = this.newTag(a.getAttribute('value'), a.textContent); + this.multipleRootElement.insertBefore(tag, this.inputElement); + this.inputElement.placeholder = ''; + this.inputElement.value = ''; + this.inputElement.style.width = '1px'; + a.setAttribute('selected', ''); + } + } else { + if (a.getAttribute('value') === this.defaultValue) { + this.inputElement.value = a.textContent; + a.setAttribute('selected', ''); + } + } + a.addEventListener('onSelected', (e: any) => { + if (this.isMultiple()) { + if (a.hasAttribute('selected')) { + let tag = this.shadowRoot!.querySelector(`div[data-value=${e.detail.value}]`) as HTMLElement; + if (tag) { + tag.parentElement!.removeChild(tag); + } + e.detail.selected = false; + } else { + let tag = this.newTag(e.detail.value, e.detail.text); + this.multipleRootElement.insertBefore(tag, this.inputElement); + this.inputElement.placeholder = ''; + this.inputElement.value = ''; + this.inputElement.style.width = '1px'; + } + if (this.shadowRoot!.querySelectorAll('.tag').length == 0) { + this.inputElement.style.width = 'auto'; + this.inputElement.placeholder = this.defaultPlaceholder; + } + this.inputElement.focus(); + } else { + [...this.querySelectorAll('lit-select-option')].forEach(a => a.removeAttribute('selected')) + this.blur(); + // @ts-ignore + this.inputElement.value = e.detail.text; + } + if (a.hasAttribute('selected')) { + a.removeAttribute('selected') + } else { + a.setAttribute('selected', '') + } + // @ts-ignore + this.value = e.detail.value; + this.dispatchEvent(new CustomEvent('change', {detail: e.detail}));//向外层派发change事件,返回当前选中项 + }) + }) + } + + clear() { + this.inputElement.value = ''; + this.inputElement.placeholder = this.defaultPlaceholder; + } + + reset() { + this.querySelectorAll('lit-select-option').forEach(a => { + [...this.querySelectorAll('lit-select-option')].forEach(a => a.removeAttribute('selected')) + if (a.getAttribute('value') === this.defaultValue) { + this.inputElement.value = a.textContent; + a.setAttribute('selected', ''); + } + }) + } + + disconnectedCallback() { + + } + + adoptedCallback() { + } + + attributeChangedCallback(name: any, oldValue: any, newValue: any) { + if (name === 'value' && this.inputElement) { + if (newValue) { + [...this.querySelectorAll('lit-select-option')].forEach(a => { + if (a.getAttribute('value') === newValue) { + a.setAttribute('selected', ''); + this.inputElement.value = a.textContent; + } else { + a.removeAttribute('selected') + } + }) + } else { + this.clear(); + } + } + } } diff --git a/host/ide/src/base-ui/select/LitSelectOption.ts b/host/ide/src/base-ui/select/LitSelectOption.ts index 440097f..0d1b967 100644 --- a/host/ide/src/base-ui/select/LitSelectOption.ts +++ b/host/ide/src/base-ui/select/LitSelectOption.ts @@ -17,14 +17,14 @@ import {BaseElement} from "../BaseElement.js"; import "../icon/LitIcon.js" export class LitSelectOption extends BaseElement { - static get observedAttributes() { - return ['selected','disabled','check'] - } + static get observedAttributes() { + return ['selected', 'disabled', 'check'] + } - initHtml() { - // super(); - // const shadowRoot = this.attachShadow({mode: 'open'}); - return` + initHtml() { + // super(); + // const shadowRoot = this.attachShadow({mode: 'open'}); + return `
- +
` - } + } - initElements(): void { + initElements(): void { - } + } - //当 custom element首次被插入文档DOM时,被调用。 - connectedCallback() { - if(!this.hasAttribute('disabled')){ - this.onclick=ev => { - this.dispatchEvent(new CustomEvent('onSelected',{detail:{ - selected:true, - value: this.getAttribute('value'), - text: this.textContent - }})) - } - } + //当 custom element首次被插入文档DOM时,被调用。 + connectedCallback() { + if (!this.hasAttribute('disabled')) { + this.onclick = ev => { + this.dispatchEvent(new CustomEvent('onSelected', { + detail: { + selected: true, + value: this.getAttribute('value'), + text: this.textContent + } + })) + } + } - } + } - //当 custom element从文档DOM中删除时,被调用。 - disconnectedCallback() { + //当 custom element从文档DOM中删除时,被调用。 + disconnectedCallback() { - } + } - //当 custom element被移动到新的文档时,被调用。 - adoptedCallback() { - } + //当 custom element被移动到新的文档时,被调用。 + adoptedCallback() { + } - //当 custom element增加、删除、修改自身属性时,被调用。 - attributeChangedCallback(name:any, oldValue:any, newValue:any) { + //当 custom element增加、删除、修改自身属性时,被调用。 + attributeChangedCallback(name: any, oldValue: any, newValue: any) { - } + } } if (!customElements.get('lit-select-option')) { - customElements.define('lit-select-option', LitSelectOption); + customElements.define('lit-select-option', LitSelectOption); } diff --git a/host/ide/src/base-ui/slider/LitSlider.ts b/host/ide/src/base-ui/slider/LitSlider.ts index fa70421..9cd7d1e 100644 --- a/host/ide/src/base-ui/slider/LitSlider.ts +++ b/host/ide/src/base-ui/slider/LitSlider.ts @@ -21,54 +21,57 @@ export class LitSlider extends BaseElement { private litSlider: HTMLInputElement | undefined | null; private litSliderCon: HTMLDivElement | undefined | null; private litResult: HTMLInputElement | undefined | null; - private litSliderButton: HTMLDivElement | undefined | null; private slotEl: HTMLSlotElement | undefined | null; private currentValue: number = 0; - private sliderLineHeight: string | undefined; - private sliderButtonHeight: string | undefined; - private sliderButtonWidth: string | undefined; private defaultTimeText: string | undefined | null; static get observedAttributes() { return ['percent', 'disabled-X', 'custom-slider', 'custom-line', 'custom-button'] } - get sliderStyle() { - if (this.hasAttribute('custom-slider')) { - this.defaultTimeText = "64"; - return { - minRange: 4, - maxRange: 512, - defaultValue: this.defaultTimeText, - resultUnit: "MB", - stepSize: 2, - lineColor: "var(--dark-color3,#46B1E3)", - buttonColor: "#999999" - } + get sliderStyle(): LitSliderStyle { + if (this.litSliderStyle) { + return this.litSliderStyle } else { - let defaultTime = "00:00:50"; - this.defaultTimeText = defaultTime.split(':')[2]; return { - minRange: 10, - maxRange: 600, - defaultValue: defaultTime, - resultUnit: "h:m:s", + minRange: 0, + maxRange: 100, + defaultValue: "0", + resultUnit: "", stepSize: 1, - lineColor: "var(--dark-color4,#61CFBE)", + lineColor: "var(--dark-color3,#46B1E3)", buttonColor: "#999999" } } - } - set sliderStyle(value) { + set sliderStyle(value: LitSliderStyle) { this.litSliderStyle = value; - this.litSliderStyle = this.sliderStyle; + this.currentValue = Number(value.defaultValue) this.litSliderStyle.defaultValue = value.defaultValue - if (this.hasAttribute('custom-slider')) { - this.renderCustomSlider(); + if (this.litSliderStyle.resultUnit === 'h:m:s') { + let timeData = this.litSliderStyle.defaultValue.split(':'); + let timeSize = Number(timeData[0]) * 3600 + Number(timeData[1]) * 60 + Number(timeData[2]); + this.defaultTimeText = timeSize.toString() + let defaultSize = (timeSize - this.litSliderStyle.minRange) * 100 / (this.litSliderStyle + .maxRange - this.litSliderStyle.minRange); + this.litSlider!.style.backgroundSize = defaultSize + '%' } else { - this.renderDefaultSlider(); + this.defaultTimeText = this.litSliderStyle.defaultValue + this.litSlider!.style.backgroundSize = '0%' + if (Number(this.litSliderStyle.defaultValue)) { + let defaultSize = (Number(this.litSliderStyle.defaultValue) - this.litSliderStyle.minRange) + / (this.litSliderStyle.maxRange - this.litSliderStyle.minRange) * 100; + this.litSlider!.style.backgroundSize = defaultSize + '%' + } + } + let htmlInputElement = this.shadowRoot?.querySelector('#slider') as HTMLInputElement; + let attribute = htmlInputElement.getAttribute('type'); + if (attribute === 'range') { + htmlInputElement!.setAttribute('value', this.defaultTimeText!) + htmlInputElement!.setAttribute('min', this.litSliderStyle!.minRange.toString()) + htmlInputElement!.setAttribute('max', this.litSliderStyle!.maxRange.toString()) + htmlInputElement!.setAttribute('step', this.litSliderStyle!.stepSize.toString()) } } @@ -118,6 +121,9 @@ export class LitSlider extends BaseElement { set percent(value: string) { this.setAttribute('percent', value); + if (Number(this.sliderStyle.defaultValue)) { + this.currentValue = Number(this.sliderStyle.defaultValue) + } } get resultUnit() { @@ -128,20 +134,11 @@ export class LitSlider extends BaseElement { this.setAttribute('resultUnit', value); } - get sliderSize() { - return this.currentValue; - } - initElements(): void { + this.litSlider = this.shadowRoot?.querySelector('#slider') as HTMLInputElement; } initHtml(): string { - this.litSliderStyle = this.sliderStyle; - this.currentValue = Number(this.sliderStyle.defaultValue); - let parentElement = this.parentNode as Element; - if (parentElement) { - parentElement.setAttribute('percent', this.defaultTimeText + ""); - } return `
- - ${this.litSliderStyle?.resultUnit} +
` } @@ -296,64 +248,35 @@ export class LitSlider extends BaseElement { // It is called when the custom element is first inserted into the document DOM. connectedCallback() { this.slotEl = this.shadowRoot?.querySelector('#slot'); - this.litSlider = this.shadowRoot?.querySelector('#slider'); this.litSliderCon = this.shadowRoot?.querySelector('#slider-con'); - this.litResult = this.shadowRoot?.querySelector('#result'); // Add a slider for input event listeners this.litSlider?.addEventListener('input', this.inputChangeEvent) this.litSlider?.addEventListener('change', this.inputChangeEvent) - // Add slot slot to change event listeners - this.slotEl?.addEventListener('slotchange', this.slotChangeEvent); - // Add a slider for line click event listeners - this.litSlider?.addEventListener('click', this.sliderClickEvent); - // Add a slider button to start touching the event listener - this.litSliderButton?.addEventListener('TouchEvent', this.sliderStartTouchEvent); this.litSliderStyle = this.sliderStyle; } - slotChangeEvent = (event: any) => { - } - - sliderClickEvent = (event: any) => { - } - inputChangeEvent = (event: any) => { if (this.litSlider) { this.currentValue = parseInt(this.litSlider?.value) - let resultNumber = (this.currentValue - this.litSliderStyle!.minRange) * 100 / (this.litSliderStyle!.maxRange - this.litSliderStyle!.minRange); - this.percent = Math.floor(resultNumber) + "%"; + let resultNumber = (this.currentValue - this.litSliderStyle!.minRange) * 100 / (this + .litSliderStyle!.maxRange - this.litSliderStyle!.minRange); + this.percent = Number(resultNumber) + "%"; this.litSliderCon?.style.setProperty('percent', this.currentValue + "%") let parentElement = this.parentNode as Element; parentElement.setAttribute('percent', this.currentValue + ""); - if (this.sliderStyle.resultUnit === 'MB') { + if (this.sliderStyle.resultUnit === 'h:m:s') { this.litSlider!.style.backgroundSize = this.percent; - this.litResult!.value = " " + this.currentValue; - } else if (this.sliderStyle.resultUnit === 'h:m:s') { + } else { this.litSlider!.style.backgroundSize = this.percent; - let time = this.formatSeconds(this.litSlider?.value); - this.litResult!.value = " " + time; } + this.parentElement!.setAttribute('percent', this.litSlider?.value) } } - sliderStartTouchEvent = (event: any) => { - - } - - sliderMoveTouchEvent = (event: any) => { - - } - - sliderEndTouchEvent = (event: any) => { - - } - disconnectedCallback() { this.litSlider?.removeEventListener('input', this.inputChangeEvent); this.litSlider?.removeEventListener('change', this.inputChangeEvent) - this.litSlider?.removeEventListener('click', this.sliderClickEvent); - this.litSliderButton?.removeEventListener('TouchEvent', this.sliderStartTouchEvent); } adoptedCallback() { @@ -374,17 +297,23 @@ export class LitSlider extends BaseElement { } } - renderCustomSlider() { - } - renderDefaultSlider() { - if (!this.litSliderStyle) return; + let htmlInputElement = this.shadowRoot?.querySelector('#slider') as HTMLInputElement; + let attribute = htmlInputElement.getAttribute('type'); + if (attribute === 'range') { + htmlInputElement!.setAttribute('value', this.defaultTimeText!) + htmlInputElement!.setAttribute('min', this.litSliderStyle!.minRange.toString()) + htmlInputElement!.setAttribute('max', this.litSliderStyle!.maxRange.toString()) + htmlInputElement!.setAttribute('step', this.litSliderStyle!.stepSize.toString()) + } } formatSeconds(value: string) { let result = parseInt(value) - let hours = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600); - let minute = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60)); + let hours = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math + .floor(result / 3600); + let minute = Math.floor((result / 60 % 60)) < 10 ? '0' + Math + .floor((result / 60 % 60)) : Math.floor((result / 60 % 60)); let second = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60)); let resultTime = ''; if (hours === '00') { @@ -407,7 +336,7 @@ export interface LitSliderStyle { maxRange: number defaultValue: string resultUnit: string - stepSize?: number + stepSize: number lineColor?: string buttonColor?: string } diff --git a/host/ide/src/base-ui/switch/lit-switch.ts b/host/ide/src/base-ui/switch/lit-switch.ts index 2dc25ea..b9bf2e4 100644 --- a/host/ide/src/base-ui/switch/lit-switch.ts +++ b/host/ide/src/base-ui/switch/lit-switch.ts @@ -71,9 +71,14 @@ export default class LitSwitch extends BaseElement { height:1.2em; padding:.125em; border-radius:1.2em; - background:#eee; + background: #3391FF; transition:.3s width,.3s height,.3s background-color; } + + :host(:not([checked])) #name { + background: #999999; + } + #name::before{ content:''; flex:0; diff --git a/host/ide/src/base-ui/table/lit-table-column.ts b/host/ide/src/base-ui/table/lit-table-column.ts index b66d300..9c9f195 100644 --- a/host/ide/src/base-ui/table/lit-table-column.ts +++ b/host/ide/src/base-ui/table/lit-table-column.ts @@ -25,13 +25,13 @@ export class LitTableColumn extends HTMLElement { super(); const shadowRoot = this.attachShadow({mode: 'open'}); shadowRoot.innerHTML = ` - - + + ` } diff --git a/host/ide/src/base-ui/table/lit-table.ts b/host/ide/src/base-ui/table/lit-table.ts index 7a6dab1..ec325bd 100644 --- a/host/ide/src/base-ui/table/lit-table.ts +++ b/host/ide/src/base-ui/table/lit-table.ts @@ -13,7 +13,6 @@ * limitations under the License. */ - import {LitTableColumn} from "./lit-table-column.js"; import {element} from "../BaseElement.js"; import "../utils/Template.js" @@ -24,6 +23,7 @@ export class LitTable extends HTMLElement { meauseRowElement: HTMLDivElement | undefined currentRecycleList: HTMLDivElement[] = [] currentTreeDivList: HTMLDivElement[] = [] + public rememberScrollTop = false private ds: Array = [] private recycleDs: Array = [] private gridTemplateColumns: any @@ -36,161 +36,167 @@ export class LitTable extends HTMLElement { private treeElement: HTMLDivElement | undefined | null private tableColumns: NodeListOf | undefined private colCount: number = 0 + private currentScrollTop: number = 0 constructor() { super(); const shadowRoot = this.attachShadow({mode: 'open'}); shadowRoot.innerHTML = ` - + } + :host([grid-line]) .td{ + border-left: 1px solid #f0f0f0; + } + :host([grid-line]) .td:last-of-type{ + border-right: 1px solid #f0f0f0; + } + .table{ + width: 100%; + color: var(--dark-color2,#262626); + } + .thead{ + display: grid; + position: sticky; + top: 0; + font-weight: bold; + font-size: .9rem; + color: var(--dark-color1,#000); + background-color: var(--dark-background,#FFFFFF); + z-index: 1; + } + .tbody{ + width: 100%; + top: 0; + left: 0; + right:0; + bottom:0; + display: flex; + flex-direction: row + row-gap: 1px; + column-gap: 1px; + } + .tree{ + overflow-x:overlay; + overflow-y:hidden; + display: grid; + grid-template-columns: 1fr; + row-gap: 1px; + column-gap: 1px; + position:relative; + } + .tree-first-body{ + min-width: 100%; + box-sizing: border-box; + display:flex; + align-items:center; + white-space: nowrap; + cursor: pointer; + } + .tree-first-body:hover{ + background-color: var(--dark-background6,#DEEDFF); /*antd #fafafa 42b983*/ + } + .body{ + display: grid; + grid-template-columns: 1fr; + row-gap: 1px; + column-gap: 1px; + flex:1; + position: relative; + } + :host([grid-line]) .tbody{ + border-bottom: 1px solid #f0f0f0; + background-color: #f0f0f0; + } + .th{ + display: grid; + } - -
-
-
-
-
-
-
- ` + .tree-icon{ + font-size: 1.2rem; + width: 20px; + height: 20px; + padding-right: 5px; + padding-left: 5px; + cursor: pointer; + } + .tree-icon:hover{ + color: #42b983; + } + .row-checkbox,row-checkbox-all{ + + } + :host([no-head]) .thead{ + display: none; + } + .up-svg{ + position: absolute; + right: 5px; + top: 8px; + bottom: 8px; + width: 15px; + height: 15px; + } + .down-svg{ + position: absolute; + top: 8px; + right: 5px; + bottom: 8px; + width: 15px; + height: 15px; + } + .mouse-select{ + background-color: var(--dark-background6,#DEEDFF); + } + .mouse-in{ + background-color: var(--dark-background6,#DEEDFF); + } + + +
+
+
+
+
+
+
+ ` } static get observedAttributes() { @@ -235,15 +241,25 @@ export class LitTable extends HTMLElement { } set recycleDataSource(value) { - this.tableElement!.scrollTop = 0 + if(this.rememberScrollTop){ + this.currentScrollTop = this.tableElement!.scrollTop; + this.tableElement!.scrollTop = 0 + }else { + this.tableElement!.scrollTop = 0 + } if (this.hasAttribute('tree')) { this.recycleDs = this.meauseTreeRowElement(value) } else { this.recycleDs = this.meauseAllRowHeight(value) } + + + } + + move1px(){ + this.tableElement!.scrollTop = this.tableElement!.scrollTop + 1 } - // It is called when the custom element is first inserted into the document DOM. connectedCallback() { this.st = this.shadowRoot?.querySelector('#slot'); this.tableElement = this.shadowRoot?.querySelector('.table'); @@ -411,6 +427,7 @@ export class LitTable extends HTMLElement { rowElement.style.gridTemplateRows = `repeat(${area.length},1fr)` rowElement.style.gridTemplateAreas = s } + this.theadElement!.innerHTML = '' this.theadElement!.append(rowElement); this.treeElement!.style.top = this.theadElement?.clientHeight + "px" }); @@ -718,7 +735,7 @@ export class LitTable extends HTMLElement { tableRowObject.data = rowData tableRowObject.rowIndex = index if (Math.max(totalHeight, this.tableElement!.scrollTop + headHeight) <= Math.min(totalHeight + height, this.tableElement!.scrollTop + this.tableElement!.clientHeight + headHeight)) { - let newTableElement = this.createNewTableElement(rowData); + let newTableElement = this.createNewTableElement(tableRowObject); newTableElement.style.transform = `translateY(${totalHeight}px)` this.tbodyElement?.append(newTableElement) this.currentRecycleList.push(newTableElement) @@ -736,12 +753,12 @@ export class LitTable extends HTMLElement { break; } } - let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b,0); - if(reduce == 0){ + let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b, 0); + if (reduce == 0) { return } while (reduce <= this.tableElement!.clientHeight) { - let newTableElement = this.createNewTableElement(visibleObjects[skip].data); + let newTableElement = this.createNewTableElement(visibleObjects[skip]); this.tbodyElement?.append(newTableElement) this.currentRecycleList.push(newTableElement) reduce += newTableElement.clientHeight @@ -804,8 +821,8 @@ export class LitTable extends HTMLElement { break; } } - let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b,0); - if(reduce == 0){ + let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b, 0); + if (reduce == 0) { return } while (reduce <= this.tableElement!.clientHeight) { @@ -853,6 +870,7 @@ export class LitTable extends HTMLElement { } else { td.style.paddingLeft = rowData.depth * 15 + 20 + 'px'; } + (td as any).data = rowData.data td.classList.add('tree-first-body'); td.style.position = 'absolute'; td.style.top = '0px' @@ -860,20 +878,18 @@ export class LitTable extends HTMLElement { td.onmouseover = () => { let indexOf = this.currentTreeDivList.indexOf(td); if (indexOf >= 0 && indexOf < this.currentRecycleList.length && td.innerHTML != "") { - this.setSelectedRow(true,[(this.treeElement?.children[indexOf] as HTMLElement),newTableElement]); + this.setMouseIn(true, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]); } } td.onmouseout = () => { let indexOf = this.currentTreeDivList.indexOf(td); if (indexOf >= 0 && indexOf < this.currentRecycleList.length) { - this.setSelectedRow(false,[(this.treeElement?.children[indexOf] as HTMLElement),newTableElement]); + this.setMouseIn(false, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]); } } td.onclick = () => { - this.dispatchEvent(new CustomEvent('row-click', {detail: {...rowData.data,callBack:(isSelected:boolean)=>{ - let indexOf = this.currentTreeDivList.indexOf(td); - this.setSelectedRow(isSelected,[(this.currentRecycleList[indexOf] as HTMLElement),td]) - }}, composed: true,})); + let indexOf = this.currentTreeDivList.indexOf(td); + this.dispatchRowClickEvent(rowData, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]) } this.treeElement!.style.width = column.getAttribute('width') this.treeElement?.append(td) @@ -889,7 +905,7 @@ export class LitTable extends HTMLElement { td.title = rowData.data[dataIndex] // td.innerHTML = rowData.data[dataIndex]; td.dataIndex = dataIndex - td.style.justifyContent = column.getAttribute('align')||'flex-start' + td.style.justifyContent = column.getAttribute('align') || 'flex-start' if (column.template) { td.appendChild(column.template.render(rowData.data).content.cloneNode(true)); td.template = column.template @@ -900,25 +916,29 @@ export class LitTable extends HTMLElement { } }); (this.treeElement?.lastChild as HTMLElement).style.transform = `translateY(${treeTop}px)`; + (newTableElement as any).data = rowData.data newTableElement.style.gridTemplateColumns = gridTemplateColumns.join(' '); newTableElement.style.position = 'absolute'; newTableElement.style.top = '0px' newTableElement.style.left = '0px' newTableElement.style.cursor = 'pointer' newTableElement.onmouseover = () => { + if ((newTableElement as any).data.isSelected) return; let indexOf = this.currentRecycleList.indexOf(newTableElement); if (indexOf >= 0 && indexOf < this.treeElement!.children.length) { - this.setSelectedRow(true,[(this.treeElement?.children[indexOf] as HTMLElement),newTableElement]); + this.setMouseIn(true, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]); } } newTableElement.onmouseout = () => { + if ((newTableElement as any).data.isSelected) return; let indexOf = this.currentRecycleList.indexOf(newTableElement); if (indexOf >= 0 && indexOf < this.treeElement!.children.length) { - this.setSelectedRow(false,[(this.treeElement?.children[indexOf] as HTMLElement),newTableElement]); + this.setMouseIn(false, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]); } } newTableElement.onclick = e => { - this.dispatchEvent(new CustomEvent('row-click', {detail: rowData.data, composed: true})); + let indexOf = this.currentRecycleList.indexOf(newTableElement); + this.dispatchRowClickEvent(rowData, [(this.treeElement?.children[indexOf] as HTMLElement), newTableElement]) } return newTableElement } @@ -993,8 +1013,8 @@ export class LitTable extends HTMLElement { break; } } - let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b,0); - if(reduce == 0){ + let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b, 0); + if (reduce == 0) { return } while (reduce <= this.tableElement!.clientHeight) { @@ -1002,7 +1022,7 @@ export class LitTable extends HTMLElement { if (this.hasAttribute('tree')) { newTableElement = this.createNewTreeTableElement(visibleObjects[skip]); } else { - newTableElement = this.createNewTableElement(visibleObjects[skip].data) + newTableElement = this.createNewTableElement(visibleObjects[skip]) } this.tbodyElement?.append(newTableElement) if (this.hasAttribute('tree')) { @@ -1036,36 +1056,23 @@ export class LitTable extends HTMLElement { td.style.textOverflow = 'ellipsis' td.style.whiteSpace = "nowrap" td.dataIndex = dataIndex - td.style.justifyContent = column.getAttribute('align')||'flex-start' - td.title = rowData[dataIndex] + td.style.justifyContent = column.getAttribute('align') || 'flex-start' + td.title = rowData.data[dataIndex] if (column.template) { - td.appendChild(column.template.render(rowData).content.cloneNode(true)); + td.appendChild(column.template.render(rowData.data).content.cloneNode(true)); td.template = column.template } else { - td.innerHTML = rowData[dataIndex]; + td.innerHTML = rowData.data[dataIndex]; } newTableElement.append(td) }) - newTableElement.onclick = ()=>{ - let detail = {...rowData,selectedCallback:()=>{ - if (detail.isSelected != undefined) { - if(detail.isSelected){ - newTableElement.setAttribute("selected","") - }else { - newTableElement.removeAttribute("selected") - } - rowData.isSelected = !rowData.isSelected - } - }} - this.dispatchEvent(new CustomEvent('row-click', {detail: detail, composed: true})); + newTableElement.onclick = () => { + this.dispatchRowClickEvent(rowData, [newTableElement]) } - if (rowData.isSelected != undefined) { - if(rowData.isSelected){ - newTableElement.setAttribute("selected","") - }else { - newTableElement.removeAttribute("selected") - } + if (rowData.data.isSelected != undefined) { + this.setSelectedRow(rowData.data.isSelected, [newTableElement]) } + (newTableElement as any).data = rowData.data newTableElement.style.cursor = "pointer" newTableElement.style.gridTemplateColumns = gridTemplateColumns.join(' '); newTableElement.style.position = 'absolute'; @@ -1084,10 +1091,11 @@ export class LitTable extends HTMLElement { } let childIndex = -1 element.childNodes.forEach((child) => { - if(child.nodeType!=1)return + if (child.nodeType != 1) return childIndex++; let idx = firstElement != undefined ? childIndex + 1 : childIndex; if (firstElement != undefined && childIndex == 0) { + (firstElement as any).data = rowObject.data if ((this.columns![0] as any).template) { firstElement.innerHTML = (this.columns![0] as any).template.render(rowObject.data).content.cloneNode(true).innerHTML } else { @@ -1100,12 +1108,17 @@ export class LitTable extends HTMLElement { firstElement.insertBefore(btn, firstElement.firstChild); firstElement.style.paddingLeft = 15 * rowObject.depth + "px" } else { - firstElement.style.paddingLeft = 15 + 20 * rowObject.depth + "px" + firstElement.style.paddingLeft = 20 + 15 * rowObject.depth + "px" } firstElement.onclick = () => { - this.dispatchEvent(new CustomEvent('row-click', {detail: rowObject.data, composed: true})); + this.dispatchRowClickEvent(rowObject, [firstElement, element]) } firstElement.style.transform = `translateY(${rowObject.top - this.tableElement!.scrollTop}px)` + if (rowObject.data.isSelected != undefined) { + this.setSelectedRow(rowObject.data.isSelected, [firstElement]) + } else { + this.setSelectedRow(false, [firstElement]) + } } if ((this.columns![idx] as any).template) { (child as HTMLElement).innerHTML = ""; @@ -1116,7 +1129,7 @@ export class LitTable extends HTMLElement { (child as HTMLElement).title = rowObject.data[dataIndex]; } }) - if(element.style.display == 'none'){ + if (element.style.display == 'none') { element.style.display = 'grid' } element.style.transform = `translateY(${rowObject.top}px)` @@ -1124,38 +1137,108 @@ export class LitTable extends HTMLElement { firstElement.style.display = 'flex' } element.onclick = e => { - let datail = {...rowObject.data,selectedCallback:()=>{ - if (datail.isSelected != undefined) { - if(datail.isSelected){ - element.setAttribute("selected","") - }else { - element.removeAttribute("selected") - } - rowObject.data.isSelected = !rowObject.data.isSelected - } - }} - this.dispatchEvent(new CustomEvent('row-click', {detail: datail, composed: true})); + if (firstElement != undefined) { + this.dispatchRowClickEvent(rowObject, [firstElement, element]) + } else { + this.dispatchRowClickEvent(rowObject, [element]) + } } + (element as any).data = rowObject.data if (rowObject.data.isSelected != undefined) { - if(rowObject.data.isSelected){ - element.setAttribute("selected","") - }else { - element.removeAttribute("selected") + this.setSelectedRow(rowObject.data.isSelected, [element]) + } else { + this.setSelectedRow(false, [element]) + } + } + + setSelectedRow(isSelected: boolean, rows: any[]) { + if (isSelected) { + rows.forEach((row) => { + if (row.classList.contains("mouse-in")) row.classList.remove('mouse-in'); + row.classList.add('mouse-select') + // row.style.backgroundColor = "var(--dark-background6,#DEEDFF)" + }) + } else { + rows.forEach((row) => { + row.classList.remove('mouse-select') + // row.style.backgroundColor = "var(--dark-background,#FFFFFF)" + }) + } + } + + setMouseIn(isMouseIn: boolean, rows: any[]) { + if (isMouseIn) { + rows.forEach((row) => { + row.classList.add('mouse-in') + }) + } else { + rows.forEach((row) => { + row.classList.remove('mouse-in') + }) + } + } + + scrollToData(data: any) { + if (this.recycleDs.length > 0) { + let filter = this.recycleDs.filter((item) => { + return item.data == data + }); + if (filter.length > 0) { + this.tableElement!.scrollTop = filter[0].top } - }else { - element.removeAttribute("selected") + this.setCurrentSelection(data) } + } - setSelectedRow(isSelected:boolean,rows:any[]){ - if(isSelected){ - rows.forEach((row)=>{ - row.style.backgroundColor = "var(--dark-background6,#DEEDFF)" + expandList(datasource: any[]) { + let filter = this.recycleDs.filter((item) => { + return datasource.indexOf(item.data) != -1 + }); + if (filter.length > 0) { + filter.forEach((item) => { + item.expanded = true + item.rowHidden = false }) - }else { - rows.forEach((row)=>{ - row.style.backgroundColor = "var(--dark-background,#FFFFFF)" + } + this.reMeauseHeight() + } + + clearAllSelection(rowObjectData: any) { + this.recycleDs.forEach((item) => { + if (item.data != rowObjectData && item.data.isSelected) { + item.data.isSelected = false + } + }) + this.setSelectedRow(false, this.currentTreeDivList) + this.setSelectedRow(false, this.currentRecycleList) + } + + setCurrentSelection(data: any) { + if (data.isSelected != undefined) { + this.currentTreeDivList.forEach((item) => { + if ((item as any).data == data) { + this.setSelectedRow(data.isSelected, [item]) + } + }) + this.currentRecycleList.forEach((item) => { + if ((item as any).data == data) { + this.setSelectedRow(data.isSelected, [item]) + } }) } } + + dispatchRowClickEvent(rowObject: any, elements: any[]) { + this.dispatchEvent(new CustomEvent('row-click', { + detail: { + ...rowObject.data, data: rowObject.data, callBack: (isSelected: boolean) => {//是否爲单选 + if (isSelected) { + this.clearAllSelection(rowObject.data) + } + this.setSelectedRow(rowObject.data.isSelected, elements) + } + }, composed: true, + })); + } } diff --git a/host/ide/src/base-ui/tabs/lit-tabpane.ts b/host/ide/src/base-ui/tabs/lit-tabpane.ts index 1f8c681..ab2f8c9 100644 --- a/host/ide/src/base-ui/tabs/lit-tabpane.ts +++ b/host/ide/src/base-ui/tabs/lit-tabpane.ts @@ -80,16 +80,16 @@ export class LitTabpane extends BaseElement { initHtml(): string { return ` - - -`; + + + `; } connectedCallback() { diff --git a/host/ide/src/command/cmd.ts b/host/ide/src/command/cmd.ts new file mode 100644 index 0000000..2b22a56 --- /dev/null +++ b/host/ide/src/command/cmd.ts @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +export class Cmd { + /** + * exec objdump to disassembling binary and find addr to show 100 line + * @param command obj dump command + * @param addr addr of select line + * @param callback result callback + */ + static execObjDump(command : string, addr : string, callback: Function){ + const data = { cmd: command ,addr : addr}; + let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/exec`; + fetch(uri, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }).then(response => { + if (response.ok) { + let result = response.text(); + result.then(output =>{ + callback(output); + }); + } + }); + } +} \ No newline at end of file diff --git a/host/ide/src/figures/Options.jpg b/host/ide/src/figures/Options.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d8dbf96bf958027b2bd27390dd19bbc5d396514 GIT binary patch literal 130484 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�ny@Qu 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Π4;(&WPyHWQ@*d{#9UB{cs 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 Xdi=IxKx^c8bL9Wezdr-Ee@y%nQ=SGt literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/PerfProfile.jpg b/host/ide/src/figures/PerfProfile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a348c291172e0c5ca0a25356d25cc5d738f49aa1 GIT binary patch literal 149159 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 M@Bh!Q-|y-F1FIFj8UO$Q literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/Samplelist.jpg b/host/ide/src/figures/Samplelist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f161a6c5a40405149ae296df339b43c154c2f81d GIT binary patch literal 174714 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

OKt9*vqugU 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ȕ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 GXZ{DZ$C-iv literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/Scheduling.jpg b/host/ide/src/figures/Scheduling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7c5dd57bfcb038656d0fbe80cc7e685701ae479 GIT binary patch literal 71861 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�?ibVRll|Zg@8snd$Y?&T5o%J6VD& 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 KNo%kij{g^Lp5yZX literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/abilitymonitorflowchart.jpg b/host/ide/src/figures/abilitymonitorflowchart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15c86a5b816003dbb850e203794d3ee8c7a0c2f7 GIT binary patch literal 106077 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 z�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 E0UIvp#{d8T literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/callstack.jpg b/host/ide/src/figures/callstack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7da3c78f87ebbd4653ddbdd9b0036c5a2814fe8e GIT binary patch literal 206004 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%0Ab(1*v}xB-i@pxZ^s#*FZjT} zi^udIbPP!48PJ2gL$1%Cd2~kXQ_P|;lV2u{BXv5tBUd~EF^7MNV&iOKx`>19TAv;J zvK`?fT{b2<#gAtYh10W7LX8y0p`^-nt_m!R#78P6(zt^aJwnYIa1lq4RV*ybn^c)y z1GT)nQF7h5vuY!PO7i`9c*s^xP4~jnwhAe106{H_DPC#~FON?2zy2}8C;~LW9caoz z$sdJ2PEN^hMz#-pX@^g%4=JS*@+};S_oPL05>&k>DtSfktxLqOxnYkkY~J0NDvQmi zp7Kf0uC3;KQ(qIPZR&>^AGwFaEd%I`(A;-7v?6LC+bS&9P44gy0leWyB=@>wTiEUF z3f?x3J-ih2sDtnzR}^D{Eiq2cUkGQ@Q5!P9`t%sOOh!)@wpH0WlqPt7m8nbnWcu=V zW^gHp$@e}R|3jGYXYK6#e~}jMY6Ak>zto5HcD40>cMB>OWE0vfPZfk$4zZ2( zkdtRviXXeI4Fsz=3J=;|5b6tLBN&C{7@?wrFrGp*=Hd2&!mRKnP$*~Y7qYJ|a=#sS zzN|mdCVL9LRbR%Ocb?;!j3b^_Q%*}1iW)YAJ_?P6?|>F{HtKyE#~?YG^lNSRc&2?) z(?MQ@?8_d#a9y{ytmL&Sv#BT>LD5r?1tN?Y(-8Y$Si!9Es@RskZHK)ZhUW=Q!+!fb zy~hgh+H?BY18*0K<0<)oO2YlD6{8eNv8@vu7k=-cy=f#@9Bd`NbC%WVS(uB8AJjSv zjiJnd&Bx@>J)XznSka5dpS`Aein1b&b36SzbCT?(x$0z9FQE$ja3XH&eE-4mSSdzj z1bs zbRUHl1*&$c4#|iuBb1yuv<L(s^D#xm^( z$PZ>oGcbR8A&Ch}msCN%yzS_rRZBw1Rb}*K%))RIv9|<#@1GslDlSl1bzn>U>;v!v zsbmpcS{vjEzz9{4MFy3|83v#nq14O?lyJ_e^2ED{pwC&~-WbtO=x1Cr=zoj(l) zarr3xQEv19xqGpci2tr9G@R~| z)mDVU?o5518|A}IUVuXg736S7FR@N{wcC>m=wDuN-0};8QlQI@v>A1vy;lO}a--)S z;_?Y%zBugP8&w{?FV=c~YA^!2JP&7mMK2XgxQT(vq2+V%*IBVtX8*rqf&BGT#C~OB z;hck~nea(?-+Jyr_q@#dxd0W-wJ=^`<>L7o`-Lh6w=o)cF@QAr&!zZb7AbNV9;7+C z!K~A|m%0ebFIaW_uT3!j7>NT%-{(TBUjHxlz62iXwf$SGQ62=pBao{W`4c5PIXFWeU|_8yzl$} zeEJmA%>3@< zRi-{gRr2<2h5cfQH+H_3hq#`ex$A1QJft^zI6ZmSIr&N1`11SO-X)BD(nO-s303b( zyey}HqIrGK&D0fp!K@DGO);P?Oh{A5(EQ-_uxO|;+I(6mVF0C=4wq;0+G5~j%#_!R zCIdC9%XbUiN=tK^K(sdNOsa4QAG@CimF;7rPY3>)luIok-1Y2=__h zdnc{0yQ_d4m6}+;@d0royT!-BoU>Sm8=dT%NfmeU6ey`?>9}%o^>(0KcY1R`ZsDgv z`)^NDgXQjjjkLR}r)*;1Z*SEx+uCkTLiVy{=2$dBmq8;Wm%nE}S{ zi$v_Zmm!mpC-(juByYG+t?*5bLKURKH3d7Rv!+T0J z_`TNDCK(ObAOPg#*hX-(uzq!}udX@WPe!rkp^4H)FYemy(NMw{`zEt7ou6m+*=ic; zCC2Efkna?TJ1!avEsXioQ|EX;>o082A@=z!`hhSQ_yB!{CZuA3c4I9g%g&-x4yLA$ z4UKD=F*^?i!%o`Mj^(;QrJTvgLpTKh3S}!ssr0BYu<$WOq!MU`WvAenHPjvQX}q#& zQD#SDs}N{z7^bdJcu&ioz|g+!aWQ{pjuR_}Z9lf1&R*(SCV=nl-b$+Vn5ksG(cO$; z<7AsEY=%xYJ^hxS@&`T_r;*XKf#^{mIkZ1cuK0KY5R^|!LIePm+QTVdJe;KUM;{yw z<>+Yrq!C90jDn5Dr=410tW$(2%w(}{O)f+d1f!;j%bt;xB!XjnE( z9(pBZ-x%XwGHd=*4~Vd~dKI|BAEu0p`8LykZ6&|O-rZiYr;sd$Qm_^ac`Tr1ZXZYEX2jNrFlG5!AAs_6L+n>>-SmTfR>z5&xoEm1@-2)je9PL} zt?C6(2mW}H155lDir+`wRXtluOK=ou znzw?H+?z2{Ghj(K1_`h%f&CM3Fnebp$nzb68!G$}Nrk&^J1|zGPoVZ}Agta|@Cr$2 zYO)?pHwF5=2z2m@1KFDOL7iD2dbk7-2LF}E%{ZuAfxaQR0VT7b5y9QJhu=RjMUFam z;IIyF{3$3V8M-qk>!Y!^0LzA&j)eu1(QIGztdITT4*yH$_wmI0lewG$5?cwl<1`R< z-z=fRZW9=;m4b(x!~U{ z@*yD6-wa@;eSOv-pn`AK;}^g9&mNV1=!7{v>;x~Wv?bmxs%&h#+YNJNguz|(cl&2O z(_U~KJL~m0P>8k7!;i%5q;e6r{?vc@3&9G40MRcsaw9T)(L?)R0*8@@BA-uS z;NT@gb#k@POyjq%Y~`D_#o6YqKQc48(21)D52z2;kS%5fMtI5(!2if~Nu3tx2ZhUP za{vYo$bH<;6Y|qtnnd9i^}?X=pvk5{3|`DOSV?+foF3EVl9y!HopDGc+rK;z>e{jV zMUF(uZY!CXo_%hd3O(G^rV;rOG*G@kt6fLG{A@Y~2Re=1-yGE(okYU#;H%TwthTrB z{w!8XRhxkX`PLWy$AYD&uq>D<;R$H^GMJ?U2N4vM{0)eIV38D#nnOV300j!VvfuKX z{!jVM>HML8<`VF|ZSg!dK4_-Kv2@Zu$eh?IyF`w0;Vkp;%7S6|YG|2_*9A=sTe=hN(*#?#c zw3UBr&OQP~%$j%KY**xeEXZ4c`8sc70&(THKm`S3+?P}&N7<6={N5Q{^7oR6#h1X;jcg4)>5*b?kdUQp! zDPu{Bmx^oBk4&fG;fs;ZJ%Q6Ys|2&STTOnF(PA{DSQEF)EPLDeJkyk(9GjwV>zKjI z>`c46jN|N?7VC86z&MT~la6RD{H{^^g_j;6 z7T|i~(V$&S3}|ed&~o5<{v%NO2qB=zIsleF@LsANb3?m`MIgc1sA=FDXWG)#+>$19 zw)VAb0J@dXsj}8>nHlAPKbdW<{gZD;&RWi1Cj`YM;lzc!t)R9(PVpi~^>O_C=e@jF zQ^_6Xz8jB(tCg*1-mgts95K!x05Y>nK-1mFPW#0g02%B$56KL7?Cea>wzg*8 z+Mtus%ufILS8$0{LU4@?AH(yx%CK^YyJ#Ku_K?1-o6(~4cX`YB<#~$xv=bvM#P3xJ zA6VY?AOQBAclJCeu*sk4jM4r~bK)R0CG&-($>r&{zkVliTfSyeD*gt8eV1?qiRZ#U zHw!Jpy+9`w6q~d6=jcD|GdqLzGp80`s&QYs?}C#WZK)SSKwm6$WopdeO0Q^^nyx*f z=cX_DoFS1!Y~40pjB+=#cqqO8;h}@pA{H}g)o=Nj+7b~U1wzRq&fs)HJc(VBpo{vK zn~mAP>zo!Cq00f$MYSG?-CU1>%z||~#}dllh>~%CPZimuX-sRiED3dwiS4)R7p6p; zw(Oa=H>hI$nY9^#86)BOYp%UA(+KW@7)u-TG1IG18=&?#g`llvu**F@^fbdU;k3od zCn~(&mg?l*@y6+jjvid$j^lf z8p6iSDIkOe?wL?D?>>m+VxaEaC*aCU)fvm(lTJSZdlG!j+1o%VV3!7(CY^GFG_Hc5 ziGl8V0bsxexCI4VT?bHm1@C8k;Cs%M1RzG`*j5Z^%#r~C-Ry5g(5Eq9KiDt?c;GwD z7ohttu)*6s6oueDQSh2(_J$99dvuDCT!|A9QyOhcg4Uve)(sLGB7;u3K4r;C;9Ym? z#6yMs==0F@2JKrYRe_5NW?6zZ&AY&|vp}%;x^C8p%z)8YHjEbm*!fX3A}pAQo?1#^d)c(d@|GY( z$nE^I@3aD4{ zzM8ifdRxr^0n@_c2(FjTcRQ!`!i@_853ot-f72Gpw4h);2zX@jh$i0NawqwQ{PRVt>AzI^__6Ps3HfEKpbDn z&ocLb#wGkY@jzciWiv?Jm3vs&`W#i&Tyhb1+xeh%0^sNi-U?jQ)nf5b_1X8@$f?Sg z+)l-KXvkbwtwXJ2Kd8}W#0kZ{yE_$rbUao1UPJ8v?ob-DI|!4U91^MzG{fLDRE4$vpMg7;?zs1K<2OwlhbNdyve)-b^R0vIcAqF{RPE zGATG)6@e9Hf-%>8+qP4)=ktZgEy(QCsXf+M$X=EClWdf+Yepm!R<-jqEqZUTsaDap z=JHLq?l+?%qmi>v)Su#kk&>B?<=q@XkDtRDzHrz3d;vc5uc!xOC%o5o51iF7@fA^_ z!<^h-+PP)+@oDGpk5zc1s8Hm-wl+sPI(H-~{$&3PyDMX@Ch~`LCM;hqHTTgu zC$h4GUqMU8ZBa~)_DQpy&@yYW$4A6p_VQ$#)z5(PA{?)!RH0J7gx{7%k@EsC^HbcUF>>dK$lOBtOrHx90I*I4c+g_j$aFqMQ3PBeQx`kQsceqUgNq}As7qJZ$edSx z8lYvchtb(SS}-b>-slUjyWlPfXfR|bZ>(~3MQ|&Pj?UXwx=|ifVf$1roLa_@I%=VC zO0*QX=UT9cQyK8X^GAhGvIq4tY8;0Ri<|RO$t=2HkJ#pz zY-Vtp=N8m~ygkj)0Ur4LvfR8n^0}9;v7{53bY4SBoNmXScwKoS`kiMF=9#_1s3sZ7 zGrwPTx7)D#r^|}LY@1H4JtZ*0CP}}*WzwT3VE6KO1J6(DD=UF`XL@ZBV+h=el>Nj_ zug_>rQeXs-UI9R;!zVtM>HPk`3$Ljon$Kmxl@VGj`UId}2`)VdPy({h`RI9t$`Gga- zP{?Lmv0JS5i|(cF7kYFMb&$qLp`Nh+j$;Is9pS(`I#QJ+@y6aCO$Y`tlqQZ9%T9Gp z>~9vj!4-|u0ZA)bd~E;oL-s^1jrr!w)Dt3!_{KAV|oY;bA6XisoO zh(RdoAqodi#wVMzjCjG6S4$uha$O4GQ&5sGAw`!WD_I(65L*GktOE!F7F;!7evCxJ z6y9stRh~Uj0ScEaR-GF<2UxVTOxDh@~^Zh2p1Ehv$ zW?j8yBY-|L`a72HS&(}vB$RjaOb#Ov35uOwcXoW>o9vy*x&Q`4Q0(+8X*ZxS{F)L2 zG*b%c@g;8$oP54@%CKS@;kgM`Wsg$YlpCW6ho8~?$EV$I#k_}^B|A2+IGeGQG|;wZ zqeTN6`K%}JXUSchOmXgD4+O}`8r!i&SZ_1_#^lZ8FVSMwYO6dw;@=}SzB#E>-4)c@ z@@Rh$%B2UR+>q->YBqB(bHz`&H*ygp?-{8F%~yaCI!4G#i*>|!C+bno+2hJfo}V<@Cvug= z0H+wx^pWA_Gr2$2HtF5$Ms)BZB0lh;EqN8gyvEHKlpip_NpIN!O(A)iERYGz z`)T^sr%cn_fZxqV{YCymg&D9U{z?tlONcV+A6ndyHW=q*oUc*jqD_hhhh|@Pj-!=AE%QGIcNzh8NP-zgtw5^10&PCAiAm54fW{Ya$Wh% z;PTs(5VKOf-2JR$M$(`S2Zg^{Ka~D78@kE0P0~r~cL8BOB`K-1#Vvx?>?|Za6{h+6 z^}yL+Ek%I>=m(%)n+#v&2{9~LM31y3`uk6=W-KYq;%Gf4TghS3IZSS8Ea3+R{=oyv z+n&5il3dK2$w}wU@FMd|ISoDVWFSMGU^R@UD?tF;nuCS)TyR7E_Hj=7W(><~6Z)K_ z-cuYQ&%hQL94;Bu z&j9@~bgQex{fEI#!!ZYdXh(PU)Rq6ig+Jvy-*O#CTAq#S2R^5}88sk1(rrSWQmuOY z<^x}AqgojkZAo7za&Ud}inpJ$yj#A_&HZ7j?icRKaP~!r<_(q&FAxUt$Tr*wG+N>Y$5hXE)S$EskE1X!Aqw}C6(Fz&W(|C##m zGg(h@oEx-777?3(aP2R4IK?A1L=NZ4I8K`MmbhY0qcGmgaN~|4YU)TzdpNRiIMR%r zQes$RJkYkTF>!5Oa&nuZ)mkN;h#>oJ`VE6X4@#bNcY1MS;ixcPuXH@A*B#<;UC~?}awEOh~-Qr8AsE2S=^ zj}A>a5Vna0Pr5C&V{Pf3JdLFB^4{mv^pFpjnVF(wOff$bH}`@@GYhT>XxNxo=aZP9 zVzs^TMe^DgIlenOpwTEMdXM2f`;#!D+Lo&p)ojIjBAbzVW2e)RYB@fknl$k-^Cd^1 z%N!$Uac0N9xxR}Re+zb>JByt1+6*q=uhqUY>Fs~e2JS^SA~*{{4s6D;{buwaL(Vsgiu?o$q!9^jN8kb+XmHMm z`!e>Ab_C%=Wy)D2CMst@%RZ4SJzO#{^K6}+M@iO3I+Aw?hjwYDp)5k0(Fi9@2}xWv z!4)mM-A{E*hv{~fT2N()fU^7`cJe#DRiRlPU<1M8ccq`?gBl|O4j=H#$qnZOH2Z(mD z)0(WGbr7RU0zPt-(w@0HOBT4LhreIrj-7IhZQ^WyK}DuVXOqNIC}@viurR}rc^N$- zkb`6skJjVG;x9~hw^*;Ly6LzhO+TRltu-0)EXO``Xmmx%{t49qU&T`LIdj2*W}O@9 zrWQpjy)X^&|hh#|i4`9>8^Y zJr)Ty?j-SI0oT>nznWN{{uFNg8kqc-#XF*v++B2~Fu;sEP4P-kz+_ly3_l1le7i^n zt+8ksMc%bm=rurrwR!aL!NG;-TbfAA_7p*@X%tDQDbXR!X=qrs^<|l_itt13HPOVf zipB41QqNq!@bg1E5P)s@WG%mu&EI)#?)F2grxLDb@gnd$6?IwX84JS&Pz-FWlgGhl z8JM%ai)vK33vl_b&`z}($Bx7wCKbxP%ZaQ<_zneT zCT`{fpctSCj}G-^AAHa`y6eD3y>dFCNwFQ_;Q&cFaSo@`E4`MmJZMcrD*eR|+|T)K zu)RoAuSDa@3ANHT{hRN_MLr9l+WE^7%H2lO(GABUCYl0DjuszdrCP2N;1^Wcu^OZX zeg$=0APvF0h@^=EO!qM^SU%YRa0_4-2=$3tn1e8TZ7=U~@YFGArgkGL=40*X0#G&b zHK^Eu1pvVi!O;0Jm4OO>{BB_7)#+Pz>zO*5D~fw4vf^Ew{+b-~cK)H^_9O&|9)sv? z!$OA8(t(xy2Tofdrupw%illUdecOfyb@;AT{yQ??e&)HU_pMa#4(tq23EIOcX__2N z5x93eQqLh$ZM2^qJ1ynpw?LzQ&0*+N+QNlEJ$CJ!`;|%-l%5CcgyZ0>7HC+nE%BS* zz610YM0lc^a#kPsK5EMj0-&OU02N*5E(FS*3b2#8YBcmU;EF6@-Hv&0qj4a@AmSm5 z5f*0tz^(L$*D1%?SURx~S~Pz3Ieo+{=0ZrVG*joC_0LmYyqqi4Bc{^Dez+GEQg4E^ zxfQ)c)YQfXI6KHN3D|z?7-7-GVJ$D zj^hil%bm{&oL@D{iLFqnUKpGYHm*t0gT`EGJiq9oJptH&!%-% zeE6-s<8$~rku>u&_{c0K4v40}^=U*;GzbCaHwOT+`ju3GpXYcWxp(5AAqgbx4}dcl znon&w2%0dqna}XV{W|hbNt%U1*U6nTC2vo|DIX{NEg!_LZ-)O>G7Dsv&@0GY+I48a zsD+&w!oeAVT*&Xo6^H_AZ9MeS%jo{;dcUaN7r7bw-c{|Lq8+4XUav+Mu^qXG5{%f` zeI7?^xF-|(Ss98}h%j40!)-cJc6r-8%3gIgHKeA zs`t)W6GfQ1WkqHSNuRipynB}fneGklGR7AH?z>eQ=ni4v*!HaeE>ydUW70mpnPPdl zC=f3z7yy9r3*enMb!MJ$VCD(c4e26tK-~UA00D5`goCWnoTw;RSQ-Ie2V8sebd2f_ zF2rzUHPF1dfTCm}V5Z&c08P&aL}N>&Z4T{{K>zQf|Md%w=E|42Vt?pkJy=RV8 z0jrg4r~3_hKenQ@o{*6+VTV4pc41+0RdQceBG2PNcuhFJ<= zz|@Ze7J^=Pg7O`ZsI2}^4woOD?1a(t(s>!Ag*@P2vuG>qkBHgR0SQ>yJDKYT8K@ly z>`J?h_s1f*W1_#CJQ4azCm_C-gN8@fwn1O3BL^UfziOgEBVRs{?fF_80nPQbCQ7ni zKTqK+ZKU(n#-_(TT)L+?PpoFBr$#eZ;|+S}!M$!F41)6HmE%=ky)S`Hg;6SK&Z1cO zc2Gv#AAO%7=^vg605t!@sh)VTen}`_mkK1%AM8|k5=g|#0QFB2G5x0L+f}G{n-74z z?2`cr+fFRN!K?dEYUtPOc?Hv^jUI_-!wjB<=*mvD4tMsv_*UtefAP!){<$6f8$00W z--#CJzxuR4&n(OW5f*1$(z3Y|K{0jvwvvkP*|#F~A2e=>=jeGMc(=7=mMy8Ngd`P) zszMOq=NRk3!LKtQd?&t@hQD_v{>BRa>1k|GyQYbZX>~f@rkge>fxweBLl~eT;-q5A zET`1yk4Jp5I`q%P;&3}oBr;?1+@62j*|;Ku1{9$-9mYOu07s=81J7uo0O%Quq_0o) zF}4qgr5vkxjvk<=nPR%|!tW~t{W7L0fwrEl7@RR&lP|7&>c7|hYKpon-S_*elW_>>GfjyOH>Ck-{qow2XPM~&-i>ZK zmh3^xuT=Ii?l)KAf8b48s+|909eOm|qt4yoWt_nMzvXp;+J0E9W*9H+Ca+=ZcUVX4 zbw3s%+IU>3XmmZ-3VVw!SZl*@V_Gc`NpZ%KvZMxf9KlTjQ_s zr=zq(9epYCILX=}20X?yb(|_bWz!2Qh6})1??H=|24CtQXt$QQihrZ?e<`{xFKX3Zy%-&Y*+O&$9&2x8^6M?C-!Pc-z5Ii5|53>CFB6h0C{>^> ztfGsm`(GRaXbt(3n}KH>abvb+qoA2Tc){e&AilcjnES^kPWum($xptqA&79L3x891 ze+}&`M{THIRmtCZSimNyU|JB zBr#2W20zOWd&_-M-I}-LXXD-zq!ms#^c}J?YdbT8P7Eg{$pueBR>5yVFxyUa1*i~s zCK0FRJ$#l?hqi2n8u(?-fm5g8pKcYpP#)=YHh&kK?)#GKl++B=}CI@}ahPA%xBVGMik!SCP+V<~t ztqoE(feB49pEr8?|0wmTUD?ss>(6yy}%4uaP>JEV-syWSsA`Rbpvy0 z{E6$GtcM2b_Q$#c>)H0KF17_NVN{4>LEGuGiF?dZI>P@+9>G;6INn58B50>Woy;7Y z9@6I8vN6r7?P#Qo<;Y+ zNV)81?#*#jJ;S^R=_ez`2EfDf+d)lu$^x?{Dt<3xB_Xok1?Rb%uquM637rqp9obB7 zFs6vul`4d-lWTXUPkCcv`bffDEe@!h$^Q|hXy(K*t>G$Ib|wkz$$FbIVSFq7MLnu0 zsMt>G%Kp9XXRqiY0GNM+`=n}4q^)wVWUXu0Q(-Gc6dhPw{)}R`%5l*qT`3PZ+wkeuS1AI#8$FDl zK7r}CvgKS;99iQW42;~{M$`-x{j3UYZulhiurcV`2X39JRqxS>)yp+rWW z{d3!DHc_eyef>0CTs;YDg|dGJtwlKq>KkVWU?KO1ve3SJQwVvIo(No#y+uFoZk%D1 zZY0 zRZu)rT_H15T~UM>%?B0mvx+M~I{BY(Mgf-{^Z0=>WiTQ^`qKbCZgLmgRe}r{!Cwe2 z06FJJU0+@G1w6+ep}CqbU|SxlPl;w;94~WL8bQF$lvQH(Q}c{kZK@zE!s0gkkL(4V zo5e5z+Ie+p#$`^zKTLIPT?Ty4d9M+Bj7|f*;?s-p3Mkntw9Ib@Q|UFDavfo5wLKZSrOR~e(Dx;rr3Ky3pW9y>*rGCwFl^LZ5o_bp=y55> zq=v0^XE0BIv9FhPlW9D(9Ez&y*?$;=ghKW{*X~6aHL_!Ai_jOSH_$>8NI_}6l{t*1 zVOr&(j!%Q!6v~K`l(T{Rz0X{>?^(AHbthEKSDqJ^=)Mj^iyKWB=sUOSrpEghmGQLw zt=oy%E=42qiPnwmK(3_fgGo zdD~v};5z)Zz=spKS6rKT^o9?74u&D_?_AD}q;OC+%lla=Zrks#ef-$=h{u(X#;pe! z@CJ#brz#zW!ap2kI|o+z#j78B(C$p~OKZKlrel!c-DsxXm|i7{kzX0HiXQSf+cezg z-Px@wH(ViQadb}5o+_y$4k;4WB!Qd_YJLu;M~aDUVs9rFT?F7)Rl*onh5mkK7q5$M z;v9r%^$&7(KO0yo-0oqDE`E2O-IBtUug_74w+`&b5gWyBC-#Rh-q=2J-7r^|^SaC5 zWvD#x1K&!GMv0WcVEiWDJ=AI^tWoWymg3O66_o^$#}ZfBkEeOtcWch6M3nPS`bhAo zM1>y~xSciBTEDNE*@j?oL5k>7A8|69v|)pK;{#A(263)#gY!x!Zd$J2Q1T2f`4F+h zNlmY|8JngX+pKemX~Dbny5M+qieG#rYYT2azutQ3^^Xr#a`&Jax+YNLe)PEYaa;+; z8vsK6kSAju$}3+%b@SZXZB)R2-+ohoobTF6XXzCKHaau~)bdPF9r82OSC=frDtZC7 z^_GHCybV@sC_=I>QMK`f|Gcn!fXgp4a4XyeHW%M8r@0C$` zJ8^qM&UVylQ}$RfuyFQzPcO)b)QjoW4qa6UWq7b|LtAvJM&*Adb_UetA=q9|@CwyQ z_+yU;+!Y#f#IUZsaGI@{xt(2H-||I*SPe{&d0DXKy<1%}W@e~YmzH!UdNqGI$$zBBKYAF(xvZp&nK`*CQ z=ox?@8Gc7HiGSm}F@R{pyC2h1n5WD2uGXY*m~Pe+c;jl)`4@{pMb4!=f@9cb0ou6_ ze1+I~I!b}(WFl!x&J3&MuB)#q-TeOkI}?^apR?3N(fOQUKze z4O#=Or3$*x6`{-y&1X~Sy+siy-lGlxyqNHW?Fe-&&AK6dpt)g(ZFvt3t+YXAf0s;( z_Zt+y(e$S5t+&+m+Yk3lPPDp3z%I~M=2X;!SS^V7erq0ryC;i|@z0TT&u&Pfk>;{# z!j_iXAA521cV`CX2kelijLHRpYKk@w`72NvpdhN1>qh&e1f_=`;ppU(muRlA?ch`` z9W-qAj~0qu5L{lnFCtR30?_m*Ouq&?0l0Ed8D@)NLye4Kze!fT_>X!vnA;{OuUGDdZm}FoFZw zcV7^d%}o96^*nb}h;EuY$%1?wu*=l5>Kqo$_f*Raz;|=Awu1m7 zNC=6P=o6~NuA@-msv7bRFk}+!+f$m1izAlQrQN>8xSHx}*YU1Cl32!2?e5WO?!X~X z?DwzP3T0cL4k=Hd!Yz2jSmVMxeL`wUd=HxH{=Q*Hy|{cVqKC-KMc}5#rlchdbh$#D z7|dJ{Y`ln_X}TovB#bG6Cr}H3KVXabRLSF0>=c`+jmG(of%npK7wCB8+;thK@`f!j-@LTT8($x z+1lIolGCnWB)A5Sr{c9^oJx$yjTu!I1nI*EBR9z1U|_w@R_EBCi(=mxq{S8?MNLoS zfwb^DjXD>t@MtRqA}15ocu6CWGK$JgFzlcd`Rl)`Wn&H+V2?5k3rUjuLtX@1A0iEJ zUd+Ty94cMiv%f1C59NH|GgJssYp*BV21KG<{Z4Z8# z=QSk+at5t;nr&0+)8|SL`<)q9!umi;LHO1kwzfN<;b9@-;dp&v1AOh0sZ z6sUe^JSK&JdaL-QA_`osv%&3@>~`Rsne@%GM{7CvQm8%}M4%o7PZmbLOOB+O3!5be zNAFhJYkt8Y2(#?~Y+^@|Cj?Z7j>|fU(#Ywm(`-Zuv=ndQ+zXvyLq8;-AKN4sLmFGp;v7AtI14cph4fGUh;HsTtu;(rC_Ve6 zs`7(&@CEZujV=Fa9%X;t7W`I*j{gU~3kH`)!Ez^byoCh=en6he&`HhC8Pu1L_oU-BToH zZG}wwcuiM=_6FBUHj&B6$ZH!VB6&IZG*i7}-7GZF-mcStN~yNLqsCWk#82AIme(b`kAs<_$8#UOzcWSph^G;4SjA9Kf`cZE|1AxF*bFdSkXyo^QFx>ldJ&UPP9+5VJGn#UZ<1VY_FFIbajFg9({9!cKb;BivWErx?EB& zuqyy#0uM#s8#On$%Pd$%EQpRBo%+CsgkDY&h!xVh2V4N2aHcMOkhU(S-8n}tUMI;q zVguW*)9P?TjqQPLj+>W$l>GG{CEq*;@iMqf=KK=3WvC0}SL zj#k&hjfrw@$mPxb&V6T zn|I219yv_!26gUR`e*PoyCYs5be?H**KF*ZEOOK703O89!?%fs2N??9NJG7v)kImO zR*kM;5RTaiYzY3UUn7A{-ebyNQgb1DxVLx|;S|*P)2go8K9_PAgY=wpU4+TYIyh`y z>@>N}(3x}CTA&@0z^gNEbsF$)cMMzW+v?`?T0e_*V6^8}kYZ5`17KM%i_KJc4<~N> z^B=3nqbk~qGH$RW9c*@n5z@-M<#B$~9-J(>pXc?P8xW7gitnZdhi=PBr-pTK631a% z%>DAL?hP@cD^XJH$-`_n8iM~>BU1AueUft8q9!G!4#;so4uiNaVvm+Ndu5KobbgQg zJ$|j++Z|SDy63w9N;$A`1hXYcpoqOlMwqSBA+5Iix>CX7ZAOEu>1{BIxIle^ixL8txpE4X|u4 zmAa-2KXvw5H>We&TpT6Njsl5*v~?M{4xaHbdLOhMpn#43O|nmT>-sha;v7SdI(0- zR#%QiiR5y)`crN#R4lHH2)Ch(lwvkAIS3Av%fp+q`p4=0`vfNUi86YdXR4{BCb{)! zjwdv1)Mo?w9zuaTa=D6^V7i1))N8>dOYj$;2`KwH+Me+9!TEO%0q*Q2^OEe$W!%L` zexNB(^JK?@Tn!vozS*FX$V!o`+zwwnuf-9fme`wSs?@aAZ!;wo0&DcTzz{k634jO2Z6_p=0f1I|W zKoOd$&W3ovB8{6~>Uo;;BSd=!-pB#|VP7_1>u)Yj;&1s|IzYuww^Fm*vfr$j zhF)sKjw;L!A-YP0HXgm9?|QR!GRomyA^OJ)bgI{8O=QQgn*MXYLYtU;>6}F`M@oF2 zX}e!DjOQg854?W>A`CZV8McR=XDowZokL)&usC`Tu*PCwhFwmL=)t=ga9z^$tG7a2 z!&SY!D;J2BH>#y2oGn?ZLr$J7=Fn6yO^Fro*AF;#3ht>;9Z*nyDe3dDHAqnt*Vc zJhdW;JeUZEvt6%GdFB;x{U-vjj2yvmX8^hv$SEDI>AB(bQ0P8%0qb$ty(*87feFCR zOBrYr&P>0aqEIt@^Gd(rHaj9mGf=lX3s8kS^{FS1bx?;IEjq|6V|`VJEsPkkK5Gc) z@*)#eEQg#q@ZPN@fv<#~R^UK@KJPIXLpOyz5_II7&&LY;b_lbUdr|30Nw>SN_nU?P zL`$Q;33Z1vTudpg8M&7%>zMuBX_3awZV|<|`uFiMv~9|@c6~e+y|66wI@}(l$4&t; zeAd8G>P{5$1}U^b!t@|NC{4|t_xhpGJ$E!05yo<)FMUY^ifUa$j;w`Km#s|eDUx1b zS0>=4&j{L~nL0Ms-Pv#EL#MKAYq@eXA5GoFfo96>9E0vDyMfTMV)+nn_i1CwDjg|4 zz$LXsF^%ohzC?`%d5olKo!KE@JL>0tM)6K%>3olg-Nu!|7NZn9vv52u@#!0q8W~qX zCAM8y(p$SiKf)l+ssQD~@rXo4%z+xgVJc@cM5L2w@{Q5KJKXYylDE z_K)ShZf_{UW{xpc$_YYVx5TgPno;i!>+<(WJd9XBS8Q>`gm}t*@&%!rN8BqT<~M4Z z(m6%VRX2TgrTn9f6Ib*fV47$XWQ|LuBFu2438&#=w{04P`|NY;~*FKl;TS3RP_`>~;o`G%=1MK=%++Odp&)c0-0 z{H{Z;)*klVRX*e&R8y`^!YgaIlATo13ob%F6YtUpLp>a=p{v38N*q&8=wl1(I zcu$?!k<@oBR}Tc1ilgrkrW$uiU-`h7arkZZIRI5F4z8IGSPr9Mm_vBV=0~su!SzR%FR$SKQ!iev`I}bv zs`gQ#b5jqVnKz5@Vr6gT;U~F)Q-(e#E0y`;G^G#d16OxAw)HY7V8|y+S8+4h{2&Oy zA-I7UaB(ik26KH{qR7 z6``<-EBYQ{?n5w^ktojndts=Y69&t!`1lC4 z5Sngi2O7*oprRikX>u>6qZeL0f}WDilXyg6dvd{JcKs~$`EkHO{0ol*SaFo4(A!P( zcvmZ-UT#$unYIQUKppF(gGqm!qYihk0;2`SyURfB$(^9NN3kPxJ@{^HA!&ROn00bf z754+*{Ykai@0)qkxAVm-gDEdnw}-EvLjGgJhDU+KRm%1Y55OK@NXW6VEUkELyEwhWR=Q@`p0e+zp;4e z*@A8^SbaE0tAqGr6{*c|x;H#!$_<_Q8^=#nib@ATa)99#TuAN6k_t}u`ZqmQ~#sL;?$LL1ao40h(T20{$J0A>;0 z^OuDKphEt#rTo*w4?v=Siex`q5fi>UwuXf&;N&jr^g{P7pYtylg+EfUtG`UJOpPlg z%6P+U3NqN)F-nxZ2(j}zXT!wGi&6<&HU8||76U2fiYkCpEBmfaUddqV6}mUwx7V+DwQL$(a&d0_W$!r z<@cN&rUgNjnhjp_#wN;UGNutm#kugC6LwLVKJ{zsyfrf-Yw|jCwtr zdaf%^V$8&pCqWKVRN>!k!S4YPE`X#7U!SdmPaIdu#u(fr(27rUnWs3KJY1hNu&OfAN)_Nek@c7 z&vfKm;ALn_#0fJ8?u*%hj@Xl05iyXWDDQ{?9LH0fI+^l1 zhaX<2TtkA}+;7u*-kEbCP%bAQzdCMUzvA>y+`U1*>!aQ-dF?LF4rQ+IA{2&p1(t!% z1_CB1b%L;Dz)UhkeL_)kc)Kp-EM?zPD(&tE<*Nd)om356KGFjafU;xOPK>*YJ+Hiu zTaw2~i0c#&DEP@yYyK6P!pWOBb}TEC_asM`a|(Z>tpSbvx|tp)C)PxH-LSjr!Q41byMWcSf9ei-gxv=XMYz; zA*Lx9UI9{FmNcEBs^KUQY%XTnZl4$HMkwdtnn(6RgPK*XQ_i5n^@?F|Bh{R)hvjq9 zp+Q4ljIiB|hNs!cTN4IQ;i0zHl}%MGIz+^MFcNO5W+srzGPH7YwmL;6o_LOA77e$e z)fk20c$WHelTBO2s}hdF0BAUH17dD%Kx=~E$f!B4A4=cUCcq=7-$n);m+MF-b-2wP zD};s8GHUZ$EM|a-ajc!McVN$~`k_gr%$RW#?&L#{2I z<79E7K~pq7x6a7VYz;?~DlY~~eR6^=@Aphy(UrIB1x=BhH*{;KYkkG~qWX84_FUW% z&~A0G`|9ARRZqHBM!{HcckB^rZx^6kvH;atxHh!fV3VdfXOqoNH|P(pwn3)8fM*6Rb=B&l_xZZULD)M=jX zc!!sG;`C^Tsuf(l(kpHkCeY5R$6|;ycn+h4R?;FVOlS82kmZzS3{CCU2R;j-rhpH8 z`ixQkP1y7b#iLnuBT4BknK8LRJ7~) zh%p2#-#66}&$b~?ekbR}OY^+h`Jl+f{!Y2KO8B};<5(G$kP;+W2T{$dNc25|6a%UyUCdxk78qF0NPUV=|Y^$fCS zLVjLIY738Z8dR@O34WARXVTW_;cFJU@vzXE%;mIQmMITIyijZ6e3l6}9u3bXXHhR< zEbD!OSeG#4*~SFJmhOE{w%2v{?^v_S#J?HhR<8ag`kGc3BX?t>!RF*`+K=?Ty@#7n zVSCH&gVqRfy%Dpq zNcwYdpb3-%(>5%lq^I_PU9V~71$b$Kv3D|hCLeAoy(qrx>CVGti0^np?#^~-ma@1t z)RUZ>8lyj6Jli-FP_S(- z7pZ2i9?sA6wi9X)i=gTG=rfw<$%IBt&ykouI6AOvqeE&-uGU%ofh zm%`e=<=eTnbp_wbkd1scWLrHxtwVWmV(q(E#f1yltv5Qv$Ubh-dnwhSZQvl}l*afM zobiQplv}D&mM_Poq~5q%W3A^}{F?1)Aq4zp{$L?#F)R-U(RkD zIxE5@938&BdSBP|!^Pp|mm$#uP^t4sIrR}}tcaTFP)`@h`F`uPPT`{Y9?m-7dzQxY zf#loEW`>okiCwtNFhp$r44)S9e2WWs}sqH$N_2YTlE0JlA zN;6*d5G>qaX%C8VT6Mibxw?<$jt6Hur==WkVqKcGStSU-(w(!{ggb~&)p$;Pb9Q&} zMMkee$u7~xU}Osjo040FGg9BQf+lNaY7r{YcGp0YT7cZ<;OqlbV{Qw4XYj4iD{LxK z77bMY<_k-DRtr@mGsN4abo~egP!42OZy?$SUBTpMZq44SrtdR1zm@LXXYc6ww(ySJ z%to)Rb6d};flM?Iq0nzcTEYqT_6(F?z8uGn6j`K?;a`it6B}m_zfomqOE>b*8=s8(n$_5;!wenoYBRDN_PY(a zV>8W{J^9u;99h6bar!rcoza*8b>6(LF#V~Px}fxR&z4VAh2~v!(QJ3#8onJP^-aGa z$K4+z*Fu@&7`^miZYaaY5f?o4EVzkh;=v?=B6D*j71ZpRw=E&ozy%8_ZAvzht=F7* zB+A*5L!OtoC+^Ix?NAo+T1&FLv)qRCN~k43(!{Akg>MJWyX2AIODTXlr{*Ml8o3CX zN~Gq{19PEf$_zf_rA)(8D@n|MaAxSeG>14+_E^z?c!qFjgg2Yx24M%1 zQGXJfa$zueckgx0v)@I}mk>I_6L$;}ihQdrKdq;etl8aTPcqlx#QT)WFe zx!gXZv!%21cvO}!rMC;u3)ghEUsHvdAjE?s^^VOx+C`RTY4)l?F^y#j_NT802OYQ< zw3^`CZi!)UVH;CL>0HjD)$Uro=xkJPz81Z{qmVAGFT>B_xG5?Z)>t09ercyMniXqL z7zj}#4TUf^!qtLP=4GztGj_<9-?PHn4g@`V9Z!7xFeQ<0AliUf#TS4dL)s zwE11=#Gn(JSH+KNp-r>soExnYywo*n<@ULyLgBi~?Uv6fw-FiBddbH&38-ZYt}$}& z1gNJ^3vW3wba(Uh_+IS?tL_FA??F^(uHp=$o`)eXK!195#)e#D$9wPe<*P7y-iH%9 zvp5YQUwih?_UH)3idkUlDsyS2kUVI7I_(Kj4s->*=aX*0-n!$uR%*xs_<)HYN{t10 zi^GOO;PS0)?@}<7MTIS$yKfKjc69M7hb-;uGMk>et*Um|<0iMe2BRrFCfdm+opTM6 z+rd%UWzf=X5~!!zJ5atsOJi{pbI25H@2LVG^+oE+&|B-pH<0yw?dIA7)Wz#QgVcc3 z-0ht4MV0R^TN%VPyqB`GP<+ZM>+nf@P6hLXnc(3h8?1hTt+l93o=B@-+ZbB&a=4S; z?uc7c{OyS-T+=CFNAMf3TnU~r2vGLSPxQ1t5_T34shrL7u;W>a$vvWJ4BAYO&|y6# z2E$}pp1iIn=1reUXghB81{D%wX}pA>Y(!wqK9M4$cdKWWUv{Y7n@jg78AaqIG8=I| z2fUaNbA~fAZGeSrOPvZHdr+FY@J)W$S!^gxgBrWV-tm=;+;5+A=BVL9K_^`EPT^4^ocLNo zF#o^5KRyS@9YxHWtZan~>f9Y@{QjAd_n0G53RRxd0 zjCllzZGP7?K*o_a2k;N$5Mvaw3G{hwh59?du}$E1sStO-#afnBv230;&`%VY9#EDx z`UBbF(j7}*Xo8`DH~c4t@&e77>k*Hfg}GZ`F7WQbWPp*7f5&XN7=Wrv#tIHjJOOS6 zH@6yrDPt{^l${AMphKWC*9BR0uLgRT4ET{3!pIh|Uq13OwFXmh9s2Nqufg4tCm14& znhb#Dfw-O^+{Lzbhz$28!4+13%6TK8{|y0&;8EB3B+uBjaPd9{c^F_$*&>iL^b;B8 z`XU6l732Y0No6$tg~U%H-V88Fuo#p-j`@UQ(ZAUfEDLq?vY`7x0Q1|Ig?fDrR%8@C zT124^8iM;vMO3n`>p!h4n2kjXTF8!|uQ1`5E&qz|wG zw51FkM&`^g`ve;WM{K=;_F^vh|W=896}g^x}YrAA+4R{^LQsUzLZB(JJ{18u}k654OJ|4-i8>8OTGE zL>|EEwgx1E6`aWEGPjJXz9+Iy>tB)O3{EJX+CczS&w}$|43V$7aPexX#y}m|gzO^w0F%kgH3(`eqpfL=!#(rfP^{0AiW@I0P@u*tB(KKs(&=ecwp8KjMcR- zE8nl`$ZxY^{~vTD)QbdgrAnJ=TnhIxK(*Cpent=z&lkM<)a0b` zZ!cB9)ztr)hUHg)L?sz+e(SWg+cf6^E-+l7=d=VhP73;gr%4U~;ylI%bgcwwQRUJ{ z;G}IYg%{_1MeE_PQ*%@_WkPX?H?Nuej!5q z7>fM=lF5JG_1v3*<7><8sTp|FcZ;8GD{n&aV>5@|OJxU$kG=R#qziGdAcI!BPr_aO zKdJuRViQ&asyg0o-@U2o(4$C3X`;fg+`#v%SmL7l`3I*yKuQ(xo1 zhJT_$oagAh_M=t&8>KkLs@KRA$7kB~*$2O0y=1MdKmz!rn;vTWbsiiTzFOm9`8js$ zHAt`upL{I|eGzb%_!uIOBpJS6j*Z%C$6&`VWcdDO`J}&mvdy}Y8Ktk2-PEnr_>T_c z3yCy-Jes6Q7VuMR-qy^_lY|a_AaqE9c~PGQvmgujQ%bgbv|#`9R`)+}!QyU#y{kv^ ze*ObbSx$(CMQLciAG?(-3c;t$PjPQ?7Wvme`=9~aPgYI+%b7(@%GgZOpP+WX+id?$ zA`p|k612$NzPxEeB%>|(aL8f-W`i2%#+PlHTq(%serh!0V8;7|+3g+66U`fiYuefzpFkpIF4`5hkev-On+H$I7J`?8{w`{m6x3)!P4g z4pXwzCP_v694N55;x~bK+9&PQ)JGF`OZsij{;^7FoPs$zm4Ighf=}XN54ce0LL3h- z?eReUZpLHh^zubH!Hwfzx}W1#l{cYSlWDh9A5YxiT$--|(yRdlAD~M|@byE@sX>GM zz9si7GDx!zuD5;5-NLpqngb8eo?l_&R^uAQ%k3TYaosIb$y0cD%t$}fQr}C-BdZ8z z;z;PoQp{nd(`j5bpHw{evSXz#0vB-SIcHK@h!|s%G?e%MlPZjS(FVva&DiZ?sKdMQgL#@=4tS%S(jBp z)--I8ZN<;Q7%^FOyNl7N!D%d|ZnX4T{A>@m<$Uc(dB!45DHrp*);51LP3kr&Gd6Qq~O%d?se=7Kcp_Hi9Nc#^`!sX zQa;y^wWzdk(zi2Chr3tM>#1us+OexyhTZsRd^&tlw2wU=nOt_4&otoN$;ydJ3G>vC zn9vqYUXm52;&mxa5JF@=4+ANc_-jkL>+>RtiF$kzXFQKli70jEZ+OT~y>MKAL8`yz z;j}6Z)jZ*Wd~Udv=gNg4vj!%;2;Nk81KW;Xt=EBVYC}VhXks5SvSm2e?N$(h+KiI% zVDfJ8lQ~L?YSio5X8*CUG9hc1!nDHv-h3;@^6GRGL zI*`BFlW^}zW`*Jh&bXZvfdU+biG8bfmN+^~3k)I>47`bFLze3F6rGqv5CX@=ETANNvzc@VVc|lx3zRYp>lJ#v3v%i$d`+S zB8tw1;a@9*{mtmT5y+K2^$XHM%=N|>lQUUGtm*t3reS_f-=YZIYvsz+mCQ=klB#2x zDqPWH@4(he4F-$)mBnu#j2FHhOx=5N-6hyPnP9{Y{5F$=7fEa4ALciDpG@)Cjjzd^ zG9U8RYJITZ+8Fo@&d;GJA3fokZtbRp;v1q#J_*{933v||Tr}9XrzkgUwnmQJyY0E* zmgu&(Q6JQfP{}eVK0b79fKTu_ z^fJ0Y-no!cFH-<1xFvg03-whiMMfuEt}XU6b<)S_E9_JGI>ytt^;i#dB04I_Gqq<| z%M0C7Xd=Pwc30Lqovdp2PHYWugjLVW?Rvl?u5AO zUyCb0Nm{P^_$hN8@1;An_<`E+oA*-rYqA-*dYM9G7C$b=!_YL+EVCw4fJxRS26^%n z9ue-Ua4Y-Eh1%EJsEg{_?SilLlX@QCvf_6jQ_e60gLbIq=^_BQ3P&=E_ji?hws z$^?@uA)(z)zM(~KEpZl7JQPvs84+O~9=f%+=39ccmxFD#HXr7GM}Djh2Z9ulepSqQ zVNAe`uSWFSn2Bf5isupMh*UY)fRqD{fuO0TyI02jo9%nD1B|Dl2un_S;S2Ffjy39T zNdyay*_FH2s+~O7UP-g?k$(p~yb&yV z7EGCh1SZ!PvWI@!pp)CEkOA6+kL-E0s}>|Hrg#GH`2%Mt#9i8nAMBJv&X{RQHl1uf zY&w~ES+tHgH7CLxtC4WJ1$GkeBKJenv1$PZy(yMcE(7KS!^sWJ+A<{d?X^ z_04}TmFajZ#T#)Ti;Ey$vMZoZT_F4DdePbMR~ncvymw;n)1_biRN2d+2caKil1rU~ znx=4$#Jbq6yVjxynOCJ`SOuaoj1s8{Mhi|&g1B1-w`^;xy^zsb;pCe56hlcjIWSQ`q_xe9y(|bd$v0evF>b4^ z(oJaG+pB8V)9kSapN_o*PHUu2r4x)fStLdvG|>io?~R4Ml2QcrLif(#)gf>9PkQ{Y zAM;?Fe~4gFB<1OEVbDStXy!GbikJEYMdW^1%k2`@yp{QT` z#G#PgJVcLJin~*kZAhBA$g*Mw+Zw=nH zJuG=UbmC>4)|!qPF1&r5lx$AzllM|GA}muEp6x)N>7=#3*L4QkK;9|*7SA7(+9((b z#kfxra-VUSqAuk1q9nR`u3v$Oq55%t$A2}XthzM>eV0ywVzXYlbqSdb(z4wr6^s z0n9riZ)L1(T#yxNu;2l<9Zp;&Ryce>iG2L>#*m_~jnkwjy-i%Z=Lf=&aJqH*%}yl@ zyYJR*exPynF_C?W!wSs|^>SUut1GqCFCGk^0!pMG(&q!(apV1PA+2seq``0C7?#>v zSe5dF+zy;tft0oReBWT@bK}4e`J1wWcUOl}_r`p$?_3K;=yUX4^h)*xKjzg8%?mbK zxes$+50HBBy1O!ky9E&;`d+*h5cxUOYoQgSR(o|hgB>0_wvWlP>3TBxTS5v<;raPzA)g28*KMPwAP%D}1( zTyM|HHq-P+iFSObY?Av>*(6mjIfyZ)r@W*e-6)&BsDJ+Z5|{U=Zs%hURE(blstQ9o_Jf~2O&6MGCyu#J`22>STYHb9#s+lnF+cx} zVZyf1-vHX?_-G=9rvcut{$4v_ObxU8$cER>qiwR(XPwwacbj&VrHORGD0CW-9N-?s z9=bX6?1(v$%+E}ip(eUm3k}ww#0rX%8#YO9=s;ks7$h!+{8G}8a3Q6O@iINfT{;^Te=y?RWVLDgY0X_H~6Lb%d-6Fe4P(J?eZ=bS-5gMa<*d#IPLz~ zKr_j+gmvP1V}B?XQCh}cg9Ho}u|$eshad>vFt7_`qh!W|YGoJUWeQ{ELC^!aSf2-P zMzcA%Gw^_UJ{oQYC)_}i54_2=QE!5O=>zg-6Q01YtdUkUM{X6|-;VZ%Vo{Ru(udUn zgA2%T{WxMG5V{IHAO3mBFlXF1(10BD2!$+e*F*@0EW3dN;2v2%@T82qTZWLC$pAP> ze2@4Mv!^BMs4)37+(mG)bqOda^Y`gNEiglK`KEXq=>62e2}&p`!LFl;bp+* z{Tf)}pI@5s<4ceHnJ+F9#Q5qv_}xnQ6p9~sl_KDv^2il_W0ynn8snj#-=emk42oaB zJk&YAWvHr?BrE&bP)GiTWTa!B1x6~_BAxa<2#FqvpTZxO=Qoe^r?r_RGJ1{|@%@@; z?~2As&j%49|0E)g0vaG2{85a3N3ZFam;1t+VnrLbp~MqteFlF}0X|NXL;)WCc?$6J z=zd87D2%U~q0eOk*Nhj-O2TJ82Iwdw5waFjh!Y#TbT);EEcxD9H9gNjJ6BA$@WPbc zpp{>h0sf^J*IsHs)zZR zY)))u=zf+s+X)=D2c;KV5s#zs01V_lg27KXwD3nP7&{fCQRyQVe9|lESKi`R_2X|S zZu@d@qB-N6gYM+rdrqI5ue8G5)ToWZYs_Xr?tti5UC<(t`iCFDTl3?%$NwJS{!zUF zDvgG+-=^PF&V1BwXe@O9p5^+8-M<+ez666i62U3*X?#VuxE+BUmzF+(tw$B2cDnH- zA~w1S7Z~JE>TFWFf5ADBjI#AeW(HBg1d94WSvDmq=L1fC97o|N`}NHSGxFOJ86=Va z|Kik4egrag9NT19aaGNpGXb>#U+wk$CC)$+T?Y7x8}+Ajt+EiH z<@A+|+vo<$0Ehb;fcKu?JqFl4Bo1HhM>q5LVe{|wy}ksmzt7A3*I3c?NxfqBCXX5u z8s7?@iO_g+NH9QgdOu3&CgSV@Yi9kyfs^|P#bGCdxfLC0gXtgnVGEqaM7j6uiA_Cy< z7zzO;!IpSQ?D_N3{}@<|bg}yX`&_J7onlJO*6VNm{x6td5LJkYenGpF7^q>cu zPhXBZPe?-Shj`9h&hLmPe!^eFe=3~%WG_BN=f4j&|0I|87Hc{zLHW)KyeA!?JhmN= zQ-L|USwiwqqy5+vi6j^EnQMjmeX%cy`ue{ITZoP$0DfNtBUCt!Xea}X(y<0~iFSKNl?B1&ZoAD(%FGyolp_C>Cnk;di|k&o%!4@tmj zAG2y3|69CJP~!p01=v_bhMoluXT9Zn^5FYo@<+GR%V)UeL&yTY5<>wZ_G5zl7h;yz zZ#!0vp;tveff=@XAR*k_aqAc8Rly#Xc&ZpA6q_$YGbm1wubI;FSBSdfto@$$O3CrC z9ksnP8}Qd@D}V}^i%{Ebk8b=jVm)OdMoy?laC(hFH&bN0lr;BGj&#~F>}b&(*b7q^ z9MM*?ivZg@m}dg(^h*zVhzBr_QLsHu2=+%b`7Uou*-e^L&Rtj?UjVV9jf`ab@ad$U zi*bY_d=zII1LcpgQ#jb%?pO;RN+ek*y8DqAATzI_6)bX@MPC; zjk;r8x>r_cg=3;!NU@c4Dafb zTdXVydJ{_1Q*NU<{U>;o}P^Y_&Z4WSPR(GlWnyba1EvE4NxZ4D@6j6PWl3D**7 z!<1e_PLTmyHSpwN+q)iTjg^BLJxA8Z25&eNiW3ekxKf8*SG1>S57isjSk>`f>Y3NJ zc8{(3HFGFrFvDv69diQ)ot&HH{6yQCjcAZ`nn^If>yd3!ok{7@yx%1+UD-;fl$-p( z?TCib2Lack%BjthhV!d!ndVPeUy0Dw7=xBK#KldH`roi=5zcO36BW4wk$2xqxha<9 z$`J{nP=wkwVVMRq7`GBPY-fFvv28)e)RTE#>J4=-K_Tc`^R5A%j!?$J4*0(34B26@ zM>t`e_zFQoXbjw9lfGO{;NyM8G~`eM2KXxJY5OPR;tfOxbY1!bFnQ?MYc039)Zwjk74%@*y@ zf9mCi@{{wnFw}{Cw{M|NRSA7Eh7jznt0z*{%&<8T&ng;@5a)OVuU?uO57NPBk938K zY}2bWa`(j?E?1$S8HzVb_nOxQqaYuNBOuS@rDCFnjx8%ow5wU$<%K9f&F>&X_%;RKi zJVu~(`hlajuKt;`Erk7E2vu500d%yHpc%PxOg@Or&+b_XBCDn5g={ayt$49&c%n#^ z-*C4J&Qi>y`X6&;DLCY?E^4f0Ch)^IXqiOLdqIm3W<=vO0H3aq(u7q5nzurf(_LzJ z;Yw?f64uzC~OlE6v4!Oa+#MEO5nNlm%=>|2<>%vrTC3pnj z9@v}hs(Vv{Tx%;0p`vk(JlZuX3sZERiYmV1VEV+22eTBN+1@vJ`w^7#J!}1_V|!=9 z%`RYzHB?_eCO=6WFS1V}Yy@L>63uv>YjCg2vi;^TFXsYlXO8#9Ys%r{zzspFrN6BJjm6`b~@&k%UMvY(*=x+Q@>*-8>M5>YZ(6MN4WjcH#*@Qe+?KPF#l9tL?QD&7OwrYHLOhci)3MYj~8k zoHZ9$3Cw2SU=uqs^!v}8+NOHgpIob7z=1^Ty_wqL>FDVcw!JqfqH+Tel8OEBTRnlz zTSVI#DE{U_Cz)R9hPSv_8)FyV6cvd;c!p5%*;m{1?ZJR4wuoXklZDqd0o{<3uMmxY z;D?Y+=I@BI6b;9*sflUBa}PfeY%SX33SK-89gwlh2sSlpRHZ$+ozw%Wvv!W%aF=Yl z|L^a&%>k zipCRQW3+!LkgsuXMQCws?n(Ak4F_lv=ui8~mNVg8xE%d3Jb1DDz0|hW4zbrU*Gj1@af}@|NOi>rs(rKY^SP_zu_Po(zJMotE!hqFhqfF5yx=rxey za&a8H0yv|#2b?}Gl&1zHW2P}!=S`dT6%I$8uP%*Dv9#Hu^32%&Yc5vhAT)Ri3+#^g zusuPOPhs;=b#jdO0$s{H!}x*(kF(|b*{qAsYa`R_?gGlZQ!3%?B_+kc4zGq92ZRXT zkeesVsA<9IZP9VaG{TYVH8RNB>#oDv-hEy_^mnD5Na*aIe9EgR0>F{6{w?vt{1pU< zquEo-mMgHCz%k(Lul?Rtyn}9WwR320MN-6UD`O!g1B>o!#S`8xdc7N?_)9+AcQ@~=87nKdhBq-8BrtDimT;bZP4 z(@EUihxctsq}BPJ;#h(PyWfgadkM3@g?>@zbi7@Xjd4Qf^@SCwReOzBs`RU5lb@5G zlFIv4#I5eLJ)`%)kHsB*BAWn4xrh3Uh-WwMXF6zTRPE)|b;g*(6S6hu7kgYX=X8=! z5H^bM=PNo=*cMJ|jAV-crlzm6!>b$iBD9C%+K4+>$wS^4+Tc|{8SL6?!t1Oec(c`u zqbF4mmpS66y1h^<9gcn+<9Hero}A`c_L1FBu8nD8nCuBxY3kv%fwxPzJ?CsgAh<@asIp=LsQ

`^o%9W)l*G||-KQ4?j66wa3+4ZzN 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 YTyNi}BYyCueS3HB4Bk=y>7l>=FXCc1b^rhX literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/callstackselect.jpg b/host/ide/src/figures/callstackselect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccdbde9c618790875c1d1646f49504eca1f39583 GIT binary patch literal 127570 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/chart.jpg b/host/ide/src/figures/chart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c17758ab78a2fd465bed0c13eeb84ad9e95fe588 GIT binary patch literal 61715 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/cpu.jpg b/host/ide/src/figures/cpu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f21a80d736774623f24a8f6a1472d5d7b4a2ad30 GIT binary patch literal 113908 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 z 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 z zHwq-Z#I7sDe1E7Hfj@zD^yEuZR&&YHYVer^35@H~&(W;vclw*pu2xb1$i~-bkkv!^ z_mXs#K4<$|o+UOQo52==t$8+=v_;4(IDlyxZZ8g~2u869ij*xjbpG8fPUd0A8-)Fp zLwqTK5-csc%#7Gw!09nB6Hzxd9v4r^c1^JLI-#lk*r^Bx{GeC?dv!e>&f}FELiQ~+ z^qQ%TjH&&NafSE$Bgg>EQ{cP2^-~3$Msrd~|BMj;e=02Cv%fY^aEDcb(ht;auz#M` zrN@bjACyIM6wqQ?$;+3U_P( zvfZAZr;t~mt1B)=={Hl0WyYj~2BV-KU0*{GSqT3(XXD?K#~AQU zmTw;hi{OCsqJXd0T{x8SX4@5-3HACB1DExnd#xY{w%B26+49NrmYc>EkQHl*jfedG zhO?@JbR=?02gZRU@8#DlzyTl=>^U^k%DK+}smqa70fq4W_h&n+q1XGIBt7P7+PM!4 z3L6lDVs|<_Jm8?0D(k()4}g*e<-yj*cO@O=k|p{L8vW|N82|hV11#@;L1YHS@sUpLIsVrXkDMBYcRDV)&swZ27uRUtH82LcXB#*Of6LnOk%*O$MQ8j6Hu^tTCqcx6 zn5}Ki*z0Rgn$E2>h6H;(N(C;$Msdh?_HQ`-cO+gb82`~p!jD7H<&(ozo4b0B)myA} z*z7l~s9pno|5|qM?n2WH2iZp6#%UGk7H{9XI(eJjEp0g#{@#4;oHN2UZC|oVAk8CTSgE3#hr6Q==yjak z#&=y?uHhC=;oXyVx9#7rFZCQw?zmo6aRSudnXIbHHJ)nE9j-TsQWFd87%0DY;45mp zrfdER^$lt3-QAdHm(y}{GBYwvCz1C)bZpi)Yb%lAb}hYU&dL6`<*v9|fbErxBmtF& zf|a^amTg;~=Xe(9eU$9)uzopLV%+RL+$4I4J5-V*+tmUyp>(zXgYULxwH_;U&_^Sd z$j4zl(}@9#qoOwL4R-r{cIP8nI?h|kwaI*yu*XIdoFjFE8ngvWd$yVHuJAFMmNmi2 zWug)#FJiS1??#qkSsr#Hn@v$?t~Hn1#Uj&%-=F=Og>c+OC1=wj6vA3G8*4GLI7?TX zEq(Jsk_m(DeiQmdU5Ug?b$Yi4_A5U2uNeE}R!Yq=eOk1;I5{l(%QEpYT)ooE;02JxB>3>-}vO{`oBhMBGKCyL@r4?jD=*=G*=fGv+wVo8uqelLA}JM3MY z`-#kFW}hKN71WHwj%q52XC*a^V+~Xu404#>&C9P%N!;HhI`ybjyhlXv;yAYl@|fAJ z+6Td|SAxxAUcYsthD?8%9h)XKY9*rprdZl)0%QJn$Z`Q*L z2eWO+GQrm1Vw=b`1O3a8I~=ATEDuA81(Y-i7i$g1sboe|^oGkf%ofEiaoXF!Pi z6DJn>EI{NHYQ7eGs1TbY3zfEvEJpR)svK|KZ~?^PBH$)IPMY=y&D}O;_flP8p9%kN zdiZLN>@{gC-}&U;_tR$G(xper4H2K|3_u?f*$+7S0c+PKWC{Eb{nihIGz{`KVxrt2 ziu!5767iuPh&?$PbCJV>u3*eJq^;i1r&;D!XL=HZ1oWLB#-Y2o3cwj5 z2t&bD!ae!pwMHRGwQ(CPEjb}f|Fr=x+GqQz)?H_4a@t?8X7HliV^q$7%cq-}4kkmy zzfKAUoWGi*5|63Xe}+G%-8oayNnEg)ijw5XyO{L#d}Y=~s>9zyY^ornH?0%f!R_l; zYNof~qBRp4Tde(7Uy4d(;P5nD6t0@YrWa$=&H;{#fysNkeU zvp#oM_D*X^nYoEMk2o9{8B>PSLyr!Wqr@NM^s-BlkT@*{%n*wwT`}5YqCx0LW>=&0 zh+Qc%izzBC_VDZgn3yzHK|lhDS2n**gN(*xcvkUty#~%yGtys`npkm8upP3k2{hG#vpVmaVOknx>3%(#g-7kIqcJp~0F8n&T z0JvR?>Tj!gC9(IsPB7K?@4F7vgAn(~t8l$2Te<^3(jqIszI>IX-wQjLcepd2o$pbev(U#8L|`om15naUCa<6E2)VVA<~13 z~W5B`@g!<5ie%wy&YIFkQ811oDN zZRKO1+$%7H?6xW0uw5NdD!6k#6E}8b|IYhKjE@fco|1K1s=Ioqss-4AR@>;^)pxCf zf6{TxOYye=QS!)6Nn!($j3=X9+;Hqp@YzbVkH&rC0#&g^`Nsu4yvf-q%~9h+&&{gk z*=+J_kZdHciL!mI4Z@Tu4A>aiUD;>Es)YVxiPQUvfSQm&N)9~x9A3xC197}P%sR*5L%KvQJc&^mR8WYf9N;C4H zIy0Da5ggz=XyO+3IBxo4OOon>!g*Gc(Dn_ZupwXjn5oyUZd4%1_&{seEDxP|AvWP! zbtVKWPaKTZW(_-8ur0Cz^&M`5E^+CuEaIx#yes$7;f;H?m+IFqdXjwbeMHt&cV#J0 z<>no^ g$Zvg)@2CzZi7#VS^oazXd)gI9hfLOlY==lPykrCPSQ<`0dnFluxJi5R^ zQ|(8&fXgIt2arU0cjbU5AQ`4dAefQ-iJHRw$QbR@2*MGU6UZ&o>?5$5{oKw6*?{e- zm3Fs=l=z_vNX@%-DMgT1A`5v0{bwelC~&a0_p%*4-s{FG;Xz**RJ#EGvLt!;L$QQy{)0| zLd-0tq5;EJ#QJRQ-p)yVuqP8%^~1es*O--YY;nLRX_e!huas?3_Z*jgs2@WR_#J2Q zd7+7W)zgf9=OeI@hl?$0e!L%0Ai%gNIRn7!S}g_K#ENp&gTi>KgHmRXxTk>p_l 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 s>H2e)2h+E04a8UHZn+a literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/cpuclick.jpg b/host/ide/src/figures/cpuclick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1a3c6d358474a1c649993cd673b66fade9871d6 GIT binary patch literal 100490 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

  • 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 Wj`qT+-P;;9Z!}GjlLnao-vj{MV()hV literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/cpusage.jpg b/host/ide/src/figures/cpusage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aba4c0ee62c02bc846ab17d3f2cdb244dbe66d2 GIT binary patch literal 156691 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

    8%JY`z!Ugeiw-@%a1eA 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 HHTQo2eyqL= literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/datamining.jpg b/host/ide/src/figures/datamining.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8967408ff899f96f86492bbc1ba81c0a169ae5a GIT binary patch literal 139108 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

      QeMu%)b>awXiog2ur3IAG(-iOx8Gv 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/dump_and_mem.png b/host/ide/src/figures/dump_and_mem.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e3cc26ca286702c9ca9869fc203aff34a8da39 GIT binary patch literal 5805 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 E4=MAVv;Y7A literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/excutecommand.jpg b/host/ide/src/figures/excutecommand.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08335f77d94cb19252bb4cee92944339b8bab64c GIT binary patch literal 101387 zcmeFZbyQs4mM^*scXyYJaKA!u-i!l7`Ngg_vH;2Ja#T!R-L2=1;01Sb%j1VTv2 z&wXlNL~ylf0i+{`pI?4lgp`~pHk zLiB9n(qa%PUO^$qUq1rE#KgqG#-YH)rGPNfFhc%6zkYQCgcwNUDC@`|CIE>LgiHwf z)d$c600{N|YX7?6|N8|(LPkMFL&w0x!oL4N69Iq(LPkbHK}JPILAn2Q=>7Wu3Lz>H zqktS5v5qx5lP3w}SyBN8vwU3-sqXX{SkT5R921L-oPv^yg_Vt+gHuRYL{v;%LP1eU zSw&Ut;bT3014AQY6R547y@R8Zv$v10pMOALP{i}ds24AzW0F%+)6z3uXJ)-EEGjN3 zEi136Z)j|4hPSk~edz7$9~c}O9+{b)n_pO5T3*@Q+TPjS+y8WMcz$vD%n9e)IB4$@tVdW0}E}koc|Tt-y-|_0t^3#BKzNg{XcQ70655?`-g{22s{9?@2Iry ziXZ$a`vqK8JlHJy1sp#91&k#80-WE`&c6?~gZTzuIH!b6ptCv-jf^tfk;``ex{J7%WCe_}^=u6R6ac z`~rH_egSi(zkoFQyLk&cf0Urf1fTX$wG$T8Pp-`Aim8~`(j5wZd$=hnDM^#f-o|YP zDNf~1&(>;~TJC1xO%SG=SGyzN9c8qw?!l$Y9H2eJd+}q=D-S2DS3oPK`e3w3h@4D?gMM1MZ0hwTZyW6 zE2Dw{;6U4&kMH>lh)VedlxzJ0I3N71NciUT;Ct#X;G*ysuu?h1Q`MMj_;~iqXSB|6 zm4yvjLO4l%h{rB1A@t_w!>2bozkp-?9U>Daz7pY|RsLQ2)pPuhSkjQqxT5iP zKiqw~`*apE*�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 Q=kfo%{%@WE(eK6o0NFZRWB>pF literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/filters.png b/host/ide/src/figures/filters.png new file mode 100644 index 0000000000000000000000000000000000000000..a02d9416f08382ff7a03e176e37e6479f5922c08 GIT binary patch literal 49833 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/fps.jpg b/host/ide/src/figures/fps.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfc18dfe881b738f6e9b100e4e32d5ab04dcb383 GIT binary patch literal 7002 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 g(=}ho_F^9(nG(4uU=TKmErVUH||9 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/fpsselect.jpg b/host/ide/src/figures/fpsselect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14300f78ce384f8ad0366657e3b0eed2177e7505 GIT binary patch literal 92018 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/liveprocess.jpg b/host/ide/src/figures/liveprocess.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2088ba7ab29c07f105ed62df4a6226244326f34d GIT binary patch literal 129259 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 D+FP!w literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/log.png b/host/ide/src/figures/log.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe3780eb647493dec252d69f23e71cf66ac15a8 GIT binary patch literal 4037 zcmZ`+2UJr_w>}_9l`5!!NQa1`(g}i6LnxtLLQ_CGO0UwTDMflH3IT;AfOJ866V!k} zP@42m&85bRKVduzS*zqkH>);j0RIx~CknZ4)x_Ur^B1ndGM4C>GuZvLEc{Kqoc)6y`8olno^IZc{QR9B zULwo_0IL;TQ|+&(`J1z$`lcjax?eEQFa0=z2V!kpEHG)+(b~?%rp!rVj2$AzQpAom z%~o5oU${Jg92tFN!N)A)5ov0VXmuWWr4Qj1ys4=B&wI-NhcxZ_mOv|<-Zuj@3;X`b zcatr~kSWSH)xyXdw@OH13oA-Pp)A;x^{uV*v21!mI&}9XFq*+cRb z)fBPWb0ROQyLTt5#~WA})7LUcG78E+(gG({nW6A$Vn1@vHH6kl!7+8`-6{0x)ehxtE+Bs1Hj$qvRQKsfB?i{)PxwXmrkdP z=92gzY)BnwFmzby!V8qZ3y=#uwaxc7(uxu3L5}|R zuKt$K?SKx*_vVXQ0W7#G=~?VwSMmV>DN}k?A01OBSzOT(yjh1W*75G+Kd!!0u``e! z#2EIQ`Wy*?Ekv7>?AG|0i(Pjwy)=X5JaGt@vFP*5qk5k2S^}?fAFOg*CYlZq2s0Jhu^8kBM;)oj=j(#0T?3Sl zycpUpFm4z}i9*)h6iqA}zAd#Z^Ip3hv{q18a$hj>S^FIGyzG^MwvDd^B}`7dm>z`e z{h}&oM2CU;GPlah{#7bS z*R$qz1>st1K?^iLkji9#&`o7{?Qv0@G;SahgR-WgNfgrl$ZH?VCxsjpW{9m7z~p`{ zNLh9oUq!1Vd4aKUrg)U?HUTs-lxXVmu@#!AXuA1TWvHumh$sp>V??ZcpXSWo%&L1Y+QjJ&IVaYKBdutFic$NxVgzA zY6GLqK5O}bm9vbplHM1$)`cJH$Lc+K&p4u>6P^SOj~H^Q8*#kND)ZeLO;*V6RuG-r z=Dn-VLKlKUWjsR&XFLfZ@2YTMtMqe9$};MKIqUoL51Y!{Bxw?a9@;gqPGy+n7$cpY zbuiNa0_oA(B0*HlO$k5fuz|}_IyoXB_8)~9GA(+PI_~Q>Kltmr3`>tey?{Z%G8*P) zgT4ryPi2!K9BtV{Advk68nqgw;!*or8j^)tp(%ORFGEsF===cW!0ej(Tbe&;@tKD* z#?k9;+Ud9mu!jD7FcI53nth7wI{H*3x8~Y;xwyDEIW?fY5+H18e_J>_K`2B2G%-ZJ z4z%}g=G+k


      w6VmI(#OH)&>KidxG^7GnBcV?NNY40t{t)Tb z!Mog|7yGPEAc2-4v%E<6rqPK8`dp`Ze{WdWA&FByfyx5j$_?^qZQR z{-}DW2i3ESb57mPQw?visgB%gCd~ztuD<9|gCcUF;fMbA_KWyyk$l@LG=jw9si)$GK4x2qPF>-HXGW=*SorOb0aIW~+nUH_5`@{C$?x?BstBu9aNtmVB zq?wr+0)g-gB2Hh(zd`{Oev?I`P^i2-(7c3li>6|c5zvCHEW}9^z9Afh#aYhMQ%_zxquOz0j4e%)!p6g zQV=ZW9?5w*Q01!^xG-2MzlWEXZJl#6ekpi|^ILI!LxV1MczJob26PUIe5&H`-8X6jQ*MFRWo5L)4zlLEF_MNaka(H%==$^ZQfkAGYzdw;obbFz}w zR)ufUXZu>z@7cFVlLa&5h9VSSG4IS5KJw~6K8E?Nft$Jr1VTrr#;P)kp#L?QS7CT~ zn1h33^zp81p(L{GQwPk_GOV%HOKb9_cB5i{5YLi}Q^F*DzaXg0J_~y{iS_u8iJ~>- zoMKfU90oJ78JO9JF)5?Il#6n}r?ek!wOUom-@LimM;UL#%y=sNIuHy~;j-b9tH48j zv^6zRSy?wNYV1yr55y7q^sZfY*Kgjetg2EC+?YtZ)v^Ccnb$%sO!eBKLM2-a7ws=c zal+{6=;7gE3?1uZS)ObM+F7vo{{4IBfm~w~lWmcs+AHCDZjIkv&($`O8FX)OQzGV& z7kwMWYKnk@{ZC5ZscR3VbetZpCnO}47#2FqSh7uS?$I)FU*zVlvTodB2omLvp%lsD zd(C%kZO+A;tytO(!2h(`1hcn+SGlyH_iGN4N^D^qNuP}zWm`U59v5(uN?o8TD&ecc zSXx@z4<9~U3*TW6O^FOb-spHidHAf3n@JhJ9RF+G*uHim)Vi7& z5`*R>E%#+oHm51u{kO!$#S4{#QnK3A-WW-MoDMRLAyh|4;H10z+vxcC-dreobLvBq ze;Uly&CRmL?qdR{_{6l+iFki@xXIAm=@*{kqf+4TXP#Hb;aYh{Mn(zO( z*PAXJ(jL(r%K(xFOGRl{OT-D(V1$8zA@wY=scWLaV|ujAw9#W)8>&;v(79eZ|N4%@ z^Y5vmW#8cWl%lc6S6N;l%P-6b8re=1#|N)unO~Qb^dfe& zd(O5z`B6o?$d)JX!E-O-Znmir`^ky)+Sb;Vr>Cb)M_BWBS4W>h&}Y`_>fK;IvzQU* zVR*3Xqvhu2=I7@J=G2|lkwR~C?c!P-?)jtK-d-K#`?u*miHm8rktbQWRd62z0|WRu zxSASOD!zYc$mPyu9;LRF#WaPvr^R4SqYxt_&rT>_vn_H{C9Shtjl>9LIXSNW1d-u> zglz0ciDA;`MPXRVK8#R!FLJ&ss$=^2ghB+Dy&Gv^Y%G}B=Q-2F-iC6Om?&D~Z3SJnv*SPfi2c8%Kzi;3 zl`Y{@8yg$Xb&Zvqx0BhLg2*=HJS}2t5czO-eIKf_)y4lgz`k~WZ*%&TwFH5FET4Bt z>cPb1t=*2}rW@`*8a-Z$iYvM{16aS(N1oP58$pMhG? z>zm@Asf0`u&;B^?#i zCjGDgr#nmyV5N#HbfX2+S&TQFNSpAyvs3ixSY8{8r;VrVuzO z=O$)8P=gNLrQx6-y*uCZhc{Igq0k<1S+_6sgU_|Fwer z7eCq%XB3V1+xk@0{FXGq(7>C{ycFnbnf{Le?(Cf0Q@IZkYTIC;4ghd1gl3hxUG#qe DzZtlV literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/main.jpg b/host/ide/src/figures/main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5209395cb5c65c857a192b7e0ec768cd2170181e GIT binary patch literal 7630 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/network.jpg b/host/ide/src/figures/network.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a928cf3ad96b3d0701dbe79013d48792b360f172 GIT binary patch literal 160666 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 z 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

      $CzHjcQnA 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/opentrace.jpg b/host/ide/src/figures/opentrace.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2fcf84c6dea67205d5cd5b6041dad1834631d33 GIT binary patch literal 21461 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 W72uBjfuHsZo(8 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�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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/smartperf_framework.png b/host/ide/src/figures/smartperf_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..62c1bc6cd61e07ba3014141f70941e6134d75681 GIT binary patch literal 19831 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/systraceconfig.jpg b/host/ide/src/figures/systraceconfig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5436850abf26aaea585049af1908c85d1ce67178 GIT binary patch literal 36103 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 R>&*Ri2LAs&0}OxW{|7)PXv_cr literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/threadinfo.jpg b/host/ide/src/figures/threadinfo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2b6be2acf86bcc2612ff4ab1a6b820e6551b9b6 GIT binary patch literal 169830 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 F{}1SNu>t@9 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/threadselect.jpg b/host/ide/src/figures/threadselect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38fda253bd3bab6d3388b1e19cd39d488386d2ba GIT binary patch literal 138639 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 BGc+@!B6?UTEYQSM|n~I)Vn7p2!B&>h@M)N0} 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/time.jpg b/host/ide/src/figures/time.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0221cb47e5874a05280a7315831fd61ec13cdd0 GIT binary patch literal 25236 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/trace.jpg b/host/ide/src/figures/trace.jpg new file mode 100644 index 0000000000000000000000000000000000000000..378dba3e866095c0b1155175d09eeb615b3dbf9a GIT binary patch literal 120151 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 literal 0 HcmV?d00001 diff --git a/host/ide/src/icon.svg b/host/ide/src/icon.svg index 168c113..1cce633 100644 --- a/host/ide/src/icon.svg +++ b/host/ide/src/icon.svg @@ -1 +1,2173 @@ - + diff --git a/host/ide/src/img/help.png b/host/ide/src/img/help.png new file mode 100644 index 0000000000000000000000000000000000000000..05cc5d13cb1d94025ac8c6381c0d1ef1cc7c7443 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#j7Ub#T7-AuK zG-#vWVF#YA{nL~Lk`@U$?{DaBovXP@X`#Z#gDyu8h))Ed#05`w>!%g%{rDEb?5D#GWQjf zS`C9)BB$ln)cU_`Oi*X3luq2U=Z0O!q8GvMd!!~+YTcM|dFeN&>EY)U_+`zG&kLrk9bCl5^~r`K!-adH!46yzp3- zUjg+Uxi6R6&6s0Z5I$`)0hh1`S3M|_{NSFQDZ(%o(IPF_qLWd z72Z&5)bMc;niR3fyY5V~e*m{;$YSx9CW{C0LDzQte7k>9|J04q`>w79g|erspUXO@ GgeCxFu(4PG literal 0 HcmV?d00001 diff --git a/host/ide/src/img/normal_off.png b/host/ide/src/img/normal_off.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6aa75d2bed70f851cf7269f86fa8d6432dbd08 GIT binary patch literal 1076 zcmV-41k3x0P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR917ytkO0NcmjDgXcjo=HSOR7ef&R?TZuK@i{F_mSki zMEc=ZTPjlONf6Y7#fw<+;Kf?82#QzzBLtz|dMfl*dsFb>wI@9Yy%nSs6oh&-P3(8l zq$&A$Z`YY^_VM!alDwpNb78W(GqW?l%)FghLjI4_MSw;;-cCv{uFwAl${T_>YaF=gBKS^$T)Re%&jMh!OX z&-Tto*X1+F7#!#)v6!iJ8s^gRF)0*F5~QYSP0?&n4&UUdp-r5L$2Y>nCm+v=!~^#` zlX-apPLQFC=UalqW42|HvxEH*Nr$+uE2E2i{1hUNKH|8aK;MtWI~rutxw*N7#J0g=EqurWu~rFheQOXK*<< z=aRy7+Vl8}Fu5NfrkKS{bMrKwY>KmgXQpN*Nt?xeL)Vy2VE{ zxZxPVZo#1=IAfMdy_(P;fVk@(R?rZbz+F>-LDJ z4|TI@+ho^c)E7+v4|9bTY*~keNS&y`9@fMt1-ju-eFHse18>+gHb zg&0%4Rz0x{LkCc%1cuJ``VZdy1DAGdL^p=m;fA(Ol1I36UVRVt?jfWY_f+EEOmXzas>Jdz_-=LByQ2xDY uH42n}@3(R4wQ}0YP&+*Zu9JPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR917ytkO0NcmjDgXck;Ymb6R7ef&mR)EaMHI)+%-);a zXkw^=l4`Jl3XP$ZQXf)KNvjWn;)4$@w21m9B1S~CKIn@eNPTE%MX^xGgRPW;&6^-a zTd=i$K`F7d&}yQFGz~XtKJUlw?D#)tcXDsCd$*DH(SersI-9$ zEh(=8XOp2HUi|a=H)rVN9-lSi(hxWk@Zm$Yd8twwfam?zQU|=isf9!CxjsqXiX45k z6f!7U0Lz1Zv_f8qJmnQJaljw{_0Z_hu1XeUL%@v(7dKP_bqYXztfb&Cg2F)hEUQ6^ zlPFpMG(^Tw?|P!$+Y7X{D^G0&MN@u`Ud8t5<3t2^5$=OtYf7Yx1s)dHQqY{}F4 zk(+;wJT`r7$9x)O6!Un-HGmsj0fz~tB1g_$v}F?0b_Js_R-Pm z(WfuA(+fL1WP{nVzN>eTUGUuMk^tOru<{65^|DhGusBMbe{6@N8TI2-0b=b2XOUT3fY>ZMHsH+o~`6`%<~GQmE0*P<1JL~#TIc^4OHfxX)%Zox4`1g)&a_e<;P6M$oHHeb3?8>lQ;HIBWei9D*U_U zFIEO{X!Zl5WBKoe<5mZVE@`g#F9x6#_+$a91R7&pL&#L@1nx;CVAHl*9-KP=!QopM zhZf*!!=PzA5{q|WJJyV7qj#@)F_P-`TR$N1Iwzy^f`iEt1`?z&b@>&>kSrNHN zbaw&SW<8`Ev&;dqtR9rdTvFk9!WrcL-7ZmYu-X>2Oe5;jeJV z)&!=2D%}ZooWjo67=(7S9}#lk*~H7@$M{jofZJ<9HUnooV^XogKfWWA8-C~u9A?}k zpU|YhzpuH-AxGpu%OT~aX8*(CN?#67ZDEYOQy?eEQ)4E)P}Y-^;olOW-`l;O>4IG8 M>FVdQ&MBb@0DJjQH~;_u literal 0 HcmV?d00001 diff --git a/host/ide/src/index.html b/host/ide/src/index.html index dc1753f..b1f4cd9 100644 --- a/host/ide/src/index.html +++ b/host/ide/src/index.html @@ -39,9 +39,9 @@ let req = new XMLHttpRequest(); req.open('GET', document.location, false); req.send(null); - window.version = req.getResponseHeader('data-version')||"" + window.version = req.getResponseHeader('data-version') || "" - + diff --git a/host/ide/src/trace/SpApplication.ts b/host/ide/src/trace/SpApplication.ts index b5e8eff..5b736a1 100644 --- a/host/ide/src/trace/SpApplication.ts +++ b/host/ide/src/trace/SpApplication.ts @@ -17,6 +17,8 @@ import {BaseElement, element} from "../base-ui/BaseElement.js"; import "../base-ui/menu/LitMainMenu.js"; import "../base-ui/icon/LitIcon.js"; import {SpMetrics} from "./component/SpMetrics.js"; +import {SpHelp} from "./component/SpHelp.js"; +import "./component/SpHelp.js"; import {SpQuerySQL} from "./component/SpQuerySQL.js"; import "./component/SpQuerySQL.js"; import {SpSystemTrace} from "./component/SpSystemTrace.js"; @@ -32,7 +34,9 @@ import "./component/trace/search/Search.js"; import "./component/SpWelcomePage.js"; import "./component/SpSystemTrace.js"; import "./component/SpRecordTrace.js"; -import {TraceRow} from "./component/trace/base/TraceRow.js"; +import "./component/SpMetrics.js"; +import "./component/SpInfoAndStas.js"; +import "./component/trace/base/TraceRow.js"; @element('sp-application') export class SpApplication extends BaseElement { @@ -41,6 +45,15 @@ export class SpApplication extends BaseElement { skinChangeArray: Array = []; private icon: HTMLDivElement | undefined | null private rootEL: HTMLDivElement | undefined | null + private spHelp: SpHelp | undefined | null + private keyCodeMap = { + 61: true, + 107: true, + 109: true, + 173: true, + 187: true, + 189: true, + }; static get observedAttributes() { return ["server", "sqlite", "wasm", "dark", "vs", "query-sql"] @@ -67,6 +80,10 @@ export class SpApplication extends BaseElement { if (SpApplication.skinChange2) { SpApplication.skinChange2(value); } + + if (this.spHelp) { + this.spHelp.dark = value + } } get vs(): boolean { @@ -91,10 +108,6 @@ export class SpApplication extends BaseElement { return this.hasAttribute("server") } - get querySql(): boolean { - return this.hasAttribute("query-sql") - } - set server(s: boolean) { if (s) { this.setAttribute('server', '') @@ -103,6 +116,10 @@ export class SpApplication extends BaseElement { } } + get querySql(): boolean { + return this.hasAttribute("query-sql") + } + set search(search: boolean) { if (search) { this.setAttribute('search', '') @@ -121,190 +138,200 @@ export class SpApplication extends BaseElement { initHtml(): string { return ` - -
      - -
      - `; } @@ -312,17 +339,19 @@ export class SpApplication extends BaseElement { let that = this; this.rootEL = this.shadowRoot!.querySelector(".root") let spWelcomePage = this.shadowRoot!.querySelector("#sp-welcome") as SpWelcomePage - let spMetrics = new SpMetrics(); + let spMetrics = this.shadowRoot!.querySelector("#sp-metrics") as SpMetrics // new SpMetrics(); + let spQuerySQL = this.shadowRoot!.querySelector("#sp-query-sql") as SpQuerySQL // new SpQuerySQL(); + let spInfoAndStats = this.shadowRoot!.querySelector("#sp-info-and-stats") as SpInfoAndStats // new SpInfoAndStats(); + let spSystemTrace = this.shadowRoot!.querySelector("#sp-system-trace") - let spInfoAndStats = new SpInfoAndStats(); + this.spHelp = this.shadowRoot!.querySelector("#sp-help") let spRecordTrace = this.shadowRoot!.querySelector("#sp-record-trace") - let spQuerySQL = this.shadowRoot!.querySelector("#sp-query-sql") let appContent = this.shadowRoot?.querySelector('#app-content') as HTMLDivElement; let mainMenu = this.shadowRoot?.querySelector('#main-menu') as LitMainMenu let progressEL = this.shadowRoot?.querySelector('.progress') as LitProgressBar let litSearch = this.shadowRoot?.querySelector('#lit-search') as LitSearch let sidebarButton: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('.sidebar-button') - let childNodes = [spSystemTrace, spRecordTrace, spWelcomePage, spQuerySQL] + let childNodes = [spSystemTrace, spRecordTrace, spWelcomePage, spMetrics, spQuerySQL, spInfoAndStats, this.spHelp] litSearch.addEventListener("focus", () => { spSystemTrace!.keyboardEnable = false }) @@ -330,17 +359,19 @@ export class SpApplication extends BaseElement { spSystemTrace!.keyboardEnable = true }) litSearch.addEventListener("previous-data", (ev: any) => { - litSearch.index = spSystemTrace!.showPreCpuStruct(litSearch.index,litSearch.list); + litSearch.index = spSystemTrace!.showStruct(true,litSearch.index, litSearch.list); litSearch.blur(); }) litSearch.addEventListener("next-data", (ev: any) => { - litSearch.index = spSystemTrace!.showNextCpuStruct(litSearch.index,litSearch.list); + litSearch.index = spSystemTrace!.showStruct(false,litSearch.index, litSearch.list); litSearch.blur(); - // spSystemTrace!.search(e.detail.value) }) litSearch.valueChangeHandler = (value: string) => { if (value.length > 0) { - litSearch.list = spSystemTrace!.searchCPU(value); + let list = spSystemTrace!.searchCPU(value); + spSystemTrace!.searchFunction(list,value).then((mixedResults)=>{ + litSearch.list = mixedResults + }) } else { litSearch.list = []; spSystemTrace?.visibleRows.forEach(it => { @@ -351,10 +382,10 @@ export class SpApplication extends BaseElement { } } spSystemTrace?.addEventListener("previous-data", (ev: any) => { - litSearch.index = spSystemTrace!.showPreCpuStruct(litSearch.index, litSearch.list); + litSearch.index = spSystemTrace!.showStruct(true,litSearch.index, litSearch.list); }) spSystemTrace?.addEventListener("next-data", (ev: any) => { - litSearch.index = spSystemTrace!.showNextCpuStruct(litSearch.index, litSearch.list); + litSearch.index = spSystemTrace!.showStruct(false,litSearch.index, litSearch.list); }) //打开侧边栏 sidebarButton!.onclick = (e) => { @@ -395,6 +426,21 @@ export class SpApplication extends BaseElement { }) } + function postLog(filename: string, fileSize: string) { + fetch(`https://${window.location.host.split(':')[0]}:9000/logger`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + fileName: filename, + fileSize: fileSize + }), + }).then(response => response.json()).then(data => { + }).catch((error) => { + }); + } + function openTraceFile(ev: any) { litSearch.clear(); showContent(spSystemTrace!) @@ -402,6 +448,7 @@ export class SpApplication extends BaseElement { progressEL.loading = true let fileName = (ev as any).name let fileSize = ((ev as any).size / 1000000).toFixed(1) + postLog(fileName, fileSize) document.title = `${fileName.substring(0, fileName.lastIndexOf('.'))} (${fileSize}M)` if (that.server) { threadPool.init("server").then(() => { @@ -410,7 +457,7 @@ export class SpApplication extends BaseElement { const fd = new FormData() that.freshMenuDisable(true) fd.append('file', ev as any) - let uploadPath = `https://${window.location.host.split(':')[0]}:9001/upload` + let uploadPath = `https://${window.location.host.split(':')[0]}:9000/upload` if (that.vs) { uploadPath = `http://${window.location.host.split(':')[0]}:${window.location.port}/upload` } @@ -430,13 +477,7 @@ export class SpApplication extends BaseElement { } } ]; - if (that.querySql) { - menus.push({ - title: "Query (SQL)", icon: "file", clickHandler: () => { - showContent(spQuerySQL!) - } - }); - } + mainMenu.menus!.splice(1, 1, { collapsed: false, title: "Current Trace", @@ -456,7 +497,7 @@ export class SpApplication extends BaseElement { } }).then(res => { if (res != undefined) { - let loadPath = `https://${window.location.host.split(':')[0]}:9001` + let loadPath = `https://${window.location.host.split(':')[0]}:9000` if (that.vs) { loadPath = `http://${window.location.host.split(':')[0]}:${window.location.port}` } @@ -512,13 +553,7 @@ export class SpApplication extends BaseElement { } } ]; - if (that.querySql) { - menus.push({ - title: "Query (SQL)", icon: "file", clickHandler: () => { - showContent(spQuerySQL!) - } - }); - } + mainMenu.menus!.splice(1, 1, { collapsed: false, title: "Current Trace", @@ -608,6 +643,27 @@ export class SpApplication extends BaseElement { } } }, false); + document.addEventListener("keydown",(event)=> { + const e = event || window.event; + const ctrlKey = e.ctrlKey || e.metaKey; + if (ctrlKey && (this.keyCodeMap as any)[e.keyCode]) { + e.preventDefault(); + } else if (e.detail) { // Firefox + event.returnValue = false; + } + }) + document.body.addEventListener('wheel', (e) => { + if (e.ctrlKey) { + if (e.deltaY < 0) { + e.preventDefault(); + return false; + } + if (e.deltaY > 0) { + e.preventDefault(); + return false; + } + } + }, { passive: false }); } freshMenuDisable(disable: boolean) { diff --git a/host/ide/src/trace/bean/AbilityMonitor.ts b/host/ide/src/trace/bean/AbilityMonitor.ts new file mode 100644 index 0000000..b58e238 --- /dev/null +++ b/host/ide/src/trace/bean/AbilityMonitor.ts @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export class SystemCpuSummary { + startTime: number = -1 + startTimeStr: string = ""; + duration: number = -1 + durationStr: string = "" + totalLoad: number = -1 + totalLoadStr: string = "" + userLoad: number = -1 + userLoadStr: string = "" + systemLoad: number = -1 + systemLoadStr: string = "" + threads: number = -1 + threadsStr: string = "" +} + +export class SystemDiskIOSummary { + startTime: number = -1 + startTimeStr: string = "" + duration: number = -1 + durationStr: string = "" + dataRead: number = -1 + dataReadStr: string = "" + dataReadSec: number = -1 + dataReadSecStr: string = "" + dataWrite: number = -1 + dataWriteStr: string = "" + dataWriteSec: number = -1 + dataWriteSecStr: string = "" + readsIn: number = -1 + readsInStr: string = "" + readsInSec: number = -1 + readsInSecStr: string = "" + writeOut: number = -1 + writeOutStr: string = "" + writeOutSec: number = -1 + writeOutSecStr: string = "" + +} + +export class ProcessHistory { + processId: number = -1 + alive: string = '' // 0 alive and 1 dead + firstSeen: string = '' + lastSeen: string = '' + processName: string = "" + responsibleProcess: string = "" + userName: string = "" + cpuTime: string = '' + pss: number = -1 +} + +export class LiveProcess { + processId: number = -1 + processName: string = "" + responsibleProcess: string = "" + userName: string = "" + cpu: string = '' + threads: number = -1 + memory: string = '' + diskWrite: number = -1 + diskReads: number = -1 + cpuTime: string = "" + cpuTimeNumber: number = -1; +} + +export class SystemNetworkSummary { + startTime: number = -1 + startTimeStr: string = "" + duration: number = -1 + durationStr: string = "" + dataReceived: number = -1 + dataReceivedStr: string = "" + dataReceivedSec: number = -1 + dataReceivedSecStr: string = "" + dataSend: number = -1 + dataSendStr: string = "" + dataSendSec: number = -1 + dataSendSecStr: string = "" + packetsIn: number = -1 + packetsInStr: string = "" + packetsInSec: number = -1 + packetsInSecStr: string = "" + packetsOut: number = -1 + packetsOutStr: string = "" + packetsOutSec: number = -1 + packetsOutSecStr: string = "" +} + +export class SystemMemorySummary { + startTimeStr: string = "0" + durationStr: string = "0" + memoryTotal: string = "0"; + memFree: string = "0"; + buffers: string = "0"; + cached: string = "0"; + shmem: string = "0"; + slab: string = "0"; + swapTotal: string = "0"; + swapFree: string = "0"; + mapped: string = "0"; + vmallocUsed: string = "0"; + pageTables: string = "0"; + kernelStack: string = "0"; + active: string = "0"; + inactive: string = "0"; + unevictable: string = "0"; + vmallocTotal: string = "0"; + sUnreclaim: string = "0"; + kReclaimable: string = "0"; + cmaTotal: string = "0"; + cmaFree: string = "0"; + zram: string = "0"; +} \ No newline at end of file diff --git a/host/ide/src/trace/bean/BoxSelection.ts b/host/ide/src/trace/bean/BoxSelection.ts index 788e3c1..9ac5b95 100644 --- a/host/ide/src/trace/bean/BoxSelection.ts +++ b/host/ide/src/trace/bean/BoxSelection.ts @@ -19,11 +19,20 @@ export class SelectionParam { trackIds: Array = []; funTids: Array = []; heapIds: Array = []; - nativeMemory:Array = []; + nativeMemory: Array = []; + cpuAbilityIds: Array = [] + memoryAbilityIds: Array = [] + diskAbilityIds: Array = [] + networkAbilityIds: Array = [] leftNs: number = 0; rightNs: number = 0; hasFps: boolean = false; - statisticsSelectData:any = undefined + statisticsSelectData: any = undefined + perfSampleIds: Array = []; + perfCpus: Array = []; + perfProcess: Array = []; + perfThread: Array = []; + perfAll: boolean = false; } export class BoxJumpParam { diff --git a/host/ide/src/trace/bean/CpuAbilityMonitorStruct.ts b/host/ide/src/trace/bean/CpuAbilityMonitorStruct.ts new file mode 100644 index 0000000..05b56c2 --- /dev/null +++ b/host/ide/src/trace/bean/CpuAbilityMonitorStruct.ts @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./BaseStruct.js"; + +export class CpuAbilityMonitorStruct extends BaseStruct { + static maxCpuUtilization: number = 0 + static maxCpuUtilizationName: string = "0 %" + static hoverCpuAbilityStruct: CpuAbilityMonitorStruct | undefined; + static selectCpuAbilityStruct: CpuAbilityMonitorStruct | undefined; + + type: number | undefined + value: number | undefined + startNS: number | undefined + dur: number | undefined +} diff --git a/host/ide/src/trace/bean/DiskAbilityMonitorStruct.ts b/host/ide/src/trace/bean/DiskAbilityMonitorStruct.ts new file mode 100644 index 0000000..2711813 --- /dev/null +++ b/host/ide/src/trace/bean/DiskAbilityMonitorStruct.ts @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./BaseStruct.js"; +import {ColorUtils} from "../database/ProcedureWorkerCommon.js"; + +export class DiskAbilityMonitorStruct extends BaseStruct { + static maxDiskRate: number = 0 + static maxDiskRateName: string = "0 KB/S" + static hoverDiskAbilityStruct: DiskAbilityMonitorStruct | undefined; + static selectDiskAbilityStruct: DiskAbilityMonitorStruct | undefined; + cpu: number | undefined + value: number | undefined + startNS: number | undefined + dur: number | undefined + + static draw(context2D: any, data: DiskAbilityMonitorStruct) { + if (data.frame) { + let width = data.frame.width || 0; + let index = data.cpu || 0 + index += 2 + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / DiskAbilityMonitorStruct.maxDiskRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / DiskAbilityMonitorStruct.maxDiskRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } +} diff --git a/host/ide/src/trace/bean/HeapBean.ts b/host/ide/src/trace/bean/HeapBean.ts index ec7541f..b001dfd 100644 --- a/host/ide/src/trace/bean/HeapBean.ts +++ b/host/ide/src/trace/bean/HeapBean.ts @@ -13,15 +13,15 @@ * limitations under the License. */ -export class HeapBean{ - MoudleName:string|undefined - AllocationFunction:string|undefined - Allocations:number|string = 0 - Deallocations:number|string= 0 - AllocationSize:number|string= 0 - DeAllocationSize:number|string= 0 - Total:number|string= 0 - RemainingSize:number|string= 0 - children:HeapBean[] = [] - depth:number = 0 +export class HeapBean { + MoudleName: string | undefined + AllocationFunction: string | undefined + Allocations: number | string = 0 + Deallocations: number | string = 0 + AllocationSize: number | string = 0 + DeAllocationSize: number | string = 0 + Total: number | string = 0 + RemainingSize: number | string = 0 + children: HeapBean[] = [] + depth: number = 0 } \ No newline at end of file diff --git a/host/ide/src/trace/bean/HeapStruct.ts b/host/ide/src/trace/bean/HeapStruct.ts index 123ed31..667dfb4 100644 --- a/host/ide/src/trace/bean/HeapStruct.ts +++ b/host/ide/src/trace/bean/HeapStruct.ts @@ -22,7 +22,7 @@ export class HeapStruct extends BaseStruct { startTime: number | undefined endTime: number | undefined dur: number | undefined - eventType:string | undefined + eventType: string | undefined heapsize: number | undefined maxHeapSize: number = 0 minHeapSize: number = 0 diff --git a/host/ide/src/trace/bean/HeapTreeDataBean.ts b/host/ide/src/trace/bean/HeapTreeDataBean.ts index a155a58..a2a0702 100644 --- a/host/ide/src/trace/bean/HeapTreeDataBean.ts +++ b/host/ide/src/trace/bean/HeapTreeDataBean.ts @@ -13,13 +13,13 @@ * limitations under the License. */ -export class HeapTreeDataBean{ - MoudleName:string|undefined - AllocationFunction:string|undefined - startTs:number = 0 - endTs:number = 0 - eventType:string|undefined - depth:number = 0 - heapSize:number = 0 - eventId:string="" +export class HeapTreeDataBean { + MoudleName: string | undefined + AllocationFunction: string | undefined + startTs: number = 0 + endTs: number = 0 + eventType: string | undefined + depth: number = 0 + heapSize: number = 0 + eventId: string = "" } \ No newline at end of file diff --git a/host/ide/src/trace/bean/MemoryAbilityMonitorStruct.ts b/host/ide/src/trace/bean/MemoryAbilityMonitorStruct.ts new file mode 100644 index 0000000..ff2c1a4 --- /dev/null +++ b/host/ide/src/trace/bean/MemoryAbilityMonitorStruct.ts @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./BaseStruct.js"; +import {ColorUtils} from "../database/ProcedureWorkerCommon.js"; + +export class MemoryAbilityMonitorStruct extends BaseStruct { + static maxMemoryByte: number = 0 + static maxMemoryByteName: string = "0 MB" + static hoverMemoryAbilityStruct: MemoryAbilityMonitorStruct | undefined; + static selectMemoryAbilityStruct: MemoryAbilityMonitorStruct | undefined; + cpu: number | undefined + value: number | undefined + startNS: number | undefined + dur: number | undefined + + static draw(context2D: any, data: MemoryAbilityMonitorStruct) { + if (data.frame) { + let width = data.frame.width || 0; + let index = data.cpu || 0 + index += 2 + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / MemoryAbilityMonitorStruct.maxMemoryByte); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / MemoryAbilityMonitorStruct.maxMemoryByte); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } +} diff --git a/host/ide/src/trace/bean/NativeHook.ts b/host/ide/src/trace/bean/NativeHook.ts index 99168e0..81d1b20 100644 --- a/host/ide/src/trace/bean/NativeHook.ts +++ b/host/ide/src/trace/bean/NativeHook.ts @@ -14,103 +14,90 @@ */ import {Utils} from "../component/trace/base/Utils.js"; +import {ChartStruct} from "../database/ProcedureWorkerCommon.js"; -export class NativeHookStatistics{ - eventId:number = 0; - eventType:string = ""; - subType:string = ""; - heapSize:number = 0; - addr:string = ""; - startTs:number = 0; - endTs:number = 0; - sumHeapSize:number = 0; - max:number = 0; - count:number = 0; - tid:number = 0; - isSelected:boolean = false; +export class NativeHookStatistics { + eventId: number = 0; + eventType: string = ""; + subType: string = ""; + heapSize: number = 0; + addr: string = ""; + startTs: number = 0; + endTs: number = 0; + sumHeapSize: number = 0; + max: number = 0; + count: number = 0; + tid: number = 0; + isSelected: boolean = false; } -export class NativeHookMalloc{ - eventType:string = ""; - subType:string = ""; - heapSize:number = 0; - allocByte:number = 0; - allocCount:number = 0; - freeByte:number = 0; - freeCount:number = 0; +export class NativeHookMalloc { + eventType: string = ""; + subType: string = ""; + heapSize: number = 0; + allocByte: number = 0; + allocCount: number = 0; + freeByte: number = 0; + freeCount: number = 0; } -export class NativeEventHeap{ - eventType:string = ""; - sumHeapSize:number = 0 +export class NativeEventHeap { + eventType: string = ""; + sumHeapSize: number = 0 } -export class NativeHookProcess{ - ipid:number = 0; - pid:number = 0; - name:String = "" +export class NativeHookProcess { + ipid: number = 0; + pid: number = 0; + name: String = "" } -export class NativeHookStatisticsTableData{ - memoryTap:string = ""; - existing:number = 0; - existingString:string = ""; - allocCount:number = 0; - freeCount:number = 0; - totalBytes:number = 0 - totalBytesString:string = ""; - maxStr:string = ""; - max:number = 0 - totalCount:number = 0; - existingValue:Array = []; +export class NativeHookStatisticsTableData { + memoryTap: string = ""; + existing: number = 0; + existingString: string = ""; + allocCount: number = 0; + freeCount: number = 0; + totalBytes: number = 0 + totalBytesString: string = ""; + maxStr: string = ""; + max: number = 0 + totalCount: number = 0; + existingValue: Array = []; } -export class NativeMemory{ - index:number = 0; - eventId:number = 0; - eventType:string = ""; - subType:string = ""; - addr:string = ""; - startTs:number = 0; - timestamp:string = "" - heapSize:number = 0; - heapSizeUnit:string = ""; - symbol:string = ""; - library:string = ""; -} - -export class NativeHookCallInfo{ - id:string = ""; - pid:string | undefined; - threadId:number = 0; - symbol:string = ""; - library:string = ""; - title:string = ""; - count:number = 0; - type:number = 0; - heapSize:number = 0; - heapSizeStr:string = ""; - eventId:number = 0 - depth:number = 0; - children:Array = []; +export class NativeMemory { + index: number = 0; + eventId: number = 0; + eventType: string = ""; + subType: string = ""; + addr: string = ""; + startTs: number = 0; + timestamp: string = "" + heapSize: number = 0; + heapSizeUnit: string = ""; + symbol: string = ""; + library: string = ""; + isSelected: boolean = false; } export class NativeHookSamplerInfo { - current:string = "" - currentSize:number = 0 - startTs:number = 0; - heapSize:number = 0; - snapshot:string = ""; - growth:string = ""; - total:number = 0; - totalGrowth:string = "" - existing:number = 0; - children:Array = []; - tempList:Array = []; - timestamp:string = "" - eventId:number = -1 - merageObj(merageObj:NativeHookSamplerInfo){ - this.currentSize+=merageObj.currentSize + current: string = "" + currentSize: number = 0 + startTs: number = 0; + heapSize: number = 0; + snapshot: string = ""; + growth: string = ""; + total: number = 0; + totalGrowth: string = "" + existing: number = 0; + children: Array = []; + tempList: Array = []; + timestamp: string = "" + eventId: number = -1 + + merageObj(merageObj: NativeHookSamplerInfo) { + this.currentSize += merageObj.currentSize this.heapSize += merageObj.heapSize this.existing += merageObj.existing this.total += merageObj.total @@ -121,15 +108,29 @@ export class NativeHookSamplerInfo { } export class NativeHookSampleQueryInfo { - eventId:number = -1 - current:number = 0 - eventType:string = ""; - subType:string = ""; - growth:number = 0; - existing:number = 0; - addr:string = ""; - startTs:number = 0; - endTs:number = 0; - total:number = 0; - children:Array = []; + eventId: number = -1 + current: number = 0 + eventType: string = ""; + subType: string = ""; + growth: number = 0; + existing: number = 0; + addr: string = ""; + startTs: number = 0; + endTs: number = 0; + total: number = 0; + children: Array = []; +} + +export class NativeHookCallInfo extends ChartStruct { + id: string = ""; + pid: string | undefined; + library: string = ""; + title: string = ""; + count: number = 0; + type: number = 0; + heapSize: number = 0; + heapSizeStr: string = ""; + eventId: number = 0; + threadId: number = 0; + isSelected: boolean = false; } \ No newline at end of file diff --git a/host/ide/src/trace/bean/NetworkAbilityMonitorStruct.ts b/host/ide/src/trace/bean/NetworkAbilityMonitorStruct.ts new file mode 100644 index 0000000..52490fd --- /dev/null +++ b/host/ide/src/trace/bean/NetworkAbilityMonitorStruct.ts @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./BaseStruct.js"; +import {ColorUtils} from "../database/ProcedureWorkerCommon.js"; + +export class NetworkAbilityMonitorStruct extends BaseStruct { + static maxNetworkRate: number = 0 + static maxNetworkRateName: string = "0 KB/S" + static hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct | undefined; + static selectNetworkAbilityStruct: NetworkAbilityMonitorStruct | undefined; + value: number | undefined + startNS: number | undefined + dur: number | undefined + + static draw(context2D: any, data: NetworkAbilityMonitorStruct) { + if (data.frame) { + let width = data.frame.width || 0; + let index = 0 + index += 2 + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / NetworkAbilityMonitorStruct.maxNetworkRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / NetworkAbilityMonitorStruct.maxNetworkRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } +} diff --git a/host/ide/src/trace/bean/PerfProfile.ts b/host/ide/src/trace/bean/PerfProfile.ts new file mode 100644 index 0000000..5167a7c --- /dev/null +++ b/host/ide/src/trace/bean/PerfProfile.ts @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {Utils} from "../component/trace/base/Utils.js"; +import {ChartStruct} from "../database/ProcedureWorkerCommon.js"; +import {SpHiPerf} from "../component/hiperf/SpHiPerf.js"; + +export class PerfFile { + fileId: number = 0; + symbol: string = "" + path: string = "" + fileName: string = "" + + static setFileName(data: PerfFile) { + if (data.path) { + let number = data.path.lastIndexOf("/"); + if (number > 0) { + data.fileName = data.path.substring(number + 1) + return + } + } + data.fileName = data.path + } + + setFileName() { + if (this.path) { + let number = this.path.lastIndexOf("/"); + if (number > 0) { + this.fileName = this.path.substring(number + 1) + return + } + } + this.fileName = this.path + } +} + +export class PerfThread { + tid: number = 0; + pid: number = 0; + threadName: string = ""; + processName: string = ""; +} + +export class PerfCallChain { + tid: number = 0; + pid: number = 0; + name: string = "" + fileName: string = ""; + threadState: string = ""; + startNS: number = 0; + dur: number = 0; + sampleId: number = 0; + callChainId: number = 0; + vaddrInFile: number = 0; + fileId: number = 0; + symbolId: number = 0; + path: string = ""; + parentId: string = ""//合并之后区分的id + id: string = "" + topDownMerageId: string = ""//top down合并使用的id + topDownMerageParentId: string = ""//top down合并使用的id + bottomUpMerageId: string = ""//bottom up合并使用的id + bottomUpMerageParentId: string = ""//bottom up合并使用的id + depth: number = 0; + previousNode: PerfCallChain | undefined = undefined;//将list转换为一个链表结构 + nextNode: PerfCallChain | undefined = undefined; + + static setNextNode(currentNode: PerfCallChain, nextNode: PerfCallChain) { + currentNode.nextNode = nextNode + nextNode.previousNode = currentNode + } + + static setPreviousNode(currentNode: PerfCallChain, prevNode: PerfCallChain) { + currentNode.previousNode = prevNode + prevNode.nextNode = currentNode + } + + static merageCallChain(currentNode: PerfCallChain, callChain: PerfCallChain) { + currentNode.startNS = callChain.startNS + currentNode.tid = callChain.tid + currentNode.pid = callChain.pid + currentNode.sampleId = callChain.sampleId + currentNode.dur = callChain.dur + } + +} + +export class PerfCallChainMerageData extends ChartStruct { + #parentNode: PerfCallChainMerageData | undefined = undefined + #total = 0 + id: string = ""; + parentId: string = ""; + currentTreeParentNode: PerfCallChainMerageData | undefined = undefined; + symbolName: string = ""; + symbol: string = "" + libName: string = "" + path: string = "" + self: string = "0s" + weight: string = "" + selfDur: number = 0; + dur: number = 0; + tid: number = 0; + pid: number = 0; + isStore = 0; + children: PerfCallChainMerageData[] = [] + initChildren: PerfCallChainMerageData[] = [] + type: number = 0; + vaddrInFile: number = 0; + isSelected: boolean = false; + searchShow: boolean = true; + + set parentNode(data: PerfCallChainMerageData | undefined) { + this.currentTreeParentNode = data; + this.#parentNode = data; + } + + get parentNode() { + return this.#parentNode + } + + set total(data: number) { + this.#total = data; + this.weight = `${Utils.timeMsFormat2p(this.dur * (SpHiPerf.stringResult?.fValue || 1))} ${(this.dur / data * 100).toFixed(1)}%` + } + + get total() { + return this.#total; + } + + static merageCallChain(currentNode: PerfCallChainMerageData, callChain: PerfCallChain, isTopDown: boolean) { + if (currentNode.symbolName == "") { + currentNode.symbol = `${callChain.name} ${callChain.fileName ? `(${callChain.fileName})` : ""}` + currentNode.symbolName = callChain.name + currentNode.pid = callChain.pid + currentNode.tid = callChain.tid + currentNode.libName = callChain.fileName + currentNode.vaddrInFile = callChain.vaddrInFile; + if (callChain.path) { + currentNode.path = callChain.path + } + } + if (callChain[isTopDown ? "nextNode" : "previousNode"] == undefined) { + currentNode.selfDur++; + currentNode.self = Utils.timeMsFormat2p(currentNode.selfDur) + } + currentNode.dur++; + currentNode.count++; + } +} + +export class PerfSample { + sampleId: number = 0; + time: number = 0; + timeString: string = ""; + core: number = 0; + coreName: string = ""; + state: string = ""; + pid: number = 0; + processName: string = ""; + tid: number = 0; + threadName: string = ""; + depth: number = 0; + addr: string = ""; + fileId: number = 0; + symbolId: number = 0; + backtrace: Array = []; +} + +export class PerfStack { + symbol: string = ""; + path: string = ""; + fileId: number = 0; + type: number = 0; + vaddrInFile: number = 0; +} + +export class PerfCmdLine { + report_value: string = ""; +} \ No newline at end of file diff --git a/host/ide/src/trace/bean/SearchFuncBean.ts b/host/ide/src/trace/bean/SearchFuncBean.ts new file mode 100644 index 0000000..e5cc893 --- /dev/null +++ b/host/ide/src/trace/bean/SearchFuncBean.ts @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export class SearchFuncBean { + depth: number | undefined // 0 + dur: number | undefined // 570000 + funName: string | undefined //"binder transaction" + id: number | undefined // 92749 + startTime: number | undefined // 9729867000 + tid: number | undefined // + pid: number | undefined // 2785 + type: string | undefined +} + +export class SearchThreadProcessBean { + type: string | undefined + rowId:string | undefined | null + name:string | undefined + rowType:string | undefined | null + rowParentId:string | undefined | null +} diff --git a/host/ide/src/trace/bean/StateProcessThread.ts b/host/ide/src/trace/bean/StateProcessThread.ts index 642d399..e333c49 100644 --- a/host/ide/src/trace/bean/StateProcessThread.ts +++ b/host/ide/src/trace/bean/StateProcessThread.ts @@ -61,4 +61,28 @@ export class SPT { cpu: number = 0; priority: string = "-" note: string = "-" +} + +export class ThreadState{ + itid:number = 0 + state:string = "" + dur:number = 0 + ts:number = 0 + end_ts:number = 0 + start_ts:number = 0 + cpu:number = 0 +} + +export class ThreadProcess{ + id:number = 0 + threadId :number = 0 + thread :string = "" + processId : number = 0 + process : string = "" +} + +export class SptSlice{ + itid :number = 0 + ts : number = 0 + priority : number = 0 } \ No newline at end of file diff --git a/host/ide/src/trace/bean/WakeupBean.ts b/host/ide/src/trace/bean/WakeupBean.ts index f8d6fbc..f5c2300 100644 --- a/host/ide/src/trace/bean/WakeupBean.ts +++ b/host/ide/src/trace/bean/WakeupBean.ts @@ -22,4 +22,5 @@ export class WakeupBean { tid: number | undefined schedulingLatency: number | undefined schedulingDesc: string | undefined + ts: number | undefined } \ No newline at end of file diff --git a/host/ide/src/trace/component/DisassemblingWindow.ts b/host/ide/src/trace/component/DisassemblingWindow.ts new file mode 100644 index 0000000..2c3ff8b --- /dev/null +++ b/host/ide/src/trace/component/DisassemblingWindow.ts @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 { BaseElement, element } from "../../base-ui/BaseElement.js"; + +@element('tab-native-data-modal') +export class DisassemblingWindow extends BaseElement { + private canvas: HTMLCanvasElement | undefined | null; + private window: HTMLElement | undefined | null; + private loading: HTMLElement | undefined | null; + private ctx: CanvasRenderingContext2D | null | undefined; + private hintLine = 0; + private addrArray = new Array(); + private maxBinSize = 0; + + private getMap(content: string, hintAttr: string) { + let lines = content.split('\n'); + this.addrArray = new Array(); + let lineMap = new Map(); + let effectLint = 0; + this.maxBinSize = 0; + for (let line of lines) { + let lineContents = line.split(':'); + if (lineContents.length === 2) { + let addrHex = lineContents[0].trim(); + let addr = '0x' + addrHex; + let value = lineContents[1].split('\t'); + try { + let binary = value[0]; + let lineStruct = new Disassembling(); + if (binary === '') { + if (line.includes('Disassembly') || line.includes('file format')) { + continue + } else { + if (addr.includes(' ')) { + let funcs = addr.split(' '); + lineStruct.addr = funcs[0]; + lineStruct.binary = funcs[1]; + } + } + } else { + lineStruct.addr = addr; + lineStruct.binary = value[0].trim(); + lineStruct.type = value.length > 1 ? value[1] : ''; + lineStruct.code = value.length > 2 ? value[2] : ''; + } + lineMap.set(addrHex, lineStruct); + this.maxBinSize = Math.max(this.ctx!.measureText(lineStruct.addr + lineStruct.binary).width, this.maxBinSize); + this.addrArray.push(addrHex); + if (addrHex === hintAttr) this.hintLine = effectLint; + effectLint++; + } catch (e) { + console.log(e); + } + } + } + return lineMap; + } + + public showContent(content: string, hintAddr: string): void { + this.loading!.style.display = "none"; + this.window!.style.display = "block"; + if (content.startsWith('error')) { + this.window!.innerHTML = `${content}`; + return; + } + let lineMap = this.getMap(content, hintAddr); + this.maxBinSize = this.maxBinSize * 1.7; + this.window!.innerHTML = ''; + for (let addr of this.addrArray) { + if (!lineMap.has(addr)) continue; + let struct = lineMap.get(addr); + if (this.addrArray[this.hintLine] == addr) { + this.window!.innerHTML += `
      + ${struct!.addr} : ${struct!.binary} + ${struct!.type} + ${struct!.code}
      `; + (this.window!.querySelector("#emphasis") as HTMLElement)!.style.width = this.window!.scrollWidth + 'px'; + (this.window!.querySelector("#emphasis") as HTMLElement)!.style.background = '#0A59F7'; + } else { + this.window!.innerHTML += `
      + ${struct!.addr} : ${struct!.binary} + ${struct!.type} + ${struct!.code}
      `; + } + } + this.window!.scrollTo(0, (this.hintLine - 1) * (this.shadowRoot!.querySelector("#window>.line")!.clientHeight) - this.window!.clientHeight / 2); + } + + private resetCanvas(styleWidth: number, styleHeight: number, width: number, height: number): void { + this.canvas!.style.width = styleWidth + "px"; + this.canvas!.style.height = styleHeight + "px"; + this.canvas!.width = width; + this.canvas!.height = height; + } + + public showLoading(): void { + this.loading!.style.display = 'block'; + this.window!.style.display = 'none'; + this.style.display = 'block'; + this.style.position = 'absolute'; + this.style.left = '0px'; + this.style.width = "64%"; + this.style.height = (this.parentElement!.querySelector("#left_table") as HTMLElement)!.clientHeight + 'px'; + this.style.border = '1px solid #d8d8d8'; + } + + initElements(): void { + this.canvas = this.shadowRoot?.querySelector("#canvas"); + let close = this.shadowRoot?.querySelector("#close"); + this.window = this.shadowRoot?.querySelector("#window"); + this.loading = this.shadowRoot?.querySelector("#loading"); + this.ctx = this.canvas!.getContext('2d'); + this.resetCanvas(0, 0, 0, 0); + close!.addEventListener("click", () => { + this.style.display = 'none'; + (this.parentElement!.querySelector("#left_table") as HTMLElement)!.style.visibility = 'visible'; + if (this.parentElement!.parentElement && this.parentElement!.parentElement!.nextElementSibling) { + (this.parentElement!.parentElement!.nextElementSibling as HTMLElement)!.style.display = 'flex'; + } + return true; + }); + } + + initHtml(): string { + return ` + + + `; + } +} + +class Disassembling { + addr = ''; + binary = ''; + type = ''; + code = ''; +} \ No newline at end of file diff --git a/host/ide/src/trace/component/FrameChart.ts b/host/ide/src/trace/component/FrameChart.ts new file mode 100644 index 0000000..92d75c3 --- /dev/null +++ b/host/ide/src/trace/component/FrameChart.ts @@ -0,0 +1,544 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 { BaseElement, element } from "../../base-ui/BaseElement.js"; +import { NativeHookCallInfo } from "../bean/NativeHook.js"; +import { ChartMode, ChartStruct, Rect } from "../database/ProcedureWorkerCommon.js"; +import { SpApplication } from "../SpApplication.js"; +import { Utils } from "./trace/base/Utils.js"; + +const TAG: string = "FrameChart"; +const scaleHeight = 30; +const depthHeight = 20; + +@element('tab-framechart') +export class FrameChart extends BaseElement { + private canvas: HTMLCanvasElement | undefined | null; + private cavasContext: CanvasRenderingContext2D | undefined | null; + private floatHint: HTMLDivElement | undefined | null; + + private rect: Rect = new Rect(0, 0, 0, 0); + private _mode = ChartMode.Call; + private startX = 0; // canvas start x coord + private startY = 0; // canvas start y coord + private canvasX = -1; // canvas current x + private canvasY = -1; // canvas current y + private lastCanvasXInScale = 0; + private lastCanvasX = 0; + private hintContent = ""; // float hoint inner html content + + private historyList: Array> = []; + private currentSize = 0; + private currentCount = 0; + private currentData: Array = []; + private xPoint = 0; // x in rect + private isFocusing = false; + private canvasScrollTop = 0; + private _maxDepth = 0; + + static get observedAttributes() { + return [] + } + + set data(val: Array | any) { + this.currentData = val; + this.resetTrans(); + this.caldrawArgs(); + } + + set tabPaneScrollTop(scrollTop: number) { + this.canvasScrollTop = scrollTop; + } + + /** + * cal total count size and max Depth + */ + private caldrawArgs(): void { + this.currentCount = 0; + this.currentSize = 0; + for (let rootNode of this.currentData!) { + this.currentCount += rootNode.count; + this.currentSize += rootNode.size; + let depth = 0; + this.calMaxDepth(rootNode, depth); + } + this.rect.height = this._maxDepth * 20 + scaleHeight; // 20px/depth and 30 is scale height + } + + /** + * cal max Depth + * @param node every child node + * @param depth current depth + */ + private calMaxDepth(node: ChartStruct, depth: number): void { + depth++; + if (node.children && node.children.length > 0) { + for (let children of node.children) { + this.calMaxDepth(children, depth); + } + } else { + this._maxDepth = Math.max(depth, this._maxDepth); + } + } + + /** + * set chart mode + * @param mode chart format for data mode + */ + set mode(mode: ChartMode) { + this._mode = mode; + } + + /** + * calculate Data and draw chart + */ + async calculateChartData() { + this.clearCanvas(); + this.cavasContext?.beginPath(); + this.drawScale(); + let x = this.xPoint; + switch (this._mode) { + case ChartMode.Byte: + for (let node of this.currentData!) { + let width = Math.ceil(node.size / this.currentSize * this.rect!.width); + let height = depthHeight; // 20px / depth + // ensure the data for first depth frame + if (!node.frame) { + node.frame = new Rect(x, scaleHeight, width, height) + } else { + node.frame!.x = x; + node.frame!.y = scaleHeight; + node.frame!.width = width; + node.frame!.height = height; + } + // not draw when rect not in canvas + if (x + width >= 0 && x < this.canvas!.width) { + NativeHookCallInfo.draw(this.cavasContext!, node, node.size / this.currentSize); + this.drawFrameChart(node); + } + x += width; + } + break; + case ChartMode.Count: + for (let node of this.currentData!) { + let width = Math.ceil(node.count / this.currentCount * this.rect!.width); + let height = depthHeight; // 20px / depth + // ensure the data for first depth frame + if (!node.frame) { + node.frame = new Rect(x, scaleHeight, width, height) + } else { + node.frame!.x = x; + node.frame!.y = scaleHeight; + node.frame!.width = width; + node.frame!.height = height; + } + // not draw when rect not in canvas + if (x + width >= 0 && x < this.canvas!.width) { + NativeHookCallInfo.draw(this.cavasContext!, node, node.count / this.currentCount); + this.drawFrameChart(node); + } + x += width; + } + break; + } + this.cavasContext?.closePath(); + } + + /** + * clear canvas all data + */ + public clearCanvas() { + this.cavasContext?.clearRect(0, 0, this.canvas!.width, this.canvas!.height); + } + + /** + * update canvas size + */ + public updateCanvas(updateWidth: boolean, newWidth?: number): void { + if (this.canvas instanceof HTMLCanvasElement) { + this.canvas.style.width = 100 + "%"; + this.canvas.style.height = this.rect!.height + "px"; + this.canvas.width = this.canvas!.clientWidth; + this.canvas.height = Math.ceil(this.rect!.height); + if (this.canvas.getBoundingClientRect()) { + let box = this.canvas.getBoundingClientRect(); + let D = document.documentElement; + this.startX = box.left + Math.max(D.scrollLeft, document.body.scrollLeft) - D.clientLeft; + this.startY = box.top + Math.max(D.scrollTop, document.body.scrollTop) - D.clientTop; + } + } + if (this.rect.width == 0 || updateWidth || + Math.round(newWidth!) != this.canvas!.width + 40 || newWidth! > this.rect.width){ + this.rect.width = this.canvas!.clientWidth; + } + } + + /** + * draw top Scale Into 100 pieces + */ + private drawScale(): void { + let spApplication = document.getElementsByTagName("sp-application")[0]; + // line + this.cavasContext!.lineWidth = 0.5; + this.cavasContext?.moveTo(0, 0); + this.cavasContext?.lineTo(this.canvas!.width, 0); + + for (let i = 0; i <= 10; i++) { + let startX = Math.floor(this.canvas!.width / 10 * i); + for (let j = 0; j < 10; j++) { + // children scale + this.cavasContext!.lineWidth = 0.5; + let startItemX = startX + Math.floor(this.canvas!.width / 100 * j); + this.cavasContext?.moveTo(startItemX, 0); + this.cavasContext?.lineTo(startItemX, 10); + } + if (i == 0) continue; // skip first Size is 0 + // long line every 10 count + this.cavasContext!.lineWidth = 1; + let sizeRatio = this.canvas!.width / this.rect.width; // scale ratio + if (spApplication.dark) { + this.cavasContext!.strokeStyle = "#888"; + } else { + this.cavasContext!.strokeStyle = "#ddd"; + } + this.cavasContext?.moveTo(startX, 0); + this.cavasContext?.lineTo(startX, this.canvas!.height); + if (spApplication.dark) { + this.cavasContext!.fillStyle = "#fff"; + } else { + this.cavasContext!.fillStyle = "#000"; + } + let scale = ''; + if (this.mode == ChartMode.Byte) { + scale = Utils.getByteWithUnit(this.currentSize * sizeRatio / 10 * i); + } else { + scale = (this.currentCount * sizeRatio / 10 * i).toFixed(0) + ''; + } + this.cavasContext?.fillText(scale, startX + 5, depthHeight, 50); // 50 is Text max Size + this.cavasContext?.stroke(); + } + } + + /** + * draw chart + * @param node draw chart by every piece + */ + drawFrameChart(node: ChartStruct) { + if (node.children && node.children.length > 0) { + for (let children of node.children) { + children.parent = node; + let percent = 0; + if (this.mode == ChartMode.Byte) { + NativeHookCallInfo.setFuncFrame(children, this.rect!, this.currentSize, this.mode); + percent = node.size / this.currentSize; + } else { + NativeHookCallInfo.setFuncFrame(children, this.rect!, this.currentCount, this.mode); + percent = node.count / this.currentCount; + } + // not draw when rect not in canvas + if (children.frame!.x + children.frame!.width >= 0 && + children.frame!.x < this.canvas!.width && children.frame!.width > 2) { + NativeHookCallInfo.draw(this.cavasContext!, children, percent); + this.drawFrameChart(children); + } + } + } + } + + /** + * find target node from tree by mouse position + * + * @param nodes tree nodes + * @param canvasX x coord of canvas + * @param canvasY y coord of canvas + * @returns target node + */ + private searchData(nodes: Array, canvasX: number, canvasY: number): any { + for (let node of nodes) { + if (node.frame?.contains(canvasX, canvasY)) { + return node; + } else { + let result = this.searchData(node.children, canvasX, canvasY); + if (!result) continue; // if not found in this branch;search another branch + return result; + } + } + return null; + } + + /** + * show float hint and update position + */ + private updateFloatHint(): void { + this.floatHint!.innerHTML = this.hintContent; + this.floatHint!.style.display = 'flex'; + let x = this.canvasX; + let y = this.canvasY - this.canvasScrollTop; + //right rect hint show left + if (this.canvasX + this.floatHint!.clientWidth > (this.canvas?.clientWidth || 0)) { + x -= this.floatHint!.clientWidth - 1; + } else { + x += 30; + } + //bottom rect hint show top + if (this.canvasY + this.floatHint!.clientHeight > (this.canvas?.clientHeight || 0)) { + y -= this.floatHint!?.clientHeight - 1; + y += 30; + } else { + y -= 10; + } + this.floatHint!.style.transform = `translate(${x}px,${y}px)`; + } + + /** + * redraw Chart while click to scale chart + * @param selectData select Rect data as array + */ + private redrawChart(selectData: Array): void { + this.currentData = selectData; + if (selectData.length == 0) return; + this.caldrawArgs(); + this.calculateChartData(); + } + + /** + * press w to zoom in, s to zoom out + * @param index < 0 zoom out , > 0 zoom in + */ + private scale(index: number): void { + let newWidth = 0; + // zoom in + let deltaWidth = this.rect!.width * 0.2; + if (index > 0) { + newWidth = this.rect!.width + deltaWidth; + // max scale + let sizeRatio = this.canvas!.width / this.rect.width; + if (this.mode == ChartMode.Byte) { + if (Math.round(this.currentSize * sizeRatio) <= 10) { + newWidth = this.canvas!.width / (10 / this.currentSize); + } + } else { + if (Math.round(this.currentCount * sizeRatio) <= 10) { + if (this.lastCanvasXInScale == 0){ + return; + } + newWidth = this.canvas!.width / (10 / this.currentCount); + } + } + } else { // zoom out + newWidth = this.rect!.width - deltaWidth; + // min scale + if (newWidth < this.canvas!.width) { + newWidth = this.canvas!.width; + this.resetTrans() + } + } + // width not change + if (newWidth == this.rect.width) return; + this.translationByScale(index, deltaWidth, newWidth); + } + + private resetTrans() { + this.xPoint = 0; + this.lastCanvasXInScale = 0; + this.lastCanvasX = 0; + } + + /** + * translation after scale + * @param index is zoom in + * @param deltaWidth scale delta width + * @param newWidth rect width after scale + */ + private translationByScale(index: number, deltaWidth: number, newWidth: number): void { + if (this.lastCanvasX != this.canvasX && this.lastCanvasX != 0){ + this.lastCanvasXInScale = this.lastCanvasX; + } + if (this.lastCanvasXInScale == 0) { + this.lastCanvasXInScale = this.canvasX; + } + let deltaWidthPerent = (this.canvasX - this.lastCanvasXInScale) / this.canvas!.width; + let translationValue = deltaWidth * this.canvasX / this.canvas!.width * (1 - deltaWidthPerent) + if (index > 0) { + this.xPoint -= translationValue; + } else { + this.xPoint += translationValue; + } + this.lastCanvasX = this.canvasX; + this.rect!.width = newWidth; + this.translationDraw(); + } + + /** + * press a/d to translate rect + * @param index left or right + */ + private translation(index: number): void { + // let width = this.rect!.width; + let offset = this.canvas!.width / 10; + for (let i = 0; i < Math.abs(index); i++) { + if (index < 0) { + this.xPoint += offset; + } else { + this.xPoint -= offset; + } + } + this.translationDraw(); + } + + /** + * judge position ro fit canvas and draw + */ + private translationDraw(): void { + // rightad trans limit + if (this.xPoint > 0) { + this.xPoint = 0; + } + // left trans limit + if (this.rect.width + this.xPoint < this.canvas!.width) { + this.xPoint = this.canvas!.width - this.rect.width; + } + this.calculateChartData(); + } + + /** + * canvas click + * @param e MouseEvent + */ + private onMouseClick(e: MouseEvent): void { + if (e.button == 0) { // mouse left button + if (ChartStruct.hoverFuncStruct && ChartStruct.hoverFuncStruct != ChartStruct.selectFuncStruct) { + ChartStruct.selectFuncStruct = ChartStruct.hoverFuncStruct; + this.historyList.push(this.currentData!); + let selectData = new Array(); + selectData.push(ChartStruct.selectFuncStruct!); + // reset scale and translation + this.rect.width = this.canvas!.clientWidth; + this.resetTrans(); + this.redrawChart(selectData); + } + } else if (e.button == 2) { // mouse right button + ChartStruct.selectFuncStruct = undefined; + if (this.historyList.length > 0) { + // reset scale and translation + this.rect.width = this.canvas!.clientWidth; + this.resetTrans(); + this.redrawChart(this.historyList.pop()!); + } + } + } + + /** + * mouse on canvas move event + */ + private onMouseMove(): void { + let lastNode = ChartStruct.hoverFuncStruct; + let searchResult = this.searchData(this.currentData!, this.canvasX, this.canvasY); + if (searchResult) { + ChartStruct.hoverFuncStruct = searchResult; + // judge current node is hover redraw chart + if (searchResult != lastNode) { + let name = ChartStruct.hoverFuncStruct?.symbol; + if (this.mode == ChartMode.Byte) { + let size = Utils.getByteWithUnit(ChartStruct.hoverFuncStruct!.size); + this.hintContent = `Name: ${name} Size: ${size}`; + } else { + let count = ChartStruct.hoverFuncStruct!.count; + this.hintContent = `Name: ${name} Count: ${count}`; + } + this.calculateChartData(); + } + // pervent float hint trigger onmousemove event + this.updateFloatHint(); + } else { + if (this.floatHint) { + this.floatHint.style.display = 'none'; + } + } + } + + initElements(): void { + this.canvas = this.shadowRoot?.querySelector("#canvas"); + this.cavasContext = this.canvas?.getContext("2d"); + this.floatHint = this.shadowRoot?.querySelector('#float_hint'); + + this.canvas!.oncontextmenu = () => { + return false; + }; + this.canvas!.onmouseup = (e) => { + this.onMouseClick(e); + } + + this.canvas!.onmousemove = (e) => { + this.canvasX = e.clientX - this.startX; + this.canvasY = e.clientY - this.startY + this.canvasScrollTop; + this.isFocusing = true; + this.onMouseMove(); + }; + + this.canvas!.onmouseleave = () => { + ChartStruct.selectFuncStruct = undefined; + this.isFocusing = false; + if (this.floatHint) { + this.floatHint.style.display = 'none'; + } + }; + + document.addEventListener('keydown', (e) => { + if (!this.isFocusing) return; + switch (e.key.toLocaleLowerCase()) { + case 'w': + this.scale(1); + break; + case 's': + this.scale(-1); + break; + case 'a': + this.translation(-1); + break; + case 'd': + this.translation(1); + break; + } + }); + } + + initHtml(): string { + return ` + + +
      `; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/SpFilter.ts b/host/ide/src/trace/component/SpFilter.ts new file mode 100644 index 0000000..985fbdb --- /dev/null +++ b/host/ide/src/trace/component/SpFilter.ts @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../base-ui/BaseElement.js"; + +@element('sp-filter') +export class SpFilter extends BaseElement { + initElements(): void { + } + + initHtml(): string { + return ` + +
      + Input Filter + +
      + `; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/SpHelp.ts b/host/ide/src/trace/component/SpHelp.ts new file mode 100644 index 0000000..cfa84b7 --- /dev/null +++ b/host/ide/src/trace/component/SpHelp.ts @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../base-ui/BaseElement.js"; +import {LitMainMenuGroup} from "../../base-ui/menu/LitMainMenuGroup.js"; +import {LitMainMenu, MenuItem} from "../../base-ui/menu/LitMainMenu.js"; +import {LitMainMenuItem} from "../../base-ui/menu/LitMainMenuItem"; + +@element('sp-help') +export class SpHelp extends BaseElement { + private appContent: HTMLElement | undefined | null + + get dark() { + return this.hasAttribute("dark"); + } + + set dark(dark: boolean) { + if (dark) { + this.setAttribute("dark", '' + dark); + } + this.appContent!.innerHTML = "" + } + + initElements(): void { + let that = this + let parentElement = this.parentNode as HTMLElement; + parentElement.style.overflow = 'hidden' + this.appContent = this.shadowRoot?.querySelector('#app-content') as HTMLElement + let mainMenu = this.shadowRoot?.querySelector('#main-menu') as LitMainMenu + let header = mainMenu.shadowRoot?.querySelector('.header') as HTMLDivElement + let version = mainMenu.shadowRoot?.querySelector('.version') as HTMLDivElement + header.style.display = 'none' + version.style.display = 'none' + mainMenu.menus = [ + { + collapsed: false, + title: 'QuickStart', + describe: '', + children: [ + { + title: "快速启动hiprofiler_cmd", icon: "", clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = + "" + } + }, + { + title: "网页加载trace 使用说明", icon: "", clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = + "" + } + }, + { + title: "Ability Monitor使用说明", icon: "", clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = + "" + } + }, + { + title: "Perf使用说明", icon: "", clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = + "" + } + } + ] + }, + { + collapsed: false, + title: 'TraceStreamer', + describe: '', + children: [ + { + title: "编译Trace_streamer", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + { + title: "TraceStreamer 解析数据状态表", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + { + title: "概述TraceStreamer生成的数据库", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + { + title: "TraceStreamer支持解析事件列表", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + { + title: "trace_streamer工具说明", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + ] + }, + { + collapsed: false, + title: 'SmartPerf', + describe: '', + children: [ + { + title: "SmartPerf 编译指导", + icon: "", + clickHandler: function (item: MenuItem) { + that.appContent!.innerHTML = "" + } + }, + ] + }, + ] + mainMenu.style.width = '290px' + let body = mainMenu.shadowRoot?.querySelector('.menu-body') as HTMLDivElement + let groups = body.querySelectorAll('lit-main-menu-group') + groups.forEach(value => { + let items = value.querySelectorAll('lit-main-menu-item') + items.forEach(item => { + item.style.width = '290px' + }) + }) + } + + initHtml(): string { + return ` + +
      +
      + +
      +
      +
      +
      + `; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/SpInfoAndStas.ts b/host/ide/src/trace/component/SpInfoAndStas.ts index a450ef9..1155200 100644 --- a/host/ide/src/trace/component/SpInfoAndStas.ts +++ b/host/ide/src/trace/component/SpInfoAndStas.ts @@ -14,15 +14,239 @@ */ import {BaseElement, element} from "../../base-ui/BaseElement.js"; +import {querySelectTraceStats, queryTraceMetaData,} from "../database/SqlLite.js"; +import {LitTable} from "../../base-ui/table/lit-table.js"; +import "../../base-ui/table/lit-table.js"; @element('sp-info-and-stats') export class SpInfoAndStats extends BaseElement { + private metaData: Array = []; + private infoData: Array = []; + private metaTableEl: LitTable | undefined; + private infoTableEl: LitTable | undefined; + private th: HTMLElement | undefined; + private backgroundMetaTable: HTMLDivElement | undefined; + private backgroundInfoTable: HTMLDivElement | undefined; + + static get observedAttributes() { + return [] + } + initElements(): void { + this.metaTableEl = this.shadowRoot!.querySelector('#metaData-table') as LitTable; + this.infoTableEl = this.shadowRoot!.querySelector('#stats-table') as LitTable; + + this.infoTableEl.style.overflow = 'visible' + this.metaTableEl.style.overflow = 'visible' + this.infoTableEl.style.width = 'auto' + this.metaTableEl.style.width = 'auto' + this.th = this.shadowRoot!.querySelector('.th') as HTMLElement; + } + + initInfoAndStatsData() { + this.initMetricItemData().then(() => { + this.metaTableEl!.dataSource = this.metaData; + this.infoTableEl!.dataSource = this.infoData; + let metaDataStyle: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('#metaData-table')?.shadowRoot?.querySelector('div.body') as HTMLDivElement + let metaDataHeadStyle: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('#metaData-table')?.shadowRoot?.querySelector('div.thead') as HTMLDivElement + let statsStyle: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('#stats-table')?.shadowRoot?.querySelector('div.body') as HTMLDivElement + let statsHeadStyle: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('#stats-table')?.shadowRoot?.querySelector('div.thead') as HTMLDivElement + metaDataHeadStyle.style.backgroundColor = 'var(--dark-background5,#F6F6F6)' + statsHeadStyle.style.backgroundColor = 'var(--dark-background5,#F6F6F6)' + this.initDataTableStyle(metaDataStyle); + this.initDataTableStyle(statsStyle); + }); + } + + initDataTableStyle(styleTable: HTMLDivElement): void { + for (let index = 0; index < styleTable.children.length; index++) { + // @ts-ignore + styleTable.children[index].style.backgroundColor = 'var(--dark-background5,#F6F6F6)' + } + this.metaTableEl!.style.height = 'auto' + this.metaTableEl!.style.minHeight = '80%' + this.metaTableEl!.style.borderRadius = '16' + this.infoTableEl!.style.height = 'auto' + this.infoTableEl!.style.minHeight = '80%' + this.infoTableEl!.style.borderRadius = '16' + } + + async initMetricItemData() { + this.metaData = [] + this.infoData = [] + let mete = await queryTraceMetaData(); + if (mete) { + for (let index = 0; index < mete.length; index++) { + this.metaData.push({name: mete[index].name, value: mete[index].valueText}) + } + } + let info = await querySelectTraceStats(); + if (info) { + for (let index = 0; index < info.length; index++) { + this.infoData.push({ + event_name: info[index].event_name, + stat_type: info[index].stat_type, + count: info[index].count + }) + } + } + } + + connectedCallback() { + } + + disconnectedCallback() { + } + + attributeChangedCallback(name: string, oldValue: string, newValue: string) { } initHtml(): string { return ` -
      System info and metadata
      + + +
      + + +
      `; } } + +export class MetaDataTable { + name: string | undefined; + value: string | undefined; + type?: string | undefined; +} + +export class InfoDataTable { + event_name: string | undefined; + stat_type: string | undefined; + count: number | undefined; + source?: string | undefined; + serverity?: string | undefined; +} diff --git a/host/ide/src/trace/component/SpMetrics.ts b/host/ide/src/trace/component/SpMetrics.ts index 3e06d04..530e935 100644 --- a/host/ide/src/trace/component/SpMetrics.ts +++ b/host/ide/src/trace/component/SpMetrics.ts @@ -15,41 +15,335 @@ import {BaseElement, element} from "../../base-ui/BaseElement.js"; +import { + queryDistributedTerm, + querySelectTraceStats, + querySystemCalls, + querySystemCallsTop, + queryTraceCpu, + queryTraceCpuTop, + queryTraceMemory, + queryTraceMemoryTop, + queryTraceMemoryUnAgg, + queryTraceMetaData, + queryTraceTaskName +} from "../database/SqlLite.js"; + +import "../../base-ui/table/lit-table.js"; +import {initCpuStrategyData, initTest} from "./metrics/CpuStrategy.js"; +import {initDistributedTermData} from "./metrics/DistributeTermStrategy.js"; +import {initMemoryAggStrategy} from "./metrics/MemAggStrategy.js"; +import {initMemoryStrategy} from "./metrics/MemStrategy.js"; +import {initSysCallsStrategy} from "./metrics/SysCallsStrategy.js"; +import {initSysCallsTopStrategy} from "./metrics/SysCallsTopStrategy.js"; +import {initTraceStateStrategy} from "./metrics/TraceStatsStrategy.js"; +import {initTraceTaskStrategy} from "./metrics/TraceTaskStrategy.js"; +import {initMetaDataStrategy} from "./metrics/MetaDataStrategy.js"; +import {PluginConvertUtils} from "./setting/utils/PluginConvertUtils.js"; + @element('sp-metrics') export class SpMetrics extends BaseElement { + private _metric?: string; + private _metricResult?: string; + private selectMetricEl: HTMLSelectElement | undefined; + private runButtonEl: HTMLButtonElement | undefined | null; + private responseJson: HTMLPreElement | undefined | null; + private metricOptionalSelects: Array | undefined; + + static get observedAttributes() { + return ["metric", "metricResult"] + } + + get metric(): string { + return this.getAttribute("metric") || ""; + } + + set metric(value: string) { + this._metric = value; + } + + get metricResult(): string { + return this.getAttribute("metricResult") || ""; + } + + set metricResult(value: string) { + this._metricResult = value; + this.setAttribute("metricResult", value); + } + initElements(): void { + this.selectMetricEl = this.shadowRoot?.querySelector(".sql-select") as HTMLSelectElement; + this.runButtonEl = this.shadowRoot?.querySelector(".sql-select-button") as HTMLButtonElement; + this.responseJson = this.shadowRoot?.querySelector(".response-json") as HTMLPreElement; + if (this.selectMetricEl) { + this.selectMetricEl.addEventListener("selectionchange", () => { + if (this.selectMetricEl) this.selectMetricEl.textContent = ""; + }) + } + this.initMetricDataHandle(); + this.initMetricSelectOption(); + } + + initMetric(queryItem: MetricQueryItem) { + this.initMetricData(queryItem).then(item => { + }) + } + + async initMetricData(queryItem: MetricQueryItem) { + let metricQuery = queryItem.metricQuery; + let queryList = await metricQuery(); + let metric = queryItem.metricResultHandle; + let resultData = metric(queryList); + let jsonText = PluginConvertUtils.BeanToCmdTxtWithObjName(resultData, true, queryItem.metricName, 4); + this.responseJson!.textContent = jsonText; + } + + attributeChangedCallback(name: string, oldValue: string, newValue: string) { + switch (name) { + case "metric": + if (this.selectMetricEl) this.selectMetricEl.textContent = newValue + break; + case "metricResult": + if (this.selectMetricEl) this.selectMetricEl.textContent = newValue + break; + } + } + + runClickListener = (event: any) => { + let selectedIndex = this.selectMetricEl!.selectedIndex; + let value = this.selectMetricEl!.options[selectedIndex].value; + let resultQuery = this.metricOptionalSelects?.filter((item) => { + return item.metricName == value + }) + if (!resultQuery || resultQuery.length < 1) return + this.initMetric(resultQuery[0]); + } + + + connectedCallback() { + // Run metric button to add listener + this.runButtonEl?.addEventListener('click', this.runClickListener); + } + + disconnectedCallback() { + this.runButtonEl?.removeEventListener('click', this.runClickListener); + } + + initMetricSelectOption() { + for (let index = 0; index < this.metricOptionalSelects!.length; index++) { + let htmlElement = document.createElement('option'); + if (this.metricOptionalSelects) { + htmlElement.textContent = this.metricOptionalSelects[index].metricName; + this.selectMetricEl?.appendChild(htmlElement); + } + } + } + + initMetricDataHandle() { + this.metricOptionalSelects = [ + { + metricName: 'distributed_term', + metricQuery: queryDistributedTerm, + metricResultHandle: initDistributedTermData + }, + { + metricName: 'trace_name', + metricQuery: querySelectTraceStats, + metricResultHandle: initTest, + }, + { + metricName: 'trace_cpu', + metricQuery: queryTraceCpu, + metricResultHandle: initCpuStrategyData + }, + { + metricName: 'trace_cpu_top10', + metricQuery: queryTraceCpuTop, + metricResultHandle: initCpuStrategyData, + }, + { + metricName: 'trace_mem', + metricQuery: queryTraceMemory, + metricResultHandle: initMemoryStrategy + }, + { + metricName: 'trace_mem_top10', + metricQuery: queryTraceMemoryTop, + metricResultHandle: initMemoryStrategy + }, + { + metricName: 'trace_mem_unagg', + metricQuery: queryTraceMemoryUnAgg, + metricResultHandle: initMemoryAggStrategy + }, + { + metricName: 'trace_task_names', + metricQuery: queryTraceTaskName, + metricResultHandle: initTraceTaskStrategy + }, + { + metricName: 'trace_stats', + metricQuery: querySelectTraceStats, + metricResultHandle: initTraceStateStrategy + }, + { + metricName: 'trace_metadata', + metricQuery: queryTraceMetaData, + metricResultHandle: initMetaDataStrategy + }, + { + metricName: 'sys_calls', + metricQuery: querySystemCalls, + metricResultHandle: initSysCallsStrategy + }, + { + metricName: 'sys_calls_top10', + metricQuery: querySystemCallsTop, + metricResultHandle: initSysCallsTopStrategy + }, + ] } initHtml(): string { return ` - + +
      +
      +

      Select a metric

      + + +
      +
      + +
      +
      + `; + } } -xmp{ - color: #121212; - background-color: #eeeeee; - padding: 30px; - margin: 30px; - overflow: auto; - border-radius: 20px; + +export interface MetricQueryItem { + metricName: string + metricQuery: Function + metricResultHandle: Function } - -
      - - trace_metadata: { - trace_duration_ns: 14726175738 - trace_uuid: "00000000-0000-0000-c0bd-eb5c5728bf40" - statsd_triggering_subscription_id: 0 - unique_session_name: "" - trace_size_bytes: 57202082 - trace_config_pbtxt: "buffers: { size_kb: 63488\\n fill_policy: DISCARD\\n}\\nbuffers: {\\n size_kb: 2048\\n fill_policy: DISCARD\\n}\\ndata_sources: {\\n config: {\\n name: \\"linux.process_stats\\"\\n target_buffer: 1\\n trace_duration_ms: 0\\n tracing_session_id: 0\\n enable_extra_guardrails: false\\n ftrace_config: {\\n buffer_size_kb: 0\\n drain_period_ms: 0\\n }\\n chrome_config: {\\n trace_config: \\"\\"\\n privacy_filtering_enabled: false\\n }\\n inode_file_config: {\\n scan_interval_ms: 0\\n scan_delay_ms: 0\\n scan_batch_size: 0\\n do_not_scan: false\\n }\\n process_stats_config: {\\n scan_all_processes_on_start: true\\n record_thread_names: false\\n proc_stats_poll_ms: 1000\\n proc_stats_cache_ttl_ms: 0\\n }\\n sys_stats_config: {\\n meminfo_period_ms: 0\\n vmstat_period_ms: 0\\n stat_period_ms: 0\\n }\\n heapprofd_config: {\\n sampling_interval_bytes: 0\\n all: false\\n continuous_dump_config: {\\n dump_phase_ms: 0\\n dump_interval_ms: 0\\n }\\n shmem_size_bytes: 0\\n block_client: false\\n }\\n android_power_config: {\\n battery_poll_ms: 0\\n collect_power_rails: false\\n }\\n android_log_config: {\\n min_prio: PRIO_UNSPECIFIED\\n }\\n packages_list_config: {\\n }\\n legacy_config: \\"\\"\\n }\\n}\\ndata_sources: {\\n config: {\\n name: \\"linux.ftrace\\"\\n target_buffer: 0\\n trace_duration_ms: 0\\n tracing_session_id: 0\\n enable_extra_guardrails: false\\n ftrace_config: {\\n ftrace_events: \\"sched/sched_switch\\"\\n ftrace_events: \\"power/suspend_resume\\"\\n ftrace_events: \\"sched/sched_wakeup\\"\\n ftrace_events: \\"sched/sched_wakeup_new\\"\\n ftrace_events: \\"sched/sched_waking\\"\\n ftrace_events: \\"power/cpu_frequency\\"\\n ftrace_events: \\"power/cpu_idle\\"\\n ftrace_events: \\"sched/sched_process_exit\\"\\n ftrace_events: \\"sched/sched_process_free\\"\\n ftrace_events: \\"task/task_newtask\\"\\n ftrace_events: \\"task/task_rename\\"\\n ftrace_events: \\"lowmemorykiller/lowmemory_kill\\"\\n ftrace_events: \\"oom/oom_score_adj_update\\"\\n ftrace_events: \\"ftrace/print\\"\\n atrace_categories: \\"gfx\\"\\n atrace_apps: \\"lmkd\\"\\n buffer_size_kb: 0\\n drain_period_ms: 0\\n }\\n chrome_config: {\\n trace_config: \\"\\"\\n privacy_filtering_enabled: false\\n }\\n inode_file_config: {\\n scan_interval_ms: 0\\n scan_delay_ms: 0\\n scan_batch_size: 0\\n do_not_scan: false\\n }\\n process_stats_config: {\\n scan_all_processes_on_start: false\\n record_thread_names: false\\n proc_stats_poll_ms: 0\\n proc_stats_cache_ttl_ms: 0\\n }\\n sys_stats_config: {\\n meminfo_period_ms: 0\\n vmstat_period_ms: 0\\n stat_period_ms: 0\\n }\\n heapprofd_config: {\\n sampling_interval_bytes: 0\\n all: false\\n continuous_dump_config: {\\n dump_phase_ms: 0\\n dump_interval_ms: 0\\n }\\n shmem_size_bytes: 0\\n block_client: false\\n }\\n android_power_config: {\\n battery_poll_ms: 0\\n collect_power_rails: false\\n }\\n android_log_config: {\\n min_prio: PRIO_UNSPECIFIED\\n }\\n packages_list_config: {\\n }\\n legacy_config: \\"\\"\\n }\\n}\\nduration_ms: 15000\\nenable_extra_guardrails: false\\nlockdown_mode: LOCKDOWN_UNCHANGED\\nstatsd_metadata: {\\n triggering_alert_id: 0\\n triggering_config_uid: 0\\n triggering_config_id: 0\\n triggering_subscription_id: 0\\n}\\nwrite_into_file: false\\nfile_write_period_ms: 0\\nmax_file_size_bytes: 0\\nguardrail_overrides: {\\n max_upload_per_day_bytes: 0\\n}\\ndeferred_start: false\\nflush_period_ms: 0\\nflush_timeout_ms: 0\\nnotify_traceur: false\\ntrigger_config: {\\n trigger_mode: UNSPECIFIED\\n trigger_timeout_ms: 0\\n}\\nallow_user_build_tracing: false\\nbuiltin_data_sources: {\\n disable_clock_snapshotting: false\\n disable_trace_config: false\\n disable_system_info: false\\n}\\nincremental_state_config: {\\n clear_period_ms: 0\\n}\\nunique_session_name: \\"\\"\\ncompression_type: COMPRESSION_TYPE_UNSPECIFIED\\nincident_report_config: {\\n destination_package: \\"\\"\\n destination_class: \\"\\"\\n privacy_level: 0\\n skip_dropbox: false\\n}" - sched_duration_ns: 14726119124 + +export class SpMetricsItem { + itemTip: string | undefined + itemValue: any[] | undefined } - -
      - `; - } -} \ No newline at end of file diff --git a/host/ide/src/trace/component/SpQuerySQL.ts b/host/ide/src/trace/component/SpQuerySQL.ts index 291793d..2942f33 100644 --- a/host/ide/src/trace/component/SpQuerySQL.ts +++ b/host/ide/src/trace/component/SpQuerySQL.ts @@ -14,55 +14,370 @@ */ import {BaseElement, element} from "../../base-ui/BaseElement.js"; -import {querySql, queryThreadsByPid} from "../database/SqlLite.js"; +import {queryCustomizeSelect, querySelectTraceStats} from "../database/SqlLite.js"; +import {LitTable} from "../../base-ui/table/lit-table.js"; +import "../../base-ui/table/lit-table.js"; +import {LitTableColumn} from "../../base-ui/table/lit-table-column.js"; @element('sp-query-sql') export class SpQuerySQL extends BaseElement { + private queryTableEl: LitTable | undefined; + private queryText: string | undefined; + private resultText: string | undefined; + private notSupportList: Array | undefined; + private querySize: HTMLElement | undefined; + private keyList: Array | undefined; + private selector: HTMLInputElement | undefined; + private isSupportSql: boolean = true; + private querySelectTables: string = ''; + private response: HTMLDivElement | undefined; + private statDataArray: any = [] + private querySqlErrorText: string = '' + private _queryStr?: string; + + static get observedAttributes() { + return ["queryStr"] + } + + get queryStr(): string { + return this.queryStr; + } + + set queryStr(value: string) { + this._queryStr = value; + } + initElements(): void { - let sqlInput: HTMLInputElement | undefined | null = this.shadowRoot?.querySelector('#sql-input'); - let contentEL: HTMLPreElement | undefined | null = this.shadowRoot?.querySelector('#content'); - if (sqlInput) { - sqlInput.addEventListener('change', e => { - let dateA = new Date().getTime(); - if(sqlInput&&sqlInput.value) { - querySql(sqlInput.value).then(res=>{ - let dur = new Date().getTime() - dateA; - contentEL!.innerHTML = `耗时:${dur}ms 记录:${res.length}条\n${JSON.stringify(res,null,4)}` - }) + this.selector = this.shadowRoot?.querySelector('.sql-select') as HTMLInputElement; + this.queryTableEl = new LitTable() + this.querySize = this.shadowRoot?.querySelector('.query_size') as HTMLElement; + this.response = this.shadowRoot?.querySelector('#dataResult') as HTMLDivElement; + this.notSupportList?.push('insert', 'delete', 'update', 'drop', 'alter', 'truncate'); + } + + selectEventListener = async (event: any) => { + if (event.ctrlKey && event.keyCode == 13) { + this.queryTableEl!.innerHTML = '' + this.queryText = this.selector!.value; + this.initDataElement(); + + this.response!.appendChild(this.queryTableEl!); + setTimeout(() => { + this.queryTableEl!.dataSource = this.statDataArray; + this.initData() + }, 20) + } + } + + initDataTableStyle(styleTable: HTMLDivElement): void { + for (let index = 0; index < styleTable.children.length; index++) { + // @ts-ignore + styleTable.children[index].style.backgroundColor = 'var(--dark-background5,#F6F6F6)' + } + } + + async initMetricData(): Promise { + if (!this.selector || this.selector.value == null) { + return []; + } + if (this.queryText == '' || this.queryText == null) { + let statList = await querySelectTraceStats(); + for (let index = 0; index < statList.length; index++) { + const statsResult = statList[index]; + let indexArray = { + event_name: statsResult.event_name, + start_type: statsResult.stat_type, + count: statsResult.count, + serverity: statsResult.serverity, + source: statsResult.source, + }; + } + if (this.querySize) { + this.querySize!.textContent = 'Query result - ' + statList.length + ' counts: select * from stat'; + } + this.resultText = 'Query result - ' + statList.length + ' counts: select * from stat'; + } else { + return this.statDataArray + } + } + + checkSupportSqlAbility(): boolean { + let noSupportChart = ['insert', 'delete', 'update', 'drop', 'alter', 'truncate'] + let result = noSupportChart.filter(item => { + return this.selector!.value.indexOf(item) > -1; + }); + return result.length > 0; + } + + checkSafetySelectSql(): boolean { + let split = this.selector?.value.trim().split(' '); + // if (!this.selector?.value.match('^\\s*?[sS]+$')) return + return !(split && split[0] == 'select'); + + } + + getSelectSqlField(): string { + if (this.selector!.value.indexOf('from') < 0) { + return ''; + } + let splitSql = this.selector?.value.split('from'); + if (splitSql) { + if (splitSql[0].indexOf('*') > -1) { + return '*' + } else { + let fields = splitSql[0].split(',') + return fields[0]; + } + } + return ''; + } + + getSelectSqlTableName(str: string): Array { + if (this.selector!.value.indexOf(str) < 0) { + return []; + } + let tableNameList = []; + let splitSql = this.selector?.value.split(str); + if (splitSql) { + for (let index = 1; index < splitSql?.length; index++) { + let splitSqlItem = splitSql[index].trim(); + let tableItem = splitSqlItem.split(' '); + let tableName = tableItem[0].trim(); + tableNameList.push(tableName); + if (tableName.indexOf('(') >= 0) { + tableNameList.pop(); + } else if (tableName.indexOf(')') >= 0) { + tableNameList.pop(); + let unitTableName = tableName.split(')'); + let tableNewName = unitTableName[0]; + tableNameList.push(tableNewName); } + } + } + return tableNameList + } + + initDataElement() { + if (this.keyList) { + this.keyList.forEach((item) => { + let htmlElement = document.createElement('lit-table-column') as LitTableColumn; + htmlElement.setAttribute('title', item); + htmlElement.setAttribute('data-index', item); + htmlElement.setAttribute('key', item); + htmlElement.setAttribute('align', 'flex-start'); + htmlElement.setAttribute('height', '32px'); + this.queryTableEl!.appendChild(htmlElement); }) } } connectedCallback() { + let selectQuery = this.shadowRoot?.querySelector('.query_select'); + if (selectQuery) { + let querySql = selectQuery.textContent; + } + // Listen to the sql execution of the query + this.addEventListener("keydown", this.selectEventListener); + this.selector!.addEventListener('input', this.inputSqlListener) + this.selector!.addEventListener('change', this.inputSqlListener) + } + + inputSqlListener = async (event: any) => { + let startData = new Date().getTime(); + if (!this.selector || this.selector!.value == null) { + this.querySqlErrorText = 'Query result - ' + ' 0 counts'; + return; + } + if (this.selector!.value.length < 15) { + this.isSupportSql = false; + this.querySqlErrorText = 'Query result - ' + ' 0 counts: ' + this.selector!.value; + if (this.checkSafetySelectSql() || this.checkSupportSqlAbility()) { + this.querySqlErrorText = 'Error: Statement contains a change action keyword,The change operation is not supported.'; + return; + } + return; + } + if (this.checkSafetySelectSql() || this.checkSupportSqlAbility()) { + this.isSupportSql = false; + return; + } + this.querySelectTables = this.getSelectSqlTableName('from').concat(this.getSelectSqlTableName('join')).toLocaleString(); + this.isSupportSql = true; + + this.getInputSqlResult(this.selector!.value).then(resultList => { + let dur = new Date().getTime() - startData; + this.statDataArray = [] + this.keyList = []; + for (let index = 0; index < resultList.length; index++) { + const dataResult = resultList[index]; + let keys = Object.keys(dataResult); + let values = Object.values(dataResult); + let jsonText = '{'; + for (let keyIndex = 0; keyIndex < keys.length; keyIndex++) { + let key = keys[keyIndex]; + if (this.keyList.indexOf(key) <= -1) { + this.keyList.push(key) + } + let value = values[keyIndex]; + jsonText += '"' + key + '"' + ': ' + '"' + value + '"'; + if (keyIndex != keys.length - 1) { + jsonText += ',' + } else { + jsonText += '}'; + } + } + this.statDataArray.push(JSON.parse(jsonText)) + } + }) + } + + async getInputSqlResult(sql: string): Promise { + return await queryCustomizeSelect(sql); + } + + disconnectedCallback() { + this.removeEventListener("keydown", this.selectEventListener); + this.selector!.removeEventListener('input', this.inputSqlListener) + this.selector!.removeEventListener('change', this.inputSqlListener) + } + + initData() { + if (this.statDataArray.length > 0) { + this.querySize!.textContent = 'Error: ' + this.selector?.value; + } + if (this.isSupportSql) { + let sqlField = this.keyList?.length == 0 ? '*' : this.keyList?.toLocaleString(); + this.querySize!.textContent = 'Query result - ' + this.statDataArray.length + ' counts: select ' + sqlField + ' from ' + this.querySelectTables; + } else { + this.querySize!.textContent = this.querySqlErrorText; + } + } + + attributeChangedCallback(name: string, oldValue: string, newValue: string) { + let queryDataSty: HTMLDivElement | undefined | null = this.queryTableEl?.shadowRoot?.querySelector('div.tbody') as HTMLDivElement + if (queryDataSty && queryDataSty.hasChildNodes()) { + for (let index = 0; index < queryDataSty.children.length; index++) { + // @ts-ignore + queryDataSty.children[index].style.backgroundColor = 'var(--dark-background5,#F6F6F6)' + } + } } initHtml(): string { return ` - -
      - -
      
      -
      + +
      +
      +

      Enter query and press cmd/ctrl + Enter

      + +
      +
      +

      Query result - 0 counts

      +
      +
      +
      `; } - -} \ No newline at end of file +} diff --git a/host/ide/src/trace/component/SpRecordTrace.ts b/host/ide/src/trace/component/SpRecordTrace.ts index 2e7674f..00b9a26 100644 --- a/host/ide/src/trace/component/SpRecordTrace.ts +++ b/host/ide/src/trace/component/SpRecordTrace.ts @@ -22,12 +22,17 @@ import {MenuItem} from "../../base-ui/menu/LitMainMenu.js"; import {SpProbesConfig} from "./setting/SpProbesConfig.js"; import {SpTraceCommand} from "./setting/SpTraceCommand.js"; import { + CpuConfig, CreateSessionRequest, + DiskioConfig, FpsConfig, HilogConfig, + HiperfPluginConfig, levelFromJSON, MemoryConfig, NativeHookConfig, + NetworkConfig, + ProcessConfig, ProfilerPluginConfig, ProfilerSessionConfig, ProfilerSessionConfigBufferConfig, @@ -40,6 +45,7 @@ import { } from "./setting/bean/ProfilerServiceTypes.js"; import {PluginConvertUtils} from "./setting/utils/PluginConvertUtils.js"; import {SpAllocations} from "./setting/SpAllocations.js"; +import {SpRecordPerf} from "./setting/SpRecordPerf.js"; @element('sp-record-trace') export class SpRecordTrace extends BaseElement { @@ -50,7 +56,7 @@ export class SpRecordTrace extends BaseElement { "MEMINFO_MLOCKED", "MEMINFO_PAGE_TABLES", "MEMINFO_SHMEM", "MEMINFO_SLAB", "MEMINFO_SLAB_RECLAIMABLE", "MEMINFO_SLAB_UNRECLAIMABLE", "MEMINFO_SWAP_CACHED", "MEMINFO_SWAP_FREE", "MEMINFO_SWAP_TOTAL", "MEMINFO_UNEVICTABLE", "MEMINFO_VMALLOC_CHUNK", "MEMINFO_VMALLOC_TOTAL", "MEMINFO_VMALLOC_USED", - "MEMINFO_WRITEBACK"] + "MEMINFO_WRITEBACK", "MEMINFO_KERNEL_RECLAIMABLE"] static VMEM_INFO = ["VMEMINFO_UNSPECIFIED", "VMEMINFO_NR_FREE_PAGES", "VMEMINFO_NR_ALLOC_BATCH", "VMEMINFO_NR_INACTIVE_ANON", "VMEMINFO_NR_ACTIVE_ANON", "VMEMINFO_NR_INACTIVE_FILE", "VMEMINFO_NR_ACTIVE_FILE", "VMEMINFO_NR_UNEVICTABLE", "VMEMINFO_NR_MLOCK", "VMEMINFO_NR_ANON_PAGES", @@ -93,6 +99,16 @@ export class SpRecordTrace extends BaseElement { "VMEMINFO_PGSKIP_NORMAL", "VMEMINFO_PGSTEAL_DIRECT", "VMEMINFO_PGSTEAL_KSWAPD", "VMEMINFO_SWAP_RA", "VMEMINFO_SWAP_RA_HIT", "VMEMINFO_WORKINGSET_RESTORE" ] + // sys.mem.total sys.mem.free sys.mem.buffers sys.mem.cached sys.mem.shmem sys.mem.slab sys.mem.swap.total + // sys.mem.swap.free sys.mem.mapped sys.mem.vmalloc.used sys.mem.page.tables sys.mem.kernel.stack + // sys.mem.active sys.mem.inactive sys.mem.unevictable sys.mem.vmalloc.total sys.mem.slab.unreclaimable + // sys.mem.cma.total sys.mem.cma.free + static ABALITY_MEM_INFO = ["MEMINFO_MEM_TOTAL", "MEMINFO_MEM_FREE", "MEMINFO_BUFFERS", "MEMINFO_CACHED", + "MEMINFO_SHMEM", "MEMINFO_SLAB", "MEMINFO_SWAP_TOTAL", "MEMINFO_SWAP_FREE", "MEMINFO_MAPPED", + "MEMINFO_VMALLOC_USED", "MEMINFO_PAGE_TABLES", "MEMINFO_KERNEL_STACK", "MEMINFO_ACTIVE", "MEMINFO_INACTIVE", + "MEMINFO_UNEVICTABLE", "MEMINFO_VMALLOC_TOTAL", "MEMINFO_SLAB_UNRECLAIMABLE", "MEMINFO_CMA_TOTAL", + "MEMINFO_CMA_FREE", "MEMINFO_KERNEL_RECLAIMABLE"] + schedulingEvents = [ "sched/sched_switch", "power/suspend_resume", @@ -172,6 +188,7 @@ export class SpRecordTrace extends BaseElement { let probesConfig = new SpProbesConfig(); let traceCommand = new SpTraceCommand(); let spAllocations = new SpAllocations(); + let spRecordPerf = new SpRecordPerf(); let menuGroup = this.shadowRoot?.querySelector('#menu-group') as LitMainMenuGroup let appContent = this.shadowRoot?.querySelector('#app-content') as HTMLElement appContent.append(recordSetting) @@ -209,11 +226,59 @@ export class SpRecordTrace extends BaseElement { sessionConfig: sessionConfig, pluginConfigs: [] } + let hasMonitorMemory = false; if (probesConfig.traceConfig.length > 0) { - request.pluginConfigs.push(that.createHtracePluginConfig(that, probesConfig, recordSetting)) + if (probesConfig.traceConfig.find(value => { + return value != "FPS" && value != "AbilityMonitor" + })) { + request.pluginConfigs.push(that.createHtracePluginConfig(that, probesConfig, recordSetting)) + } if (probesConfig.traceConfig.indexOf("FPS") != -1) { request.pluginConfigs.push(that.createFpsPluginConfig()) } + if (probesConfig.traceConfig.indexOf("AbilityMonitor") != -1) { + hasMonitorMemory = true; + let processConfig: ProcessConfig = { + report_process_tree: true, + report_cpu: true, + report_diskio: true, + report_pss: true, + } + let processPlugin: ProfilerPluginConfig = { + pluginName: "process-plugin", + sampleInterval: 1000, + configData: processConfig + } + request.pluginConfigs.push(processPlugin) + let cpuConfig: CpuConfig = { + pid: 0, + reportProcessInfo: true + } + let cpuPlugin: ProfilerPluginConfig = { + pluginName: "cpu-plugin", + sampleInterval: 1000, + configData: cpuConfig + } + request.pluginConfigs.push(cpuPlugin) + let diskIoConfig: DiskioConfig = { + reportIoStats: "IO_REPORT" + } + let diskIoPlugin: ProfilerPluginConfig = { + pluginName: "diskio-plugin", + sampleInterval: 1000, + configData: diskIoConfig + } + request.pluginConfigs.push(diskIoPlugin) + let netWorkConfig: NetworkConfig = { + testFile: "/data/local/tmp/" + } + let netWorkPlugin: ProfilerPluginConfig = { + pluginName: "network-plugin", + sampleInterval: 1000, + configData: netWorkConfig + } + request.pluginConfigs.push(netWorkPlugin) + } } let reportingFrequency: number; if (maxDur > 20) { @@ -221,12 +286,15 @@ export class SpRecordTrace extends BaseElement { } else { reportingFrequency = 2 } - if (probesConfig.memoryConfig.length > 0) { - request.pluginConfigs.push(that.createMemoryPluginConfig(probesConfig, that, reportingFrequency)) + if (probesConfig.memoryConfig.length > 0 || hasMonitorMemory) { + request.pluginConfigs.push(that.createMemoryPluginConfig(probesConfig, reportingFrequency, hasMonitorMemory)) } if (spAllocations.appProcess != "") { request.pluginConfigs.push(that.createNativePluginConfig(spAllocations, reportingFrequency)) } + if (spRecordPerf.startSamp) { + request.pluginConfigs.push(that.createHiperConfig(spRecordPerf, reportingFrequency)) + } appContent!.innerHTML = "" appContent.append(traceCommand) traceCommand.hdcCommon = @@ -242,13 +310,20 @@ export class SpRecordTrace extends BaseElement { } }, { - title: "Allocations", + title: "Native Memory", icon: "externaltools", fileChoose: false, clickHandler: function (ev: InputEvent) { appContent!.innerHTML = "" appContent.append(spAllocations) } + }, + { + title: "Hiperf", icon: "realIntentionBulb", fileChoose: false, + clickHandler: function (ev: InputEvent) { + appContent!.innerHTML = "" + appContent.append(spRecordPerf) + } } ] this._menuItems?.forEach(item => { @@ -317,141 +392,141 @@ export class SpRecordTrace extends BaseElement { initHtml(): string { return ` - -
      - -
      - -
      -
      -
      -
      -`; + .menugroup{ + height: 100%; + background: var(--dark-background3,#FFFFFF); + } + .menuitem{ + background: var(--dark-background3,#FFFFFF); + } + .content{ + background: var(--dark-background3,#FFFFFF); + border-style: none none none solid; + border-width: 1px; + border-color: rgba(166,164,164,0.2); + border-radius: 0px 16px 16px 0px; + } + +
      + +
      + +
      +
      +
      +
      + `; } private createHilogConfig(probesConfig: SpProbesConfig, reportingFrequency: number) { @@ -468,6 +543,61 @@ export class SpRecordTrace extends BaseElement { return hilogConfigProfilerPluginConfig; } + private createHiperConfig(spRecordPerf: SpRecordPerf, reportingFrequency: number) { + let perfConfig = spRecordPerf.getPerfConfig(); + let recordArgs = ""; + recordArgs = recordArgs + "-f " + perfConfig?.frequency; + if (perfConfig?.process && !perfConfig?.process.includes("ALL") && perfConfig?.process.length > 0) { + recordArgs = recordArgs + " -p " + perfConfig?.process; + } else { + recordArgs = recordArgs + " -a "; + } + if (perfConfig?.cpu && !perfConfig?.cpu.includes("ALL") && perfConfig?.cpu.length > 0) { + recordArgs = recordArgs + " -c " + perfConfig?.cpu; + } + if (perfConfig?.cpuPercent != 0) { + recordArgs = recordArgs + " --cpu-limit " + perfConfig?.cpuPercent; + } + if (perfConfig?.eventList && !perfConfig?.eventList.includes("NONE") && perfConfig?.eventList.length > 0) { + recordArgs = recordArgs + " -e " + perfConfig?.eventList; + } + if (perfConfig?.callStack != "none") { + recordArgs = recordArgs + " --call-stack " + perfConfig?.callStack + } + + if (perfConfig?.branch != "none") { + recordArgs = recordArgs + " -j " + perfConfig?.branch + } + + if (perfConfig?.clockType) { + recordArgs = recordArgs + " --clockid " + perfConfig?.clockType + } + + if (perfConfig?.isOffCpu) { + recordArgs = recordArgs + " --offcpu" + } + + if (perfConfig?.noInherit) { + recordArgs = recordArgs + " --no-inherit" + } + + if (perfConfig?.mmap) { + recordArgs = recordArgs + " -m " + perfConfig.mmap; + } + + let hiPerf: HiperfPluginConfig = { + isRoot: false, + outfileName: "/data/local/tmp/perf.data", + recordArgs: recordArgs + } + let hiPerfPluginConfig: ProfilerPluginConfig = { + pluginName: "hiperf-plugin", + sampleInterval: reportingFrequency * 1000, + configData: hiPerf, + } + return hiPerfPluginConfig; + } + private createNativePluginConfig(spAllocations: SpAllocations, reportingFrequency: number) { let appProcess = spAllocations.appProcess; let re = /^[0-9]+.?[0-9]*/; @@ -495,7 +625,7 @@ export class SpRecordTrace extends BaseElement { return nativePluginConfig; } - private createMemoryPluginConfig(probesConfig: SpProbesConfig, that: this, reportingFrequency: number) { + private createMemoryPluginConfig(probesConfig: SpProbesConfig, reportingFrequency: number, hasMonitorMemory: boolean) { let memoryconfig: MemoryConfig = { reportProcessTree: true, reportSysmemMemInfo: true, @@ -507,8 +637,16 @@ export class SpRecordTrace extends BaseElement { reportAppMemByMemoryService: false, pid: [] } + if (hasMonitorMemory) { + SpRecordTrace.ABALITY_MEM_INFO.forEach(va => { + memoryconfig.sysMeminfoCounters.push(sysMeminfoTypeFromJSON(va)); + }) + } probesConfig.memoryConfig.forEach(value => { if (value.indexOf("Kernel meminfo") != -1) { + if (hasMonitorMemory) { + memoryconfig.sysMeminfoCounters = []; + } SpRecordTrace.MEM_INFO.forEach(va => { memoryconfig.sysMeminfoCounters.push(sysMeminfoTypeFromJSON(va)); }) diff --git a/host/ide/src/trace/component/SpRecyclerSystemTrace.ts b/host/ide/src/trace/component/SpRecyclerSystemTrace.ts index a0a4ed1..5dba673 100644 --- a/host/ide/src/trace/component/SpRecyclerSystemTrace.ts +++ b/host/ide/src/trace/component/SpRecyclerSystemTrace.ts @@ -765,40 +765,43 @@ export class SpRecyclerSystemTrace extends BaseElement { initHtml(): string { return ` - -
      - - - -
      + +
      + + + + + + +
      `; } diff --git a/host/ide/src/trace/component/SpSystemTrace.ts b/host/ide/src/trace/component/SpSystemTrace.ts index 9b8d629..5f63dc4 100644 --- a/host/ide/src/trace/component/SpSystemTrace.ts +++ b/host/ide/src/trace/component/SpSystemTrace.ts @@ -20,28 +20,47 @@ import { getAsyncEvents, getCpuUtilizationRate, getFps, - getFunDataByTid, + getFunDataByTid, getSliceData, getSliceDataCount, getStatesProcessThreadData, - getStatesProcessThreadDataCount, + getStatesProcessThreadDataCount, getThreadProcessData, getThreadStateData, getThreadStateDataCount, + queryAbilityExits, + queryBytesInAbilityData, + queryBytesOutAbilityData, + queryBytesReadAbilityData, + queryBytesWrittenAbilityData, + queryCachedFilesAbilityData, + queryCompressedAbilityData, + queryCpuAbilityData, + queryCPuAbilityMaxData, + queryCpuAbilitySystemData, + queryCpuAbilityUserData, queryCpuData, queryCpuFreq, queryCpuFreqData, queryCpuMax, queryCpuMaxFreq, + queryDiskIoMaxData, queryHeapAllTable, queryHeapByEventType, - queryHeapByPid, queryHeapFrameCount, queryHeapGroupByEvent, queryHeapPid, + queryMemoryMaxData, + queryMemoryUsedAbilityData, queryNativeHookProcess, + queryNetWorkMaxData, + queryPacketsInAbilityData, + queryPacketsOutAbilityData, queryProcess, queryProcessData, queryProcessMem, queryProcessMemData, queryProcessThreads, + queryReadAbilityData, queryThreadData, queryTotalTime, + queryWrittenAbilityData, + querySearchFunc, threadPool } from "../database/SqlLite.js"; import {TraceRow} from "./trace/base/TraceRow.js"; @@ -62,11 +81,19 @@ import {HeapStruct} from "../bean/HeapStruct.js"; import {procedurePool} from "../database/Procedure.js"; import {Utils} from "./trace/base/Utils.js"; import {SpApplication} from "../SpApplication.js"; -import {SPT} from "../bean/StateProcessThread.js"; +import {SPT, SptSlice, ThreadProcess, ThreadState} from "../bean/StateProcessThread.js"; import {HeapTreeDataBean} from "../bean/HeapTreeDataBean.js"; import {Flag} from "./trace/timer-shaft/Flag.js"; import {SportRuler} from "./trace/timer-shaft/SportRuler.js"; import {NativeEventHeap} from "../bean/NativeHook.js"; +import {CpuAbilityMonitorStruct} from "../bean/CpuAbilityMonitorStruct.js"; +import {MemoryAbilityMonitorStruct} from "../bean/MemoryAbilityMonitorStruct.js"; +import {DiskAbilityMonitorStruct} from "../bean/DiskAbilityMonitorStruct.js"; +import {NetworkAbilityMonitorStruct} from "../bean/NetworkAbilityMonitorStruct.js"; +import {SpHiPerf} from "./hiperf/SpHiPerf.js"; +import {perfDataQuery} from "./hiperf/PerfDataQuery.js"; +import {SearchThreadProcessBean} from "../bean/SearchFuncBean.js"; +import {info} from "../../log/Log.js"; @element('sp-system-trace') export class SpSystemTrace extends BaseElement { @@ -97,6 +124,8 @@ export class SpSystemTrace extends BaseElement { private processThreads: Array = [] private processAsyncEvent: Array = [] private processMem: Array = [] + private expansionProcessIDS:Array = []; + private spHiPerf: SpHiPerf | undefined | null; initElements(): void { this.rowsEL = this.shadowRoot?.querySelector('.rows'); @@ -106,7 +135,8 @@ export class SpSystemTrace extends BaseElement { this.rangeSelect = new RangeSelect(this.timerShaftEL); this.rangeSelect.rowsEL = this.rowsEL; document?.addEventListener("triangle-flag", (event: any) => { - this.timerShaftEL?.drawTriangle(event.detail.time, event.detail.type); + let temporaryTime = this.timerShaftEL?.drawTriangle(event.detail.time, event.detail.type); + if (event.detail.timeCallback && temporaryTime) event.detail.timeCallback(temporaryTime); }) document?.addEventListener("flag-change", (event: any) => { @@ -162,7 +192,7 @@ export class SpSystemTrace extends BaseElement { th.checkType = "2" selection.nativeMemory.push(th.rowId!); }) - }else if (it.rowType == TraceRow.ROW_TYPE_THREAD) { + } else if (it.rowType == TraceRow.ROW_TYPE_THREAD) { selection.threadIds.push(parseInt(it.rowId!)) } else if (it.rowType == TraceRow.ROW_TYPE_FUNC) { selection.funTids.push(parseInt(it.rowId!)) @@ -176,6 +206,44 @@ export class SpSystemTrace extends BaseElement { } else { selection.heapIds.push(parseInt(it.rowId!)) } + } else if (it.rowType == TraceRow.ROW_TYPE_CPU_ABILITY) { + selection.cpuAbilityIds.push(it.rowId!) + } else if (it.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY) { + selection.memoryAbilityIds.push(it.rowId!) + } else if (it.rowType == TraceRow.ROW_TYPE_DISK_ABILITY) { + selection.diskAbilityIds.push(it.rowId!) + } else if (it.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { + selection.networkAbilityIds.push(it.rowId!) + } else if (it.rowType?.startsWith("hiperf")) { + it.dataList?.forEach((item) => { + if (item.startNS > (TraceRow.rangeSelectObject?.endNS || 0) || item.startNS < (TraceRow.rangeSelectObject?.startNS || 0)) { + return + } + if (perfDataQuery.threadData[item.thread_id] == undefined) { + return + } + if (selection.perfSampleIds.indexOf(item.sample_id) == -1) { + selection.perfSampleIds.push(item.sample_id) + } + }) + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { + this.rowsEL?.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`).forEach(th => { + th.rangeSelect = true; + th.checkType = "2" + }) + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF || it.rowId == "HiPerf-cpu-merge") { + selection.perfAll = true; + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_CPU) { + selection.perfCpus.push(it.index); + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { + selection.perfProcess.push(parseInt(it.rowId!.split("-")[0])); + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_THREAD) { + selection.perfThread.push(parseInt(it.rowId!.split("-")[0])); + } } }) selection.leftNs = TraceRow.rangeSelectObject?.startNS || 0; @@ -199,6 +267,7 @@ export class SpSystemTrace extends BaseElement { this.timerShaftEL?.removeTriangle("triangle") } }).observe(this.rowsEL!); + this.spHiPerf = new SpHiPerf(this); } getScrollWidth() { @@ -264,22 +333,34 @@ export class SpSystemTrace extends BaseElement { } documentOnMouseDown = (ev: MouseEvent) => { + TraceRow.isUserInteraction = true; if (this.isMouseInSheet(ev)) return; this.observerScrollHeightEnable = false; if (ev.offsetX > this.timerShaftEL!.canvas!.offsetLeft) { - this.rangeSelect.mouseDown(ev) - this.timerShaftEL?.documentOnMouseDown(ev) - this.visibleRows.forEach(it => { - it.draw(); - }) + let x = ev.offsetX - this.timerShaftEL!.canvas!.offsetLeft; + let y = ev.offsetY; + this.timerShaftEL?.documentOnMouseDown(ev); + if (this.timerShaftEL!.sportRuler!.frame.contains(x, y) && x > (TraceRow.rangeSelectObject?.startX || 0) && x < (TraceRow.rangeSelectObject?.endX || 0)) { + let time = TraceRow.range?.totalNS! * x / this.timerShaftEL!.canvas!.offsetWidth; + this.timerShaftEL!.sportRuler!.drawTriangle(time, "triangle") + } else { + this.rangeSelect.mouseDown(ev) + } + this.visibleRows.forEach(it => it.draw()); } } documentOnMouseUp = (ev: MouseEvent) => { + TraceRow.isUserInteraction = false; this.rangeSelect.isMouseDown = false; if (this.isMouseInSheet(ev)) return; + let x = ev.offsetX - this.timerShaftEL!.canvas!.offsetLeft; + let y = ev.offsetY; + if (this.timerShaftEL!.sportRuler!.frame.contains(x, y) && x > (TraceRow.rangeSelectObject?.startX || 0) && x < (TraceRow.rangeSelectObject?.endX || 0)) { + } else { this.rangeSelect.mouseUp(ev); this.timerShaftEL?.documentOnMouseUp(ev) + } } documentOnMouseOut = (ev: MouseEvent) => { @@ -290,6 +371,18 @@ export class SpSystemTrace extends BaseElement { } documentOnKeyPress = (ev: KeyboardEvent) => { + TraceRow.isUserInteraction = true; + if (ev.key.toLocaleLowerCase() == "m") { + if (CpuStruct.selectCpuStruct) { + this.timerShaftEL?.setSlicesMark((CpuStruct.selectCpuStruct.startTime || 0), (CpuStruct.selectCpuStruct.startTime || 0) + (CpuStruct.selectCpuStruct.dur || 0)); + } else if (ThreadStruct.selectThreadStruct) { + this.timerShaftEL?.setSlicesMark((ThreadStruct.selectThreadStruct.startTime || 0), (ThreadStruct.selectThreadStruct.startTime || 0) + (ThreadStruct.selectThreadStruct.dur || 0)); + } else if (FuncStruct.selectFuncStruct) { + this.timerShaftEL?.setSlicesMark((FuncStruct.selectFuncStruct.startTs || 0), (FuncStruct.selectFuncStruct.startTs || 0) + (FuncStruct.selectFuncStruct.dur || 0)); + } else { + this.timerShaftEL?.setSlicesMark(); + } + } if (this.isMousePointInSheet) { return; } @@ -298,6 +391,7 @@ export class SpSystemTrace extends BaseElement { } documentOnKeyUp = (ev: KeyboardEvent) => { + TraceRow.isUserInteraction = false; if (this.isMousePointInSheet) { return; } @@ -306,11 +400,13 @@ export class SpSystemTrace extends BaseElement { if (ev.code == "Enter") { if (ev.shiftKey) { this.dispatchEvent(new CustomEvent("previous-data", { - detail: {} + detail: {}, + composed:false })); } else { this.dispatchEvent(new CustomEvent("next-data", { - detail: {} + detail: {}, + composed:false })); } } @@ -322,6 +418,7 @@ export class SpSystemTrace extends BaseElement { } favoriteChangeHandler = (row: TraceRow) => { + info("favoriteChangeHandler", row.frame, row.offsetTop, row.offsetHeight); this.getVisibleRows(); } @@ -331,7 +428,10 @@ export class SpSystemTrace extends BaseElement { } documentOnMouseMove = (ev: MouseEvent) => { - if (this.isMouseInSheet(ev)) return; + if (this.isMouseInSheet(ev)) { + this.hoverStructNull(); + return; + } let rows = this.visibleRows; if (this.timerShaftEL?.isScaling()) { return; @@ -363,6 +463,7 @@ export class SpSystemTrace extends BaseElement { } else if (tr.rowType === TraceRow.ROW_TYPE_CPU_FREQ) { this.currentRowType = TraceRow.ROW_TYPE_CPU_FREQ; if (CpuFreqStruct.hoverCpuFreqStruct) { + CpuStruct.hoverCpuStruct = undefined; tr.tip = `${ColorUtils.formatNumberComma(CpuFreqStruct.hoverCpuFreqStruct.value!)} kHz` } tr.setTipLeft(x, CpuFreqStruct.hoverCpuFreqStruct) @@ -380,6 +481,75 @@ export class SpSystemTrace extends BaseElement { } } tr.setTipLeft(x, HeapStruct.hoverHeapStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_CPU_ABILITY) { + this.currentRowType = TraceRow.ROW_TYPE_CPU_ABILITY; + if (!SpSystemTrace.isCanvasOffScreen) CpuAbilityMonitorStruct.hoverCpuAbilityStruct = tr.onMouseHover(x, y); + if (CpuAbilityMonitorStruct.hoverCpuAbilityStruct) { + let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct.value!).toFixed(2) + "%" + tr.tip = `${monitorCpuTip}` + } + tr.setTipLeft(x, CpuAbilityMonitorStruct.hoverCpuAbilityStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_MEMORY_ABILITY) { + this.currentRowType = TraceRow.ROW_TYPE_MEMORY_ABILITY; + if (!SpSystemTrace.isCanvasOffScreen) MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = tr.onMouseHover(x, y); + if (MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct) { + tr.tip = `${Utils.getBinaryByteWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct.value!)}` + } + tr.setTipLeft(x, MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_DISK_ABILITY) { + this.currentRowType = TraceRow.ROW_TYPE_DISK_ABILITY; + if (!SpSystemTrace.isCanvasOffScreen) DiskAbilityMonitorStruct.hoverDiskAbilityStruct = tr.onMouseHover(x, y); + if (DiskAbilityMonitorStruct.hoverDiskAbilityStruct) { + tr.tip = `${DiskAbilityMonitorStruct.hoverDiskAbilityStruct.value!} KB/S` + } + tr.setTipLeft(x, DiskAbilityMonitorStruct.hoverDiskAbilityStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_NETWORK_ABILITY) { + this.currentRowType = TraceRow.ROW_TYPE_NETWORK_ABILITY; + if (!SpSystemTrace.isCanvasOffScreen) NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = tr.onMouseHover(x, y); + if (NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct) { + tr.tip = `${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct.value!)}` + } + tr.setTipLeft(x, NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_HIPERF_CPU) { + this.currentRowType = TraceRow.ROW_TYPE_HIPERF_CPU; + if (SpHiPerf.hoverCpuStruct) { + let num = Math.trunc((SpHiPerf.hoverCpuStruct.height || 0) / 40 * 100); + if (num > 0) { + if (tr.rowId == "HiPerf-cpu-merge") { + tr.tip = `${num * (this.spHiPerf!.maxCpuId + 1)}% (10.00ms)` + } else { + tr.tip = `${num}% (10.00ms)` + } + } else { + let datum = perfDataQuery.callChainData[`${SpHiPerf.hoverCpuStruct.sample_id}`] || []; + tr.tip = `${datum.length > 2 ? datum[datum.length - 3].name : ''} (${datum.length} other frames)` + } + } + tr.setTipLeft(x, SpHiPerf.hoverCpuStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_HIPERF_PROCESS) { + this.currentRowType = TraceRow.ROW_TYPE_HIPERF_PROCESS; + if (SpHiPerf.hoverProcessStruct) { + let num = Math.trunc((SpHiPerf.hoverProcessStruct.height || 0) / 40 * 100); + if (num > 0) { + tr.tip = `${num}% (10.00ms)` + } else { + let datum = perfDataQuery.callChainData[`${SpHiPerf.hoverProcessStruct.sample_id}`] || []; + tr.tip = `${datum.length > 2 ? datum[datum.length - 3].name : ''} (${datum.length} other frames)` + } + } + tr.setTipLeft(x, SpHiPerf.hoverProcessStruct) + } else if (tr.rowType === TraceRow.ROW_TYPE_HIPERF_THREAD) { + this.currentRowType = TraceRow.ROW_TYPE_HIPERF_THREAD; + if (SpHiPerf.hoverThreadStruct) { + let num = Math.trunc((SpHiPerf.hoverThreadStruct.height || 0) / 40 * 100); + if (num > 0) { + tr.tip = `${num}% (10.00ms)` + } else { + let datum = perfDataQuery.callChainData[`${SpHiPerf.hoverThreadStruct.sample_id}`] || []; + tr.tip = `${datum.length > 2 ? datum[datum.length - 3].name : ''} (${datum.length} other frames)` + } + } + tr.setTipLeft(x, SpHiPerf.hoverThreadStruct) } else { this.hoverStructNull(); } @@ -413,6 +583,7 @@ export class SpSystemTrace extends BaseElement { CpuFreqStruct.hoverCpuFreqStruct = undefined; ThreadStruct.hoverThreadStruct = undefined; FuncStruct.hoverFuncStruct = undefined; + SpHiPerf.hoverCpuStruct = undefined; } selectStructNull() { @@ -421,6 +592,7 @@ export class SpSystemTrace extends BaseElement { CpuFreqStruct.selectCpuFreqStruct = undefined; ThreadStruct.selectThreadStruct = undefined; FuncStruct.selectFuncStruct = undefined; + SpHiPerf.selectCpuStruct = undefined; } documentOnClick = (ev: MouseEvent) => { @@ -428,11 +600,16 @@ export class SpSystemTrace extends BaseElement { if (this.rangeSelect.isDrag()) { return; } - this.onClickHandler(); - this.documentOnMouseMove(ev) + let x = ev.offsetX - this.timerShaftEL!.canvas!.offsetLeft; + let y = ev.offsetY; + if (this.timerShaftEL!.sportRuler!.frame.contains(x, y) && x > (TraceRow.rangeSelectObject?.startX || 0) && x < (TraceRow.rangeSelectObject?.endX || 0)) { + } else { + this.onClickHandler(); + this.documentOnMouseMove(ev) + } } - onClickHandler(){ + onClickHandler() { this.rowsEL?.querySelectorAll>("trace-row").forEach(it => it.rangeSelect = false) this.selectStructNull(); let threadClickHandler: any; @@ -446,50 +623,72 @@ export class SpSystemTrace extends BaseElement { } let cpuRow = this.rowsEL?.querySelectorAll>(`trace-row[row-id='${d.cpu}'][row-type='cpu']`)[0]; let findEntry = cpuRow!.dataList!.find(it => it.startTime === d.startTime); + if (findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || findEntry!.startTime! > TraceRow.range!.endNS) { + this.timerShaftEL?.setRangeNS(findEntry!.startTime! - findEntry!.dur! * 2, findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2); + } this.hoverStructNull(); this.selectStructNull(); CpuStruct.hoverCpuStruct = findEntry; CpuStruct.selectCpuStruct = findEntry; + this.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, "inverted"); cpuRow!.draw(); this.traceSheetEL?.displayCpuData(CpuStruct.selectCpuStruct!, (wakeUpBean) => { CpuStruct.wakeupBean = wakeUpBean; this.visibleRows.forEach(it => it.draw()); }, cpuClickHandler); } - let scrollTimer: any; + cpuClickHandler = (d: CpuStruct) => { + this.expansionProcessIDS.forEach(it =>{ + this.shadowRoot!.querySelectorAll>(`trace-row[row-id='${it}'][row-type='process'][folder]`).forEach(it => it.expansion = false); + }) + this.expansionProcessIDS.length = 0; this.observerScrollHeightEnable = true; let threadRow = this.rowsEL?.querySelectorAll>(`trace-row[row-id='${d.tid}'][row-type='thread']`)[0]; - this.goProcess(`${d.tid}`, `${d.processId}`, "thread", true) this.observerScrollHeightCallback = () => { + info("scroll height changed", this.rowsEL?.scrollHeight); if (threadRow!.isComplete) { let findEntry = threadRow!.dataList!.find((dat) => dat.startTime === d.startTime); + if (findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || findEntry!.startTime! > TraceRow.range!.endNS) { + this.timerShaftEL?.setRangeNS(findEntry!.startTime! - findEntry!.dur! * 2, findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2); + } this.hoverStructNull(); this.selectStructNull(); ThreadStruct.hoverThreadStruct = findEntry; ThreadStruct.selectThreadStruct = findEntry; + this.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, "inverted"); threadRow!.draw(); - this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct!, threadClickHandler); - // clearTimeout(scrollTimer); + this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct!, threadClickHandler, cpuClickHandler); + if(d.processId){ + this.expansionProcessIDS.push(d.processId); + } this.goProcess(`${d.tid}`, `${d.processId}`, "thread", true) } else { threadRow!.onComplete = () => { let findEntry = threadRow!.dataList!.find((dat) => dat.startTime === d.startTime); + if (findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || findEntry!.startTime! > TraceRow.range!.endNS) { + this.timerShaftEL?.setRangeNS(findEntry!.startTime! - findEntry!.dur! * 2, findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2); + } this.hoverStructNull(); this.selectStructNull(); ThreadStruct.hoverThreadStruct = findEntry; ThreadStruct.selectThreadStruct = findEntry; + this.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, "inverted"); threadRow!.draw(); - this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct!, threadClickHandler); - clearTimeout(scrollTimer); - scrollTimer = setTimeout(() => this.goProcess(`${d.tid}`, `${d.processId}`, "thread", false), 100) + this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct!, threadClickHandler, cpuClickHandler); + if(d.processId){ + this.expansionProcessIDS.push(d.processId); + } + this.goProcess(`${d.tid}`, `${d.processId}`, "thread", false); } } } + this.goProcess(`${d.tid}`, `${d.processId}`, "thread", true); } if (CpuStruct.hoverCpuStruct) { CpuStruct.selectCpuStruct = CpuStruct.hoverCpuStruct + this.timerShaftEL?.drawTriangle(CpuStruct.selectCpuStruct!.startTime || 0, "inverted"); this.traceSheetEL?.displayCpuData(CpuStruct.selectCpuStruct, (wakeUpBean) => { CpuStruct.wakeupBean = wakeUpBean; this.visibleRows.forEach(it => it.draw()); @@ -497,15 +696,18 @@ export class SpSystemTrace extends BaseElement { this.timerShaftEL?.modifyFlagList(undefined); } else if (ThreadStruct.hoverThreadStruct) { ThreadStruct.selectThreadStruct = ThreadStruct.hoverThreadStruct; - this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct, threadClickHandler); + this.timerShaftEL?.drawTriangle(ThreadStruct.selectThreadStruct!.startTime || 0, "inverted"); + this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct, threadClickHandler, cpuClickHandler); this.timerShaftEL?.modifyFlagList(undefined); } else if (FuncStruct.hoverFuncStruct) { FuncStruct.selectFuncStruct = FuncStruct.hoverFuncStruct; + this.timerShaftEL?.drawTriangle(FuncStruct.selectFuncStruct!.startTs || 0, "inverted"); this.traceSheetEL?.displayFuncData(FuncStruct.hoverFuncStruct) this.timerShaftEL?.modifyFlagList(undefined); } else { this.observerScrollHeightEnable = false; this.selectFlag = null; + this.timerShaftEL?.removeTriangle("inverted"); if (!SportRuler.isMouseInSportRuler) { this.traceSheetEL?.setAttribute("mode", 'hidden'); this.getVisibleRows().forEach(it => it.draw(true)); @@ -556,6 +758,34 @@ export class SpSystemTrace extends BaseElement { }) } + goFunction(rowId: string, rowParentId: string, rowType: string, smooth: boolean = true, afterScroll: any) { + let row = this.shadowRoot!.querySelector>(`trace-row[row-id='${rowParentId}'][folder]`); + if (row) { + row.expansion = true + } + let funcRow = this.shadowRoot!.querySelector>(`trace-row[row-id='${rowId}'][row-type='${rowType}']`); + if (funcRow == null) { + let threadRow = this.shadowRoot!.querySelector>(`trace-row[row-id='${rowId}'][row-type='thread']`); + this.rowsEL!.scroll({ + top: threadRow!.offsetTop - this.rowsEL!.offsetTop - this.rowsEL!.offsetHeight + threadRow!.offsetHeight + threadRow!.offsetHeight, + left: 0, + behavior: smooth ? "smooth" : undefined + }) + if(threadRow!=null){ + if(threadRow.isComplete){ + afterScroll() + }else{ + threadRow.onComplete = ()=>{ + funcRow = this.shadowRoot!.querySelector>(`trace-row[row-id='${rowId}'][row-type='${rowType}']`); + afterScroll() + } + } + } + } else { + afterScroll() + } + } + rowScrollTo(offset: number, callback: Function) { const fixedOffset = offset; const onScroll = () => { @@ -586,6 +816,7 @@ export class SpSystemTrace extends BaseElement { } loadDatabaseUrl(url: string, progress: Function, complete?: ((res: { status: boolean, msg: string }) => void) | undefined) { + this.observerScrollHeightEnable = false; this.init({url: url}, progress).then((res) => { if (complete) { complete(res); @@ -594,6 +825,7 @@ export class SpSystemTrace extends BaseElement { } loadDatabaseArrayBuffer(buf: ArrayBuffer, progress: ((name: string, percent: number) => void), complete?: ((res: { status: boolean, msg: string }) => void) | undefined) { + this.observerScrollHeightEnable = false; this.init({buf}, progress).then((res) => { let scrollTop = this.rowsEL?.scrollTop || 0 let scrollHeight = this.rowsEL?.clientHeight || 0 @@ -613,7 +845,11 @@ export class SpSystemTrace extends BaseElement { item.rowType == TraceRow.ROW_TYPE_CPU_FREQ || item.rowType == TraceRow.ROW_TYPE_NATIVE_MEMORY || item.rowType == TraceRow.ROW_TYPE_FPS || - item.rowType == TraceRow.ROW_TYPE_PROCESS) { + item.rowType == TraceRow.ROW_TYPE_PROCESS || + item.rowType == TraceRow.ROW_TYPE_CPU_ABILITY || + item.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY || + item.rowType == TraceRow.ROW_TYPE_DISK_ABILITY || + item.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { item.expansion = false; item.rowHidden = false; } else { @@ -643,6 +879,163 @@ export class SpSystemTrace extends BaseElement { return searchResults; } + async searchFunction(cpuList: Array, query: string): Promise> { + let list = await querySearchFunc(query) + cpuList = cpuList.concat(list) + cpuList.sort((a, b) => (a.startTime || 0) - (b.startTime || 0)); + return cpuList + } + + searchThreadsAndProcesses(query: string): Array { + let searchResults: Array = [] + this.rowsEL!.querySelectorAll>(`trace-row[row-type='thread'][row-type='process']`).forEach(item => { + if (item!.name.search(query) >= 0) { + let searchBean = new SearchThreadProcessBean() + searchBean.name = item.name + searchBean.rowId = item.rowId + searchBean.type = "thread||process" + searchBean.rowType = item.rowType + searchBean.rowParentId = item.rowParentId + searchResults.push(searchBean) + } + }) + return searchResults + } + + showStruct(previous: boolean, currentIndex: number, structs: Array) { + if (structs.length == 0) { + return 0; + } + let findIndex = -1; + if (previous) { + for (let i = structs.length - 1; i >= 0; i--) { + let it = structs[i]; + if (i < currentIndex && (it.startTime!) >= (TraceRow.range!.startNS) && (it.startTime!) + (it.dur!) <= (TraceRow.range!.endNS)) { + findIndex = i; + break; + } + } + } else { + findIndex = structs.findIndex((it, idx) => { + return idx > currentIndex && (it.startTime!) >= (TraceRow.range!.startNS) && (it.startTime!) + (it.dur!) <= (TraceRow.range!.endNS) + }) + } + let findEntry: any + if (findIndex >= 0) { + findEntry = structs[findIndex]; + } else { + if (previous) { + for (let i = structs.length - 1; i >= 0; i--) { + let it = structs[i]; + if ((it.startTime! + it.dur!) < (TraceRow.range!.startNS)) { + findIndex = i; + break; + } + } + if (findIndex == -1) { + findIndex = structs.length - 1; + } + } else { + findIndex = structs.findIndex((it) => (it.startTime!) > (TraceRow.range!.endNS)) + if (findIndex == -1) { + findIndex = 0; + } + } + findEntry = structs[findIndex]; + this.moveRangeToCenter(findEntry.startTime!, findEntry.dur!) + } + this.rowsEL!.querySelectorAll>(`trace-row`).forEach(item => { + item.highlight = false; + if (!item.sleeping) { + item.draw(true) + } + }) + if (findEntry.type == 'thread') { + CpuStruct.selectCpuStruct = findEntry; + CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; + this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu']`).forEach(item => { + item.highlight = item.rowId == `${findEntry.cpu}`; + item.draw(true) + }) + this.goProcess(`${findEntry.cpu}`, "", "cpu", true) + this.onClickHandler(); + } else if (findEntry.type == "func") { + this.observerScrollHeightEnable = true; + this.goFunction(`${findEntry.tid}`, `${findEntry.pid}`, findEntry.type, true, () => { + let funcRow = this.rowsEL?.querySelector>(`trace-row[row-id='${findEntry.tid}'][row-type='func']`); + if (funcRow == null)return + this.goProcess(`${findEntry.tid}`, `${findEntry.pid}`, "func", true) + funcRow!.highlight = true + let completeEntry = () => { + if (funcRow == null) return + let searchEntry = funcRow!.dataList!.find((dat) => dat.startTs === findEntry.startTime); + this.hoverStructNull(); + this.selectStructNull(); + FuncStruct.hoverFuncStruct = searchEntry; + FuncStruct.selectFuncStruct = searchEntry; + this.visibleRows.forEach(it => it.draw()); + } + let scrollTimer: any; + this.observerScrollHeightCallback = () => { + funcRow = this.rowsEL?.querySelector>(`trace-row[row-id='${findEntry.tid}'][row-type='func']`); + if(funcRow == null){return} + if (funcRow!.isComplete) { + completeEntry() + this.onClickHandler(); + this.goProcess(`${findEntry.tid}`, `${findEntry.pid}`, "func", false) + } else { + funcRow!.onComplete = () => { + completeEntry() + this.onClickHandler(); + clearTimeout(scrollTimer); + scrollTimer = setTimeout(() => this.goProcess(`${findEntry.tid}`, `${findEntry.pid}`, "func", false), 100) + } + } + } + if (funcRow?.isComplete) { + completeEntry() + this.onClickHandler(); + this.goProcess(`${findEntry.tid}`, `${findEntry.pid}`, "func", true) + } + }); + } else if (findEntry.type == "thread||process") { + let threadProcessRow = this.rowsEL?.querySelectorAll>(`trace-row[row-id='${findEntry.rowId}'][row-type='${findEntry.rowType}']`)[0]; + threadProcessRow!.highlight = true + this.goProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); + let completeEntry = () => { + let searchEntry = threadProcessRow!.dataList!.find((dat) => dat.startTime === findEntry.startTime); + this.hoverStructNull(); + this.selectStructNull(); + + ThreadStruct.hoverThreadStruct = searchEntry; + ThreadStruct.selectThreadStruct = searchEntry; + threadProcessRow!.draw(); + } + let scrollTimer: any; + this.observerScrollHeightCallback = () => { + if (threadProcessRow!.isComplete) { + completeEntry() + this.goProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true) + } else { + threadProcessRow!.onComplete = () => { + completeEntry() + clearTimeout(scrollTimer); + scrollTimer = setTimeout(() => this.goProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, false), 100) + } + } + } + } + this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, "inverted"); + return findIndex; + } + + moveRangeToCenter(startTime: number, dur: number) { + let startNS = this.timerShaftEL?.getRange()?.startNS || 0; + let endNS = this.timerShaftEL?.getRange()?.endNS || 0; + let harfDur = Math.trunc((endNS - startNS) / 2 - dur / 2); + this.timerShaftEL?.setRangeNS(startTime - harfDur, startTime + dur + harfDur); + } + showPreCpuStruct(currentIndex: number, cpuStructs: Array): number { if (cpuStructs.length == 0) { return 0; @@ -658,11 +1051,11 @@ export class SpSystemTrace extends BaseElement { if (findIndex >= 0) { let findEntry = cpuStructs[findIndex]; CpuStruct.selectCpuStruct = findEntry; - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu']`).forEach(item =>{ + this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu']`).forEach(item => { item.highlight = item.rowId == `${findEntry.cpu}`; item.draw(true); }) - this.timerShaftEL?.drawTriangle(findEntry.startTime||0, "inverted"); + this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, "inverted"); } else { for (let i = cpuStructs.length - 1; i >= 0; i--) { let it = cpuStructs[i]; @@ -685,7 +1078,7 @@ export class SpSystemTrace extends BaseElement { item.highlight = item.rowId == `${findEntry.cpu}`; item.draw(true) }) - this.timerShaftEL?.drawTriangle(findEntry.startTime||0, "inverted"); + this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, "inverted"); } CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; this.onClickHandler(); @@ -702,11 +1095,11 @@ export class SpSystemTrace extends BaseElement { if (findIndex >= 0) { let findEntry = cpuStructs[findIndex]; CpuStruct.selectCpuStruct = findEntry; - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu']`).forEach(item =>{ + this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu']`).forEach(item => { item.highlight = item.rowId == `${findEntry.cpu}`; item.draw(true); }) - this.timerShaftEL?.drawTriangle(findEntry.startTime||0, "inverted"); + this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, "inverted"); } else { findIndex = cpuStructs.findIndex((it) => (it.startTime!) > (TraceRow.range!.endNS)) let findEntry: CpuStruct; @@ -723,7 +1116,7 @@ export class SpSystemTrace extends BaseElement { item.highlight = item.rowId == `${findEntry.cpu}`; item.draw(true); }) - this.timerShaftEL?.drawTriangle(findEntry.startTime||0, "inverted"); + this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, "inverted"); } CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; this.onClickHandler(); @@ -778,10 +1171,15 @@ export class SpSystemTrace extends BaseElement { await this.initFPS(); progress("native memory", 87); await this.initNativeMemory(); + progress("ability monitor", 88); + await this.initAbilityMonitor(); + await perfDataQuery.initPerfFiles() + await this.spHiPerf!.init(); progress("process", 90); await this.initProcess(); progress("process", 93); - await this.initProcessThreadStateData(progress); + // await this.initProcessThreadStateData(progress); + await this.initProcessThreadStateData2(progress); await this.initHeapStateData(progress) progress("display", 95); this.getVisibleRows().forEach(it => { @@ -832,11 +1230,20 @@ export class SpSystemTrace extends BaseElement { traceRow.name = `Cpu ${cpuId}` traceRow.favoriteChangeHandler = this.favoriteChangeHandler; traceRow.selectChangeHandler = this.selectChangeHandler; - traceRow.supplier = () => queryCpuData(cpuId, 0, this.timerShaftEL?.totalNS || 0) - traceRow.onThreadHandler = ((useCache: boolean) => { + traceRow.supplier = () => queryCpuData(cpuId, TraceRow.range?.startNS || 0, TraceRow.range?.endNS || 0) + traceRow.onThreadHandler = ((useCache: boolean, buf: ArrayBuffer | undefined | null) => { + let transfer = []; + if (!traceRow.isTransferCanvas) { + transfer.push(traceRow.offscreen[0]); + } + if (buf) { + transfer.push(buf); + } procedurePool.submitWithName(`cpu${cpuId % procedurePool.cpusLen.length}`, `cpu${cpuId}`, { + online: traceRow.online, + buf: buf, list: traceRow.must ? traceRow.dataList : undefined, - offscreen: traceRow.must ? traceRow.offscreen[0] : undefined,//是否离屏 + offscreen: !traceRow.isTransferCanvas ? traceRow.offscreen[0] : undefined,//是否离屏 dpr: traceRow.dpr,//屏幕dpr值 xs: TraceRow.range?.xs,//线条坐标信息 isHover: traceRow.isHover, @@ -856,17 +1263,16 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: traceRow.frame - }, traceRow.must && traceRow.args.isOffScreen ? traceRow.offscreen[0] : undefined, (res: any, hover: any) => { + }, transfer, (res: any, hover: any) => { traceRow.must = false; - if (traceRow.args.isOffScreen == true) { if (traceRow.isHover) { CpuStruct.hoverCpuStruct = hover; this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_CPU && it.name !== traceRow.name).forEach(it => it.draw(true)); } - return; - } }) + traceRow.isTransferCanvas = true; }) this.rowsEL?.appendChild(traceRow) } @@ -911,7 +1317,7 @@ export class SpSystemTrace extends BaseElement { traceRow.onThreadHandler = (useCache) => { procedurePool.submitWithName(`freq${it.cpu % procedurePool.freqLen.length}`, `freq${it.cpu}`, { list: traceRow.must ? traceRow.dataList : undefined, - offscreen: traceRow.must ? traceRow.offscreen[0] : undefined, + offscreen: !traceRow.isTransferCanvas ? traceRow.offscreen[0] : undefined, xs: TraceRow.range?.xs, dpr: traceRow.dpr, isHover: traceRow.isHover, @@ -933,8 +1339,9 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: traceRow.frame - }, traceRow.must && traceRow.args.isOffScreen ? traceRow.offscreen[0] : undefined, (res: any, hover: any) => { + }, !traceRow.isTransferCanvas ? traceRow.offscreen[0] : undefined, (res: any, hover: any) => { traceRow.must = false; if (traceRow.args.isOffScreen == true) { if (traceRow.isHover) { @@ -944,7 +1351,7 @@ export class SpSystemTrace extends BaseElement { return; } }) - + traceRow.isTransferCanvas = true; } this.rowsEL?.appendChild(traceRow) } @@ -964,7 +1371,7 @@ export class SpSystemTrace extends BaseElement { fpsRow.onThreadHandler = (useCache) => { procedurePool.submitWithName(`process0`, `fps0`, { list: fpsRow.must ? fpsRow.dataList : undefined, - offscreen: fpsRow.must ? fpsRow.offscreen[0] : undefined, + offscreen: !fpsRow.isTransferCanvas ? fpsRow.offscreen[0] : undefined, xs: TraceRow.range?.xs, dpr: fpsRow.dpr, isHover: fpsRow.isHover, @@ -982,10 +1389,12 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: fpsRow.frame - }, fpsRow.must && fpsRow.args.isOffScreen ? fpsRow.offscreen[0] : undefined, (res: any, hover: any) => { + }, !fpsRow.isTransferCanvas ? fpsRow.offscreen[0] : undefined, (res: any, hover: any) => { fpsRow.must = false; - }) + }); + fpsRow.isTransferCanvas = true; } this.rowsEL?.appendChild(fpsRow) } @@ -1026,7 +1435,7 @@ export class SpSystemTrace extends BaseElement { nativeRow.onThreadHandler = (useCache) => { procedurePool.submitWithName(`process${nativeRow.index}`, `native-memory`, { list: nativeRow.must ? nativeRow.dataList : undefined, - offscreen: nativeRow.must ? nativeRow.offscreen[0] : undefined, + offscreen: !nativeRow.isTransferCanvas ? nativeRow.offscreen[0] : undefined, xs: TraceRow.range?.xs, dpr: nativeRow.dpr, isHover: nativeRow.isHover, @@ -1043,10 +1452,12 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: nativeRow.frame - }, nativeRow.must && nativeRow.args.isOffScreen ? nativeRow.offscreen[0] : undefined, (res: any) => { + }, !nativeRow.isTransferCanvas ? nativeRow.offscreen[0] : undefined, (res: any) => { nativeRow.must = false; - }) + }); + nativeRow.isTransferCanvas = true; } this.rowsEL?.appendChild(nativeRow) @@ -1157,14 +1568,15 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: allHeapRow.frame }, !allHeapRow.isTransferCanvas ? allHeapRow.offscreen[0] : undefined, (res: any, hover: any) => { allHeapRow.must = false; - allHeapRow.isTransferCanvas = true; if (allHeapRow.isHover) { HeapStruct.hoverHeapStruct = hover; } - }) + }); + allHeapRow.isTransferCanvas = true; } this.rowsEL?.appendChild(allHeapRow) } @@ -1184,6 +1596,63 @@ export class SpSystemTrace extends BaseElement { } } + initProcessThreadStateData2 = async (progress: Function) => { + SpSystemTrace.SPT_DATA = []; + let pageSize = 500000; + let percent = 93; + let threadStateRes = await getThreadStateDataCount(); + let count: number = (threadStateRes[0] as any).count; + let pages = Math.ceil(count / pageSize); + let arrTs :Array = []; + let ps = 0; + for (let i = 0; i < pages; i++) { + ps += 1; + progress("StateProcessThread", percent + (ps / 100)); + let arr = await getThreadStateData(pageSize, i * pageSize); + arrTs = arrTs.concat(arr); + } + ps += 1; + progress("StateProcessThread", percent + (ps / 100)); + let arrTp:Array = await getThreadProcessData(); + let mapTp:Map = new Map(); + for (let tp of arrTp) { + mapTp.set(tp.id,tp); + } + let threadSliceRes = await getSliceDataCount(); + let sliceCount: number = (threadSliceRes[0] as any).count; + let slicePages = Math.ceil(sliceCount / pageSize); + let arrSlice :Array = []; + for (let i = 0; i < slicePages; i++) { + ps += 1; + progress("StateProcessThread", percent + (ps / 100)); + let arr = await getSliceData(pageSize, i * pageSize); + arrSlice = arrSlice.concat(arr); + } + let mapSlice:Map = new Map(); + for (let slice of arrSlice) { + mapSlice.set(`${slice.itid}-${slice.ts}`,slice); + } + for (let tr of arrTs) { + if(mapTp.has(tr.itid)){ + let tp = mapTp.get(tr.itid); + let spt = new SPT(); + spt.processId = tp!.processId + spt.process = tp!.process + spt.thread = tp!.thread + spt.threadId = tp!.threadId + spt.state = tr.state; + spt.dur= tr.dur; + spt.end_ts = tr.end_ts; + spt.start_ts = tr.start_ts; + spt.cpu = tr.cpu; + let slice = mapSlice.get(`${tr.itid}-${tr.ts}`); + spt.priority = (slice != undefined && slice != null) ? slice!.priority.toString() : ""; + spt.note = "-"; + SpSystemTrace.SPT_DATA.push(spt); + } + } + } + initHeapStateData = async (progress: Function) => { SpSystemTrace.HEAP_FRAME_DATA = []; let res = await queryHeapFrameCount(); @@ -1229,7 +1698,7 @@ export class SpSystemTrace extends BaseElement { processRow.onThreadHandler = (useCache) => { procedurePool.submitWithName(`process${(processRow.index) % procedurePool.processLen.length}`, `process ${processRow.index} ${it.processName}`, { list: processRow.must ? processRow.dataList : undefined, - offscreen: processRow.must ? processRow.offscreen[0] : undefined, + offscreen: !processRow.isTransferCanvas ? processRow.offscreen[0] : undefined, xs: TraceRow.range?.xs, dpr: processRow.dpr, isHover: processRow.isHover, @@ -1248,10 +1717,12 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: processRow.frame - }, processRow.must && processRow.args.isOffScreen ? processRow.offscreen[0] : undefined, (res: any) => { + }, !processRow.isTransferCanvas ? processRow.offscreen[0] : undefined, (res: any) => { processRow.must = false; }) + processRow.isTransferCanvas = true; } this.rowsEL?.appendChild(processRow) /** @@ -1295,7 +1766,7 @@ export class SpSystemTrace extends BaseElement { row.onThreadHandler = (useCache) => { procedurePool.submitWithName(`cpu${mem.trackId % procedurePool.cpusLen.length}`, `mem ${mem.trackId} ${mem.trackName}`, { list: row.must ? row.dataList : undefined, - offscreen: row.must ? row.offscreen[0] : undefined,//是否离屏 + offscreen: !row.isTransferCanvas ? row.offscreen[0] : undefined,//是否离屏 dpr: row.dpr,//屏幕dpr值 xs: TraceRow.range?.xs,//线条坐标信息 isHover: row.isHover, @@ -1313,10 +1784,12 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: row.frame - }, row.must && row.args.isOffScreen ? row.offscreen[0] : undefined, (res: any) => { + }, !row.isTransferCanvas ? row.offscreen[0] : undefined, (res: any) => { row.must = false; - }) + }); + row.isTransferCanvas = true; } this.rowsEL?.appendChild(row) }); @@ -1379,7 +1852,7 @@ export class SpSystemTrace extends BaseElement { for (let k = 0; k < groupedBy.length; k++) { procedurePool.submitWithName(`cpu${k % procedurePool.cpusLen.length}`, `func${thread.tid}${k}${thread.threadName}`, { list: funcRow.must ? groupedBy[k] : undefined, - offscreen: funcRow.must ? funcRow.offscreen[k] : undefined,//是否离屏 + offscreen: !funcRow.isTransferCanvas ? funcRow.offscreen[k] : undefined,//是否离屏 dpr: funcRow.dpr,//屏幕dpr值 xs: TraceRow.range?.xs,//线条坐标信息 isHover: funcRow.isHover, @@ -1401,8 +1874,9 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: funcRow.frame - }, funcRow.must && funcRow.args.isOffScreen ? funcRow.offscreen[k] : undefined, (res: any, hover: any) => { + }, !funcRow.isTransferCanvas ? funcRow.offscreen[k] : undefined, (res: any, hover: any) => { funcRow.must = false; if (funcRow.args.isOffScreen == true) { if (funcRow.isHover && hover) { @@ -1413,10 +1887,14 @@ export class SpSystemTrace extends BaseElement { } }) } + funcRow.isTransferCanvas = true; } this.insertAfter(funcRow, threadRow) this.observer.observe(funcRow) funcRow.draw(); + if(threadRow.onComplete){ + threadRow.onComplete() + } this.getVisibleRows();//function 由于后插入dom,所以需要重新获取可见行 } }) @@ -1425,7 +1903,7 @@ export class SpSystemTrace extends BaseElement { threadRow.onThreadHandler = (useCache) => { procedurePool.submitWithName(`process${(threadRow.index) % procedurePool.processLen.length}`, `thread ${thread.tid} ${thread.threadName}`, { list: threadRow.must ? threadRow.dataList : undefined, - offscreen: threadRow.must ? threadRow.offscreen[0] : undefined,//是否离屏 + offscreen: !threadRow.isTransferCanvas ? threadRow.offscreen[0] : undefined,//是否离屏 dpr: threadRow.dpr,//屏幕dpr值 xs: TraceRow.range?.xs,//线条坐标信息 isHover: threadRow.isHover, @@ -1445,8 +1923,9 @@ export class SpSystemTrace extends BaseElement { startNS: TraceRow.range?.startNS || 0, endNS: TraceRow.range?.endNS || 0, totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, frame: threadRow.frame - }, threadRow.must && threadRow.args.isOffScreen ? threadRow.offscreen[0] : undefined, (res: any, hover: any) => { + }, !threadRow.isTransferCanvas ? threadRow.offscreen[0] : undefined, (res: any, hover: any) => { threadRow.must = false; if (threadRow.args.isOffScreen == true) { if (threadRow.isHover) { @@ -1456,9 +1935,11 @@ export class SpSystemTrace extends BaseElement { return; } }) + threadRow.isTransferCanvas = true; } this.rowsEL?.appendChild(threadRow) - }; + } + } } @@ -1471,47 +1952,1033 @@ export class SpSystemTrace extends BaseElement { } } + initAbilityMonitor = async () => { + let result = await queryAbilityExits(); + if (result.length <= 0) return; + let processRow = this.initAbilityRow(); + if (this.hasTable(result, "trace_cpu_usage")) { + await this.initCpuAbility(processRow); + } + if (this.hasTable(result, "sys_memory")) { + await this.initMemoryAbility(processRow); + } + if (this.hasTable(result, "trace_diskio")) { + await this.initDiskAbility(processRow); + } + if (this.hasTable(result, "trace_network")) { + await this.initNetworkAbility(processRow); + } + } + + memoryMath = (maxByte: number) => { + let maxByteName = "" + if (maxByte > 0) { + maxByteName = Utils.getBinaryByteWithUnit(maxByte) + } + return maxByteName; + } + + diskIOMath = (maxByte: number) => { + let maxByteName = "" + if (maxByte > 0) { + maxByteName = maxByte + "KB/S" + } + return maxByteName; + } + + networkMath = (maxValue: number) => { + let maxByteName = "" + if (maxValue > 0) { + maxByteName = Utils.getBinaryByteWithUnit(maxValue) + } + return maxByteName; + } + initHtml(): string { return ` - -
      - -
      -
      - -
      + +
      + + +
      +
      + + +
      `; } + + private hasTable(result: Array, tableName: string) { + return result.find((o) => { + return o.event_name === tableName + }) + } + + private initAbilityRow = () => { + let processRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + processRow.rowId = `abilityMonitor` + processRow.rowType = TraceRow.ROW_TYPE_MONITOR + processRow.rowParentId = ''; + processRow.folder = true; + processRow.name = 'Ability Monitor'; + processRow.favoriteChangeHandler = this.favoriteChangeHandler; + processRow.selectChangeHandler = this.selectChangeHandler; + processRow.supplier = () => new Promise>((resolve) => resolve([])); + processRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability0`, `monitorGroup`, { + list: processRow.must ? processRow.dataList : undefined, + offscreen: processRow.must ? processRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: processRow.dpr, + isHover: processRow.isHover, + hoverX: processRow.hoverX, + hoverY: processRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: processRow.canvasWidth, + canvasHeight: processRow.canvasHeight, + isRangeSelect: processRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: processRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: processRow.frame, + }, processRow.must && processRow.args.isOffScreen ? processRow.offscreen[0] : undefined, (res: any, hover: any) => { + processRow.must = false; + } + ) + } + this.rowsEL?.appendChild(processRow) + return processRow; + } + + private initCpuAbility = async (processRow: TraceRow) => { + let cpuMaxData = await queryCPuAbilityMaxData(); + let hasTotal = false; + let hasUserLoad = false; + let hasSystemLoad = false; + let userLoad = cpuMaxData[0].userLoad; + if (userLoad > 0) { + hasUserLoad = true; + } + let systemLoad = cpuMaxData[0].systemLoad; + if (systemLoad > 0) { + hasSystemLoad = true; + } + let totalLoad = cpuMaxData[0].totalLoad; + if (totalLoad > 0) { + hasTotal = true; + } + let cpuNameList: Array = ['Total', 'User', 'System'] + let traceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + traceRow.rowParentId = `abilityMonitor` + traceRow.rowHidden = !processRow.expansion + traceRow.rowId = cpuNameList[0] + traceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY + traceRow.favoriteChangeHandler = this.favoriteChangeHandler; + traceRow.selectChangeHandler = this.selectChangeHandler; + traceRow.style.height = '40px' + traceRow.style.width = `100%`; + traceRow.setAttribute('children', ''); + traceRow.name = `CPU ${cpuNameList[0]} Load`; + traceRow.supplier = () => queryCpuAbilityData() + traceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability0`, `monitorCpu0`, { + list: traceRow.must ? traceRow.dataList : undefined, + offscreen: traceRow.must ? traceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: traceRow.dpr, + isHover: traceRow.isHover, + hoverX: traceRow.hoverX, + hoverY: traceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: traceRow.canvasWidth, + canvasHeight: traceRow.canvasHeight, + hoverCpuAbilityStruct: CpuAbilityMonitorStruct.hoverCpuAbilityStruct, + selectCpuAbilityStruct: CpuAbilityMonitorStruct.selectCpuAbilityStruct, + isRangeSelect: traceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxCpuUtilization: 100, + maxCpuUtilizationName: hasTotal ? "100%" : '0%', + useCache: useCache, + lineColor: traceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: traceRow.frame, + }, traceRow.must && traceRow.args.isOffScreen ? traceRow.offscreen[0] : undefined, (res: any, hover: any) => { + traceRow.must = false; + if (traceRow.args.isOffScreen == true) { + if (traceRow.isHover) { + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_CPU_ABILITY && it.name !== traceRow.name).forEach(it => it.draw(true)); + } + return; + } + } + ) + } + this.rowsEL?.appendChild(traceRow) + + let userTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + userTraceRow.rowParentId = `abilityMonitor` + userTraceRow.rowHidden = !processRow.expansion + userTraceRow.rowId = cpuNameList[1] + userTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY + userTraceRow.style.height = '40px' + userTraceRow.style.width = `100%`; + userTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + userTraceRow.selectChangeHandler = this.selectChangeHandler; + userTraceRow.setAttribute('children', ''); + userTraceRow.name = `CPU ${cpuNameList[1]} Load`; + userTraceRow.supplier = () => queryCpuAbilityUserData() + userTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability1`, `monitorCpu1`, { + list: userTraceRow.must ? userTraceRow.dataList : undefined, + offscreen: userTraceRow.must ? userTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: userTraceRow.dpr, + isHover: userTraceRow.isHover, + hoverX: userTraceRow.hoverX, + hoverY: userTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: userTraceRow.canvasWidth, + canvasHeight: userTraceRow.canvasHeight, + hoverCpuAbilityStruct: CpuAbilityMonitorStruct.hoverCpuAbilityStruct, + selectCpuAbilityStruct: CpuAbilityMonitorStruct.selectCpuAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: userTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxCpuUtilization: 100, + maxCpuUtilizationName: hasUserLoad ? "100%" : '0%', + useCache: useCache, + lineColor: userTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: userTraceRow.frame, + isAbilityRow: true, + isStartAbilityRow: true, + isEndAbilityRow: false, + }, userTraceRow.must && userTraceRow.args.isOffScreen ? userTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + userTraceRow.must = false; + if (userTraceRow.args.isOffScreen == true) { + if (userTraceRow.isHover) { + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_CPU_ABILITY && it.name !== userTraceRow.name).forEach(it => it.draw(true)); + } + if (userTraceRow.dataList) userTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(userTraceRow) + + let sysTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + sysTraceRow.rowParentId = `abilityMonitor` + sysTraceRow.rowHidden = !processRow.expansion + sysTraceRow.rowId = cpuNameList[2] + sysTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY + sysTraceRow.style.height = '40px' + sysTraceRow.style.width = `100%`; + sysTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + sysTraceRow.selectChangeHandler = this.selectChangeHandler; + sysTraceRow.setAttribute('children', ''); + sysTraceRow.name = `CPU ${cpuNameList[2]} Load`; + sysTraceRow.supplier = () => queryCpuAbilitySystemData() + sysTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability2`, `monitorCpu2`, { + list: sysTraceRow.must ? sysTraceRow.dataList : undefined, + offscreen: sysTraceRow.must ? sysTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: sysTraceRow.dpr, + isHover: sysTraceRow.isHover, + hoverX: sysTraceRow.hoverX, + hoverY: sysTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: sysTraceRow.canvasWidth, + canvasHeight: sysTraceRow.canvasHeight, + hoverCpuAbilityStruct: CpuAbilityMonitorStruct.hoverCpuAbilityStruct, + selectCpuAbilityStruct: CpuAbilityMonitorStruct.selectCpuAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: sysTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxCpuUtilization: 100, + maxCpuUtilizationName: hasSystemLoad ? "100%" : '0%', + useCache: useCache, + lineColor: sysTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: sysTraceRow.frame, + isAbilityRow: true, + isStartAbilityRow: true, + isEndAbilityRow: false, + }, sysTraceRow.must && sysTraceRow.args.isOffScreen ? sysTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + sysTraceRow.must = false; + if (sysTraceRow.args.isOffScreen == true) { + if (sysTraceRow.isHover) { + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_CPU_ABILITY && it.name !== sysTraceRow.name).forEach(it => it.draw(true)); + } + if (sysTraceRow.dataList) sysTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(sysTraceRow) + } + + private initMemoryAbility = async (processRow: TraceRow) => { + // sys.mem.total sys.mem.cached sys.mem.swap.total + let memoryNameList: Array = ['MemoryTotal', 'Cached', 'SwapTotal'] + let memoryTotal = await queryMemoryMaxData("sys.mem.total"); + let memoryTotalValue = memoryTotal[0].maxValue + let memoryTotalId = memoryTotal[0].filter_id + + let memoryTotalValueName = this.memoryMath(memoryTotalValue); + let memoryUsedTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + memoryUsedTraceRow.rowParentId = `abilityMonitor` + memoryUsedTraceRow.rowHidden = !processRow.expansion + memoryUsedTraceRow.rowId = memoryNameList[0] + memoryUsedTraceRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY + memoryUsedTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + memoryUsedTraceRow.selectChangeHandler = this.selectChangeHandler; + memoryUsedTraceRow.style.height = '40px' + memoryUsedTraceRow.style.width = `100%`; + memoryUsedTraceRow.setAttribute('children', ''); + memoryUsedTraceRow.name = memoryNameList[0]; + memoryUsedTraceRow.supplier = () => queryMemoryUsedAbilityData(memoryTotalId) + memoryUsedTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability0`, `monitorMemory0`, { + list: memoryUsedTraceRow.must ? memoryUsedTraceRow.dataList : undefined, + offscreen: memoryUsedTraceRow.must ? memoryUsedTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: memoryUsedTraceRow.dpr, + isHover: memoryUsedTraceRow.isHover, + hoverX: memoryUsedTraceRow.hoverX, + hoverY: memoryUsedTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: memoryUsedTraceRow.canvasWidth, + canvasHeight: memoryUsedTraceRow.canvasHeight, + hoverMemoryAbilityStruct: MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, + selectMemoryAbilityStruct: MemoryAbilityMonitorStruct.selectMemoryAbilityStruct, + isRangeSelect: memoryUsedTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxMemoryByte: memoryTotalValue, + maxMemoryByteName: memoryTotalValueName, + useCache: useCache, + lineColor: memoryUsedTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: memoryUsedTraceRow.frame, + }, memoryUsedTraceRow.must && memoryUsedTraceRow.args.isOffScreen ? memoryUsedTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + memoryUsedTraceRow.must = false; + if (memoryUsedTraceRow.args.isOffScreen == true) { + if (memoryUsedTraceRow.isHover) { + MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_MEMORY_ABILITY && it.name !== memoryUsedTraceRow.name).forEach(it => it.draw(true)); + } + if (memoryUsedTraceRow.dataList) memoryUsedTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(memoryUsedTraceRow) + + let cached = await queryMemoryMaxData("sys.mem.cached"); + let cachedValue = cached[0].maxValue + let cachedValueName = this.memoryMath(cachedValue); + let cachedId = cached[0].filter_id + + let cachedFilesTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + cachedFilesTraceRow.rowParentId = `abilityMonitor` + cachedFilesTraceRow.rowHidden = !processRow.expansion + cachedFilesTraceRow.rowId = memoryNameList[1] + cachedFilesTraceRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY + cachedFilesTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + cachedFilesTraceRow.selectChangeHandler = this.selectChangeHandler; + cachedFilesTraceRow.style.height = '40px' + cachedFilesTraceRow.style.width = `100%`; + cachedFilesTraceRow.setAttribute('children', ''); + cachedFilesTraceRow.name = memoryNameList[1]; + cachedFilesTraceRow.supplier = () => queryCachedFilesAbilityData(cachedId) + cachedFilesTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability1`, `monitorMemory1`, { + list: cachedFilesTraceRow.must ? cachedFilesTraceRow.dataList : undefined, + offscreen: cachedFilesTraceRow.must ? cachedFilesTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: cachedFilesTraceRow.dpr, + isHover: cachedFilesTraceRow.isHover, + hoverX: cachedFilesTraceRow.hoverX, + hoverY: cachedFilesTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: cachedFilesTraceRow.canvasWidth, + canvasHeight: cachedFilesTraceRow.canvasHeight, + hoverMemoryAbilityStruct: MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, + selectMemoryAbilityStruct: MemoryAbilityMonitorStruct.selectMemoryAbilityStruct, + isRangeSelect: cachedFilesTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxMemoryByte: cachedValue, + maxMemoryByteName: cachedValueName, + useCache: useCache, + lineColor: cachedFilesTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: cachedFilesTraceRow.frame, + }, cachedFilesTraceRow.must && cachedFilesTraceRow.args.isOffScreen ? cachedFilesTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + cachedFilesTraceRow.must = false; + if (cachedFilesTraceRow.args.isOffScreen == true) { + if (cachedFilesTraceRow.isHover) { + MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_MEMORY_ABILITY && it.name !== cachedFilesTraceRow.name).forEach(it => it.draw(true)); + } + if (cachedFilesTraceRow.dataList) cachedFilesTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(cachedFilesTraceRow) + + + let swap = await queryMemoryMaxData("sys.mem.swap.total"); + let swapValue = swap[0].maxValue + let swapValueName = this.memoryMath(swapValue); + let swapId = swap[0].filter_id + + let compressedTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + compressedTraceRow.rowParentId = `abilityMonitor` + compressedTraceRow.rowHidden = !processRow.expansion + compressedTraceRow.rowId = memoryNameList[2] + compressedTraceRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY + compressedTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + compressedTraceRow.selectChangeHandler = this.selectChangeHandler; + compressedTraceRow.style.height = '40px' + compressedTraceRow.style.width = `100%`; + compressedTraceRow.setAttribute('children', ''); + compressedTraceRow.name = memoryNameList[2]; + compressedTraceRow.supplier = () => queryCompressedAbilityData(swapId) + compressedTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability2`, `monitorMemory2`, { + list: compressedTraceRow.must ? compressedTraceRow.dataList : undefined, + offscreen: compressedTraceRow.must ? compressedTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: compressedTraceRow.dpr, + isHover: compressedTraceRow.isHover, + hoverX: compressedTraceRow.hoverX, + hoverY: compressedTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: compressedTraceRow.canvasWidth, + canvasHeight: compressedTraceRow.canvasHeight, + hoverMemoryAbilityStruct: MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, + selectMemoryAbilityStruct: MemoryAbilityMonitorStruct.selectMemoryAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: compressedTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxMemoryByte: swapValue, + maxMemoryByteName: swapValueName, + useCache: useCache, + lineColor: compressedTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: compressedTraceRow.frame, + }, compressedTraceRow.must && compressedTraceRow.args.isOffScreen ? compressedTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + compressedTraceRow.must = false; + if (compressedTraceRow.args.isOffScreen == true) { + if (compressedTraceRow.isHover) { + MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_MEMORY_ABILITY && it.name !== compressedTraceRow.name).forEach(it => it.draw(true)); + } + if (compressedTraceRow.dataList) compressedTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(compressedTraceRow) + } + + private initDiskAbility = async (processRow: TraceRow) => { + let maxList = await queryDiskIoMaxData(); + let maxBytesRead = maxList[0].bytesRead; + let maxBytesReadName = this.diskIOMath(maxBytesRead); + let diskIONameList: Array = ['Bytes Read/Sec', 'Bytes Written/Sec', 'Read Ops/Sec', 'Written Ops/Sec'] + let bytesReadTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + bytesReadTraceRow.rowParentId = `abilityMonitor` + bytesReadTraceRow.rowHidden = !processRow.expansion + bytesReadTraceRow.rowId = diskIONameList[0] + bytesReadTraceRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY + bytesReadTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + bytesReadTraceRow.selectChangeHandler = this.selectChangeHandler; + bytesReadTraceRow.style.height = '40px' + bytesReadTraceRow.style.width = `100%`; + bytesReadTraceRow.setAttribute('children', ''); + bytesReadTraceRow.name = 'Disk ' + diskIONameList[0]; + bytesReadTraceRow.supplier = () => queryBytesReadAbilityData() + bytesReadTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability0`, `monitorDiskIo0`, { + list: bytesReadTraceRow.must ? bytesReadTraceRow.dataList : undefined, + offscreen: bytesReadTraceRow.must ? bytesReadTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: bytesReadTraceRow.dpr, + isHover: bytesReadTraceRow.isHover, + hoverX: bytesReadTraceRow.hoverX, + hoverY: bytesReadTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: bytesReadTraceRow.canvasWidth, + canvasHeight: bytesReadTraceRow.canvasHeight, + hoverDiskAbilityStruct: DiskAbilityMonitorStruct.hoverDiskAbilityStruct, + selectDiskAbilityStruct: DiskAbilityMonitorStruct.selectDiskAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: bytesReadTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxDiskRate: maxBytesRead, + maxDiskRateName: maxBytesReadName, + useCache: useCache, + lineColor: bytesReadTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: bytesReadTraceRow.frame, + }, bytesReadTraceRow.must && bytesReadTraceRow.args.isOffScreen ? bytesReadTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + bytesReadTraceRow.must = false; + if (bytesReadTraceRow.args.isOffScreen == true) { + if (bytesReadTraceRow.isHover) { + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_DISK_ABILITY && it.name !== bytesReadTraceRow.name).forEach(it => it.draw(true)); + } + if (bytesReadTraceRow.dataList) bytesReadTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(bytesReadTraceRow) + + let maxBytesWrite = maxList[0].bytesWrite; + let maxBytesWriteName = this.diskIOMath(maxBytesWrite); + let bytesWrittenTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + bytesWrittenTraceRow.rowParentId = `abilityMonitor` + bytesWrittenTraceRow.rowHidden = !processRow.expansion + bytesWrittenTraceRow.rowId = diskIONameList[1] + bytesWrittenTraceRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY + bytesWrittenTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + bytesWrittenTraceRow.selectChangeHandler = this.selectChangeHandler; + bytesWrittenTraceRow.style.height = '40px' + bytesWrittenTraceRow.style.width = `100%`; + bytesWrittenTraceRow.setAttribute('children', ''); + bytesWrittenTraceRow.name = 'Disk ' + diskIONameList[1]; + bytesWrittenTraceRow.supplier = () => queryBytesWrittenAbilityData() + bytesWrittenTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability1`, `monitorDiskIo1`, { + list: bytesWrittenTraceRow.must ? bytesWrittenTraceRow.dataList : undefined, + offscreen: bytesWrittenTraceRow.must ? bytesWrittenTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: bytesWrittenTraceRow.dpr, + isHover: bytesWrittenTraceRow.isHover, + hoverX: bytesWrittenTraceRow.hoverX, + hoverY: bytesWrittenTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: bytesWrittenTraceRow.canvasWidth, + canvasHeight: bytesWrittenTraceRow.canvasHeight, + hoverDiskAbilityStruct: DiskAbilityMonitorStruct.hoverDiskAbilityStruct, + selectDiskAbilityStruct: DiskAbilityMonitorStruct.selectDiskAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: bytesWrittenTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxDiskRate: maxBytesWrite, + maxDiskRateName: maxBytesWriteName, + useCache: useCache, + lineColor: bytesWrittenTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: bytesWrittenTraceRow.frame, + }, bytesWrittenTraceRow.must && bytesWrittenTraceRow.args.isOffScreen ? bytesWrittenTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + bytesWrittenTraceRow.must = false; + if (bytesWrittenTraceRow.args.isOffScreen == true) { + if (bytesWrittenTraceRow.isHover) { + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_DISK_ABILITY && it.name !== bytesWrittenTraceRow.name).forEach(it => it.draw(true)); + } + if (bytesWrittenTraceRow.dataList) bytesWrittenTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(bytesWrittenTraceRow) + + + let maxReadOps = maxList[0].readOps; + let maxReadOpsName = this.diskIOMath(maxReadOps); + let readOpsTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + readOpsTraceRow.rowParentId = `abilityMonitor` + readOpsTraceRow.rowHidden = !processRow.expansion + readOpsTraceRow.rowId = diskIONameList[2] + readOpsTraceRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY + readOpsTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + readOpsTraceRow.selectChangeHandler = this.selectChangeHandler; + readOpsTraceRow.style.height = '40px' + readOpsTraceRow.style.width = `100%`; + readOpsTraceRow.setAttribute('children', ''); + readOpsTraceRow.name = 'Disk ' + diskIONameList[2]; + readOpsTraceRow.supplier = () => queryReadAbilityData() + readOpsTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability2`, `monitorDiskIo2`, { + list: readOpsTraceRow.must ? readOpsTraceRow.dataList : undefined, + offscreen: readOpsTraceRow.must ? readOpsTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: readOpsTraceRow.dpr, + isHover: readOpsTraceRow.isHover, + hoverX: readOpsTraceRow.hoverX, + hoverY: readOpsTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: readOpsTraceRow.canvasWidth, + canvasHeight: readOpsTraceRow.canvasHeight, + hoverDiskAbilityStruct: DiskAbilityMonitorStruct.hoverDiskAbilityStruct, + selectDiskAbilityStruct: DiskAbilityMonitorStruct.selectDiskAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: readOpsTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxDiskRate: maxReadOps, + maxDiskRateName: maxReadOpsName, + useCache: useCache, + lineColor: readOpsTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: readOpsTraceRow.frame, + }, readOpsTraceRow.must && readOpsTraceRow.args.isOffScreen ? readOpsTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + readOpsTraceRow.must = false; + if (readOpsTraceRow.args.isOffScreen == true) { + if (readOpsTraceRow.isHover) { + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_DISK_ABILITY && it.name !== readOpsTraceRow.name).forEach(it => it.draw(true)); + } + if (readOpsTraceRow.dataList) readOpsTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(readOpsTraceRow) + + let maxWriteOps = maxList[0].writeOps; + let maxWriteOpsName = this.diskIOMath(maxWriteOps); + let writtenOpsTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + writtenOpsTraceRow.rowParentId = `abilityMonitor` + writtenOpsTraceRow.rowHidden = !processRow.expansion + writtenOpsTraceRow.rowId = diskIONameList[3] + writtenOpsTraceRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY + writtenOpsTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + writtenOpsTraceRow.selectChangeHandler = this.selectChangeHandler; + writtenOpsTraceRow.style.height = '40px' + writtenOpsTraceRow.style.width = `100%`; + writtenOpsTraceRow.setAttribute('children', ''); + writtenOpsTraceRow.name = 'Disk ' + diskIONameList[3]; + writtenOpsTraceRow.supplier = () => queryWrittenAbilityData() + writtenOpsTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability3`, `monitorDiskIo3`, { + list: writtenOpsTraceRow.must ? writtenOpsTraceRow.dataList : undefined, + offscreen: writtenOpsTraceRow.must ? writtenOpsTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: writtenOpsTraceRow.dpr, + isHover: writtenOpsTraceRow.isHover, + hoverX: writtenOpsTraceRow.hoverX, + hoverY: writtenOpsTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: writtenOpsTraceRow.canvasWidth, + canvasHeight: writtenOpsTraceRow.canvasHeight, + hoverDiskAbilityStruct: DiskAbilityMonitorStruct.hoverDiskAbilityStruct, + selectDiskAbilityStruct: DiskAbilityMonitorStruct.selectDiskAbilityStruct, + wakeupBean: CpuStruct.wakeupBean, + isRangeSelect: writtenOpsTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxDiskRate: maxWriteOps, + maxDiskRateName: maxWriteOpsName, + useCache: useCache, + lineColor: writtenOpsTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: writtenOpsTraceRow.frame, + }, writtenOpsTraceRow.must && writtenOpsTraceRow.args.isOffScreen ? writtenOpsTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + writtenOpsTraceRow.must = false; + if (writtenOpsTraceRow.args.isOffScreen == true) { + if (writtenOpsTraceRow.isHover) { + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_DISK_ABILITY && it.name !== writtenOpsTraceRow.name).forEach(it => it.draw(true)); + } + if (writtenOpsTraceRow.dataList) writtenOpsTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(writtenOpsTraceRow) + } + + private initNetworkAbility = async (processRow: TraceRow) => { + let maxList = await queryNetWorkMaxData(); + let maxBytesIn = maxList[0].maxIn; + let maxInByteName = this.networkMath(maxBytesIn); + let networkNameList: Array = ['Bytes In/Sec', 'Bytes Out/Sec', 'Packets In/Sec', 'Packets Out/Sec'] + let bytesInTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + bytesInTraceRow.rowParentId = `abilityMonitor` + bytesInTraceRow.rowHidden = !processRow.expansion + bytesInTraceRow.rowId = networkNameList[0] + bytesInTraceRow.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY + bytesInTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + bytesInTraceRow.selectChangeHandler = this.selectChangeHandler; + bytesInTraceRow.style.height = '40px' + bytesInTraceRow.style.width = `100%`; + bytesInTraceRow.setAttribute('children', ''); + bytesInTraceRow.name = 'Network ' + networkNameList[0]; + bytesInTraceRow.supplier = () => queryBytesInAbilityData() + bytesInTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability0`, `monitorNetwork0`, { + list: bytesInTraceRow.must ? bytesInTraceRow.dataList : undefined, + offscreen: bytesInTraceRow.must ? bytesInTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: bytesInTraceRow.dpr, + isHover: bytesInTraceRow.isHover, + hoverX: bytesInTraceRow.hoverX, + hoverY: bytesInTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: bytesInTraceRow.canvasWidth, + canvasHeight: bytesInTraceRow.canvasHeight, + hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, + selectNetworkAbilityStruct: NetworkAbilityMonitorStruct.selectNetworkAbilityStruct, + isRangeSelect: bytesInTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxNetworkRate: maxBytesIn, + maxNetworkRateName: maxInByteName, + useCache: useCache, + lineColor: bytesInTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: bytesInTraceRow.frame, + }, bytesInTraceRow.must && bytesInTraceRow.args.isOffScreen ? bytesInTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + bytesInTraceRow.must = false; + if (bytesInTraceRow.args.isOffScreen == true) { + if (bytesInTraceRow.isHover) { + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_NETWORK_ABILITY && it.name !== bytesInTraceRow.name).forEach(it => it.draw(true)); + } + if (bytesInTraceRow.dataList) bytesInTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(bytesInTraceRow) + + let bytesOutTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + let maxBytesOut = maxList[0].maxOut; + let maxOutByteName = this.networkMath(maxBytesOut); + bytesOutTraceRow.rowParentId = `abilityMonitor` + bytesOutTraceRow.rowHidden = !processRow.expansion + bytesOutTraceRow.rowId = networkNameList[1] + bytesOutTraceRow.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY + bytesOutTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + bytesOutTraceRow.selectChangeHandler = this.selectChangeHandler; + bytesOutTraceRow.style.height = '40px' + bytesOutTraceRow.style.width = `100%`; + bytesOutTraceRow.setAttribute('children', ''); + bytesOutTraceRow.name = 'Network ' + networkNameList[1]; + bytesOutTraceRow.supplier = () => queryBytesOutAbilityData(); + bytesOutTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability1`, `monitorNetwork1`, { + list: bytesOutTraceRow.must ? bytesOutTraceRow.dataList : undefined, + offscreen: bytesOutTraceRow.must ? bytesOutTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: bytesOutTraceRow.dpr, + isHover: bytesOutTraceRow.isHover, + hoverX: bytesOutTraceRow.hoverX, + hoverY: bytesOutTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: bytesOutTraceRow.canvasWidth, + canvasHeight: bytesOutTraceRow.canvasHeight, + hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, + selectNetworkAbilityStruct: NetworkAbilityMonitorStruct.selectNetworkAbilityStruct, + isRangeSelect: bytesOutTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxNetworkRate: maxBytesOut, + maxNetworkRateName: maxOutByteName, + useCache: useCache, + lineColor: bytesOutTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: bytesOutTraceRow.frame, + }, bytesOutTraceRow.must && bytesOutTraceRow.args.isOffScreen ? bytesOutTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + bytesOutTraceRow.must = false; + if (bytesOutTraceRow.args.isOffScreen == true) { + if (bytesOutTraceRow.isHover) { + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_NETWORK_ABILITY && it.name !== bytesOutTraceRow.name).forEach(it => it.draw(true)); + } + if (bytesOutTraceRow.dataList) bytesOutTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(bytesOutTraceRow) + + + let packetInTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + let maxPacketIn = maxList[0].maxPacketIn; + let maxInPacketName = this.networkMath(maxPacketIn); + packetInTraceRow.rowParentId = `abilityMonitor` + packetInTraceRow.rowHidden = !processRow.expansion + packetInTraceRow.rowId = networkNameList[2] + packetInTraceRow.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY + packetInTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + packetInTraceRow.selectChangeHandler = this.selectChangeHandler; + packetInTraceRow.style.height = '40px' + packetInTraceRow.style.width = `100%`; + packetInTraceRow.setAttribute('children', ''); + packetInTraceRow.name = 'Network ' + networkNameList[2]; + packetInTraceRow.supplier = () => queryPacketsInAbilityData(); + packetInTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability2`, `monitorNetwork-Packet2`, { + list: packetInTraceRow.must ? packetInTraceRow.dataList : undefined, + offscreen: packetInTraceRow.must ? packetInTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: packetInTraceRow.dpr, + isHover: packetInTraceRow.isHover, + hoverX: packetInTraceRow.hoverX, + hoverY: packetInTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: packetInTraceRow.canvasWidth, + canvasHeight: packetInTraceRow.canvasHeight, + hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, + selectNetworkAbilityStruct: NetworkAbilityMonitorStruct.selectNetworkAbilityStruct, + isRangeSelect: packetInTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxNetworkRate: maxPacketIn, + maxNetworkRateName: maxInPacketName, + useCache: useCache, + lineColor: packetInTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: packetInTraceRow.frame, + }, packetInTraceRow.must && packetInTraceRow.args.isOffScreen ? packetInTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + packetInTraceRow.must = false; + if (packetInTraceRow.args.isOffScreen == true) { + if (packetInTraceRow.isHover) { + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_NETWORK_ABILITY && it.name !== packetInTraceRow.name).forEach(it => it.draw(true)); + } + if (packetInTraceRow.dataList) packetInTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(packetInTraceRow) + + + let packetOutTraceRow = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + let maxPacketOut = maxList[0].maxPacketOut; + let maxOutPacketName = this.networkMath(maxPacketOut); + packetOutTraceRow.rowParentId = `abilityMonitor` + packetOutTraceRow.rowHidden = !processRow.expansion + packetOutTraceRow.rowId = networkNameList[3] + packetOutTraceRow.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY + packetOutTraceRow.favoriteChangeHandler = this.favoriteChangeHandler; + packetOutTraceRow.selectChangeHandler = this.selectChangeHandler; + packetOutTraceRow.style.height = '40px' + packetOutTraceRow.style.width = `100%`; + packetOutTraceRow.setAttribute('children', ''); + packetOutTraceRow.name = 'Network ' + networkNameList[3]; + packetOutTraceRow.supplier = () => queryPacketsOutAbilityData(); + packetOutTraceRow.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`ability3`, `monitorNetwork3`, { + list: packetOutTraceRow.must ? packetOutTraceRow.dataList : undefined, + offscreen: packetOutTraceRow.must ? packetOutTraceRow.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: packetOutTraceRow.dpr, + isHover: packetOutTraceRow.isHover, + hoverX: packetOutTraceRow.hoverX, + hoverY: packetOutTraceRow.hoverY, + flagMoveInfo: this.hoverFlag, + flagSelectedInfo: this.selectFlag, + canvasWidth: packetOutTraceRow.canvasWidth, + canvasHeight: packetOutTraceRow.canvasHeight, + hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, + selectNetworkAbilityStruct: NetworkAbilityMonitorStruct.selectNetworkAbilityStruct, + isRangeSelect: packetOutTraceRow.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + maxNetworkRate: maxPacketOut, + maxNetworkRateName: maxOutPacketName, + useCache: useCache, + lineColor: packetOutTraceRow.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime:TraceRow.range?.slicesTime, + frame: packetOutTraceRow.frame, + }, packetOutTraceRow.must && packetOutTraceRow.args.isOffScreen ? packetOutTraceRow.offscreen[0] : undefined, (res: any, hover: any) => { + packetOutTraceRow.must = false; + if (packetOutTraceRow.args.isOffScreen == true) { + if (packetOutTraceRow.isHover) { + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = hover; + this.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_NETWORK_ABILITY && it.name !== packetOutTraceRow.name).forEach(it => it.draw(true)); + } + if (packetOutTraceRow.dataList) packetOutTraceRow.dataList.length = 0; + return; + } + } + ) + } + this.rowsEL?.appendChild(packetOutTraceRow) + } } diff --git a/host/ide/src/trace/component/SpWelcomePage.ts b/host/ide/src/trace/component/SpWelcomePage.ts index 8da17c7..5b6e57a 100644 --- a/host/ide/src/trace/component/SpWelcomePage.ts +++ b/host/ide/src/trace/component/SpWelcomePage.ts @@ -22,23 +22,22 @@ export class SpWelcomePage extends BaseElement { initHtml(): string { return ` - -
      - -
      + +
      + +
      `; } - } diff --git a/host/ide/src/trace/component/Sptext.ts b/host/ide/src/trace/component/Sptext.ts index f0b089a..93dc08a 100644 --- a/host/ide/src/trace/component/Sptext.ts +++ b/host/ide/src/trace/component/Sptext.ts @@ -29,31 +29,31 @@ export class Sptext extends BaseElement { initHtml(): string { return ` - -
      -
      - - - - -
      -
      `; + +
      +
      + + + + +
      +
      + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/StackBar.ts b/host/ide/src/trace/component/StackBar.ts index 9c9a0b2..26700c1 100644 --- a/host/ide/src/trace/component/StackBar.ts +++ b/host/ide/src/trace/component/StackBar.ts @@ -62,20 +62,21 @@ export class StackBar extends BaseElement { initHtml(): string { return ` - -
      -
      `; + +
      +
      + `; } getStateWidth(state: string): number { diff --git a/host/ide/src/trace/component/hiperf/PerfDataQuery.ts b/host/ide/src/trace/component/hiperf/PerfDataQuery.ts new file mode 100644 index 0000000..00ca0f2 --- /dev/null +++ b/host/ide/src/trace/component/hiperf/PerfDataQuery.ts @@ -0,0 +1,357 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 { + queryPerfCallchains, + queryPerfCallchainsCount, + queryPerfFiles, + queryPerfThread +} from "../../database/SqlLite.js"; +import {PerfCallChain, PerfCallChainMerageData, PerfFile} from "../../bean/PerfProfile.js"; +import {Utils} from "../trace/base/Utils.js"; + +export class PerfDataQuery { + + filesData: any = {} + samplesData: any = {} + threadData: any = {} + callChainData: any = {} + splitMapData: any = {} + currentTreeMapData: any = {} + currentTreeList: any[] = [] + searchValue: string = "" + + async initPerfFiles() { + let files = await queryPerfFiles() + files.forEach((file) => { + this.filesData[file.fileId] = this.filesData[file.fileId] || [] + PerfFile.setFileName(file) + this.filesData[file.fileId].push(file) + }) + let threads = await queryPerfThread() + threads.forEach((thread) => { + this.threadData[thread.tid] = thread + }) + let countRes = await queryPerfCallchainsCount() + if (countRes.length != 0) { + let count: number = (countRes[0] as any).count; + let pageSize = 500000; + let pages = Math.ceil(count / pageSize); + let callChains: any[] = [] + for (let i = 0; i < pages; i++) { + let arr = await queryPerfCallchains(pageSize, i * pageSize); + callChains = callChains.concat(arr) + } + this.initCallChainBottomUp(callChains) + } + } + + initCallChainBottomUp(callChains: PerfCallChain[]) { + callChains.forEach((callChain, index) => { + if (this.threadData[callChain.tid] == undefined) { + return + } + callChain.name = this.setCallChainName(callChain) + this.addGroupData(callChain) + if (index + 1 < callChains.length && callChains[index + 1].callChainId != 0) { + PerfCallChain.setPreviousNode(callChain, callChains[index + 1]) + } + if (callChains.length == index + 1 || callChains[index + 1].callChainId == 0) { + this.addProcessThreadStateData(callChain) + } + }) + } + + setCallChainName(callChain: PerfCallChain): string {//设置调用栈的名称 + if (callChain.symbolId == -1) { + if (this.filesData[callChain.fileId] && this.filesData[callChain.fileId].length > 0) { + callChain.fileName = this.filesData[callChain.fileId][0].fileName + callChain.path = this.filesData[callChain.fileId][0].path + return this.filesData[callChain.fileId][0].fileName + "+0x" + callChain.vaddrInFile + } else { + callChain.fileName = "unkown" + return "+0x" + callChain.vaddrInFile + } + } else { + if (this.filesData[callChain.fileId] && this.filesData[callChain.fileId].length > callChain.symbolId) { + callChain.fileName = this.filesData[callChain.fileId][callChain.symbolId].fileName + callChain.path = this.filesData[callChain.fileId][callChain.symbolId].path + return this.filesData[callChain.fileId][callChain.symbolId].symbol + } else { + callChain.fileName = "unkown" + return "+0x" + callChain.vaddrInFile + } + } + } + + addProcessThreadStateData(callChain: PerfCallChain) {//当调用栈为调用的根节点时 + let threadCallChain = new PerfCallChain()//新增的线程数据 + threadCallChain.depth = 0 + PerfCallChain.merageCallChain(threadCallChain, callChain) + threadCallChain.name = this.threadData[callChain.tid].threadName + "(" + callChain.tid + ")" + let threadStateCallChain = new PerfCallChain()//新增的线程状态数据 + PerfCallChain.merageCallChain(threadStateCallChain, callChain) + threadStateCallChain.name = callChain.threadState || "Unkown State" + threadStateCallChain.fileName = threadStateCallChain.name == "-" ? "Unkown Thead State" : "" + this.addGroupData(threadStateCallChain) + this.addGroupData(threadCallChain) + PerfCallChain.setNextNode(threadCallChain, threadStateCallChain) + PerfCallChain.setNextNode(threadStateCallChain, callChain) + } + + addGroupData(callChain: PerfCallChain) { + this.callChainData[callChain.sampleId] = this.callChainData[callChain.sampleId] || [] + this.callChainData[callChain.sampleId].push(callChain) + } + + getCallChainsBySampleIds(sampleIds: string[], isTopDown: boolean) { + return this.groupNewTreeNoId(sampleIds, isTopDown) + } + + + groupNewTreeNoId(sampleIds: string[], isTopDown: boolean) { + this.currentTreeMapData = {} + this.currentTreeList = [] + for (let i = 0; i < sampleIds.length; i++) { + let callChains = this.callChainData[sampleIds[i]] + let topIndex = isTopDown ? (callChains.length - 1) : 0; + if (callChains.length > 0) { + let root = this.currentTreeMapData[callChains[topIndex].name + callChains[topIndex].pid]; + if (root == undefined) { + root = new PerfCallChainMerageData(); + root.id = Utils.uuid() + this.currentTreeMapData[callChains[topIndex].name + callChains[topIndex].pid] = root; + this.currentTreeList.push(root) + } + PerfCallChainMerageData.merageCallChain(root, callChains[topIndex], isTopDown); + this.merageChildren(root, callChains[topIndex], isTopDown); + } + } + let rootMerageMap: any = {} + Object.values(this.currentTreeMapData).forEach((merageData: any) => { + if (rootMerageMap[merageData.pid] == undefined) { + let processMerageData = new PerfCallChainMerageData()//新增进程的节点数据 + processMerageData.symbolName = this.threadData[merageData.tid].processName + processMerageData.symbol = processMerageData.symbolName + processMerageData.tid = merageData.tid + processMerageData.children.push(merageData) + processMerageData.initChildren.push(merageData) + processMerageData.dur = merageData.dur; + processMerageData.count = merageData.dur; + processMerageData.total = sampleIds.length; + processMerageData.id = Utils.uuid() + rootMerageMap[merageData.pid] = processMerageData + } else { + merageData.parentId = rootMerageMap[merageData.pid].id + rootMerageMap[merageData.pid].children.push(merageData) + rootMerageMap[merageData.pid].initChildren.push(merageData) + rootMerageMap[merageData.pid].dur += merageData.dur; + rootMerageMap[merageData.pid].count += merageData.dur; + rootMerageMap[merageData.pid].total = sampleIds.length; + } + merageData.parentNode = rootMerageMap[merageData.pid]//子节点添加父节点的引用 + }) + this.currentTreeList.forEach((node) => { + node.total = sampleIds.length; + }) + return Object.values(rootMerageMap) + } + + merageChildren(currentNode: PerfCallChainMerageData, callChain: any, isTopDown: boolean) { + let nextNodeKey = isTopDown ? "nextNode" : "previousNode" + if (callChain[nextNodeKey] == undefined) return + let node; + if (currentNode.initChildren.filter((child: PerfCallChainMerageData) => { + if (child.symbolName == callChain[nextNodeKey]?.name) { + node = child; + PerfCallChainMerageData.merageCallChain(child, callChain[nextNodeKey], isTopDown) + return true; + } + return false; + }).length == 0) { + node = new PerfCallChainMerageData() + PerfCallChainMerageData.merageCallChain(node, callChain[nextNodeKey], isTopDown) + node.id = Utils.uuid() + node.parentId = currentNode.id + currentNode.children.push(node) + currentNode.initChildren.push(node) + this.currentTreeList.push(node) + node.parentNode = currentNode + } + if (node) this.merageChildren(node, callChain[nextNodeKey], isTopDown) + } + + //所有的操作都是针对整个树结构的 不区分特定的数据 + splitTree(data: PerfCallChainMerageData[], name: string, isCharge: boolean, isSymbol: boolean) { + data.forEach((process) => { + process.children = [] + if (isCharge) { + this.recursionChargeInitTree(process, name, isSymbol) + } else { + this.recursionPruneInitTree(process, name, isSymbol) + } + }) + this.resetAllNode(data) + } + + recursionChargeInitTree(node: PerfCallChainMerageData, symbolName: string, isSymbol: boolean) { + if ((isSymbol && node.symbolName == symbolName) || (!isSymbol && node.libName == symbolName)) { + (this.splitMapData[symbolName] = this.splitMapData[symbolName] || []).push(node) + node.isStore++; + } + if (node.initChildren.length > 0) { + node.initChildren.forEach((child) => { + this.recursionChargeInitTree(child, symbolName, isSymbol) + }) + } + } + + //symbol lib charge + recursionChargeTree(node: PerfCallChainMerageData, symbolName: string, isSymbol: boolean) { + if ((isSymbol && node.symbolName == symbolName) || (!isSymbol && node.libName == symbolName)) { + node.currentTreeParentNode && node.currentTreeParentNode.children.splice(node.currentTreeParentNode.children.indexOf(node), 1, ...node.children); + node.children.forEach((child) => { + child.currentTreeParentNode = node.currentTreeParentNode + }) + } + if (node.children.length > 0) { + node.children.forEach((child) => { + this.recursionChargeTree(child, symbolName, isSymbol) + }) + } + } + + recursionPruneInitTree(node: PerfCallChainMerageData, symbolName: string, isSymbol: boolean) { + if (isSymbol && node.symbolName == symbolName || (!isSymbol && node.libName == symbolName)) { + (this.splitMapData[symbolName] = this.splitMapData[symbolName] || []).push(node) + node.isStore++; + this.pruneChildren(node, symbolName) + } else if (node.initChildren.length > 0) { + node.initChildren.forEach((child) => { + this.recursionPruneInitTree(child, symbolName, isSymbol) + }) + } + } + + //symbol lib prune + recursionPruneTree(node: PerfCallChainMerageData, symbolName: string, isSymbol: boolean) { + if (isSymbol && node.symbolName == symbolName || (!isSymbol && node.libName == symbolName)) { + node.currentTreeParentNode && node.currentTreeParentNode.children.splice(node.currentTreeParentNode.children.indexOf(node), 1); + } else { + node.children.forEach((child) => { + this.recursionPruneTree(child, symbolName, isSymbol) + }) + } + } + + recursionChargeByRule(node: PerfCallChainMerageData, ruleName: string, rule: (node: PerfCallChainMerageData) => boolean) { + if (node.initChildren.length > 0) { + node.initChildren.forEach((child) => { + if (rule(child)) { + (this.splitMapData[ruleName] = this.splitMapData[ruleName] || []).push(child) + child.isStore++; + } + this.recursionChargeByRule(child, ruleName, rule) + }) + } + } + + pruneChildren(node: PerfCallChainMerageData, symbolName: string) { + if (node.initChildren.length > 0) { + node.initChildren.forEach((child) => { + child.isStore++; + (this.splitMapData[symbolName] = this.splitMapData[symbolName] || []).push(child); + this.pruneChildren(child, symbolName) + }) + } + } + + clearSplitMapData(symbolName: string) { + delete this.splitMapData[symbolName] + } + + resotreAllNode(symbols: string[]) { + symbols.forEach((symbol) => { + let list = this.splitMapData[symbol]; + if (list != undefined) { + list.forEach((item: any) => { + item.isStore-- + }) + } + }) + } + + resetAllNode(data: PerfCallChainMerageData[]) { + this.clearSearchNode() + data.forEach((process)=>{ + process.searchShow = true + }) + this.resetNewAllNode(data) + if (this.searchValue != "") { + this.findSearchNode(data, this.searchValue, false) + this.resetNewAllNode(data) + } + } + + resetNewAllNode(data: PerfCallChainMerageData[]) { + data.forEach((process) => { + process.children = [] + }) + let values = this.currentTreeList.map((item: any) => { + item.children = [] + return item + }) + values.forEach((item: any) => { + if (item.parentNode != undefined) { + if (item.isStore == 0 && item.searchShow) { + let parentNode = item.parentNode + while (parentNode != undefined && !(parentNode.isStore == 0 && parentNode.searchShow)) { + parentNode = parentNode.parentNode + } + if (parentNode) { + item.currentTreeParentNode = parentNode + parentNode.children.push(item) + } + } + } + }) + } + + findSearchNode(data: PerfCallChainMerageData[], search: string, parentSearch: boolean) { + data.forEach((node) => { + if (node.symbol.includes(search) || parentSearch) { + node.searchShow = true + let parentNode = node.currentTreeParentNode + while (parentNode != undefined && !parentNode.searchShow) { + parentNode.searchShow = true + parentNode = parentNode.currentTreeParentNode + } + } else { + node.searchShow = false + } + if (node.children.length > 0) { + this.findSearchNode(node.children, search, node.searchShow) + } + }) + } + + clearSearchNode() { + this.currentTreeList.forEach((node) => { + node.searchShow = true + }) + } +} + +export const perfDataQuery = new PerfDataQuery() diff --git a/host/ide/src/trace/component/hiperf/SpHiPerf.ts b/host/ide/src/trace/component/hiperf/SpHiPerf.ts new file mode 100644 index 0000000..8c3e0ed --- /dev/null +++ b/host/ide/src/trace/component/hiperf/SpHiPerf.ts @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {SpSystemTrace} from "../SpSystemTrace.js"; +import {TraceRow} from "../trace/base/TraceRow.js"; +import {procedurePool} from "../../database/Procedure.js"; +import { + queryHiPerfCpuData, + queryHiPerfCpuMergeData, + queryHiPerfProcessData, + queryHiPerfThreadData, + queryPerfCmdline, + queryPerfThread +} from "../../database/SqlLite.js"; +import {Utils} from "../trace/base/Utils.js"; +import {PerfThread} from "../../bean/PerfProfile.js"; +import {HiPerfCpuStruct} from "../../database/ProcedureWorkerHiPerfCPU.js"; +import {HiPerfThreadStruct} from "../../database/ProcedureWorkerHiPerfThread.js"; +import {HiPerfProcessStruct} from "../../database/ProcedureWorkerHiPerfProcess.js"; +import {PerfDataQuery} from "./PerfDataQuery.js"; + +export interface ResultData { + existA: boolean | null | undefined, + existF: boolean | null | undefined, + fValue: number + +} + +export class SpHiPerf { + static hoverCpuStruct: HiPerfCpuStruct | undefined; + static selectCpuStruct: HiPerfCpuStruct | undefined; + static hoverProcessStruct: HiPerfProcessStruct | undefined; + static selectProcessStruct: HiPerfProcessStruct | undefined; + static hoverThreadStruct: HiPerfThreadStruct | undefined; + static selectThreadStruct: HiPerfThreadStruct | undefined; + static stringResult: ResultData | undefined; + + private cpuData: Array | undefined + public maxCpuId: number = 0 + private rowFolder!: TraceRow; + private perfThreads: Array | undefined; + private trace: SpSystemTrace; + private group: any; + + constructor(trace: SpSystemTrace) { + this.trace = trace; + } + + async init() { + await this.initCmdLine() + this.perfThreads = await queryPerfThread(); + this.group = Utils.groupBy(this.perfThreads || [], "pid"); + this.cpuData = await queryHiPerfCpuMergeData(); + this.maxCpuId = this.cpuData.length > 0 ? this.cpuData.reduce((max, v) => max.cpu_id >= v.cpu_id ? max : v).cpu_id : -Infinity; + if (this.cpuData.length > 0) { + await this.initFolder(); + await this.initCpuMerge(); + await this.initCpu(); + await this.initProcess(); + } + } + + getStringResult(s:string = ""){ + let list = s.split(" ").filter((e) => e); + let sA = list.findIndex((item) => item == "-a"); + let sF = list.findIndex((item) => item == "-f"); + SpHiPerf.stringResult = { + existA: sA!==-1, + existF: sF!==-1, + fValue: Number((1000/(sF!==-1?parseInt(list[sF + 1]):1000)).toFixed(1)), + } + } + + async initCmdLine(){ + let perfCmdLines = await queryPerfCmdline(); + if(perfCmdLines.length > 0){ + this.getStringResult(perfCmdLines[0].report_value) + }else { + SpHiPerf.stringResult = { + existA: true, + existF: false, + fValue: 1, + } + } + } + + async initFolder() { + let row = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + row.setAttribute('disabled-check', '') + row.rowId = `HiPerf`; + row.index = 0; + row.rowType = TraceRow.ROW_TYPE_HIPERF + row.rowParentId = ''; + row.folder = true; + if (SpHiPerf.stringResult?.existA === true) { + row.name = `HiPerf (All)`; + } else { + let names = Reflect.ownKeys(this.group).map((pid: any) => { + let array = this.group[pid] as Array; + let process = array.filter(th => th.pid === th.tid)[0]; + return process.processName; + }).join(','); + row.name = `HiPerf (${names})`; + } + row.supplier = () => new Promise>((resolve) => resolve([])); + row.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`process${row.index}`, `HiPerf-Group`, { + list: row.must ? row.dataList : undefined, + offscreen: !row.isTransferCanvas ? row.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: row.dpr, + isHover: row.isHover, + flagMoveInfo: this.trace.hoverFlag, + flagSelectedInfo: this.trace.selectFlag, + hoverX: row.hoverX, + hoverY: row.hoverY, + canvasWidth: row.canvasWidth, + canvasHeight: row.canvasHeight, + isRangeSelect: row.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: row.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime: TraceRow.range?.slicesTime, + scale: TraceRow.range?.scale || 50, + intervalPerf:SpHiPerf.stringResult?.fValue||1, + frame: row.frame + }, !row.isTransferCanvas ? row.offscreen[0] : undefined, (res: any) => { + row.must = false; + }) + row.isTransferCanvas =true; + } + this.rowFolder = row; + this.trace.rowsEL?.appendChild(row) + } + + async initCpuMerge() { + let row = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + row.rowId = `HiPerf-cpu-merge`; + row.index = 0; + row.rowType = TraceRow.ROW_TYPE_HIPERF_CPU + row.rowParentId = 'HiPerf'; + row.rowHidden = !this.rowFolder.expansion + row.folder = false; + row.name = `HiPerf`; + row.setAttribute('children', '') + row.favoriteChangeHandler = this.trace.favoriteChangeHandler; + row.selectChangeHandler = this.trace.selectChangeHandler; + let that = this; + row.supplier = () => queryHiPerfCpuMergeData(); + row.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`freq${row.index}`, `HiPerf-Cpu-Merge`, { + list: row.must ? row.dataList : undefined, + offscreen: !row.isTransferCanvas ? row.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: row.dpr, + isHover: row.isHover, + flagMoveInfo: this.trace.hoverFlag, + flagSelectedInfo: this.trace.selectFlag, + hoverX: row.hoverX, + hoverY: row.hoverY, + canvasWidth: row.canvasWidth, + canvasHeight: row.canvasHeight, + hoverStruct: SpHiPerf.hoverCpuStruct, + selectStruct: SpHiPerf.selectCpuStruct, + isRangeSelect: row.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: row.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime: TraceRow.range?.slicesTime, + scale: TraceRow.range?.scale || 50, + intervalPerf:SpHiPerf.stringResult?.fValue||1, + frame: row.frame, + maxCpu: (this.maxCpuId + 1) + }, !row.isTransferCanvas ? row.offscreen[0] : undefined, (res: any, hover: any) => { + row.must = false; + if (row.isHover) { + SpHiPerf.hoverCpuStruct = hover; + } + }) + row.isTransferCanvas = true; + } + this.trace.rowsEL?.appendChild(row) + } + + async initCpu() { + for (let i = 0; i <= this.maxCpuId; i++) { + let row = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + row.rowId = `HiPerf-cpu-${i}`; + row.index = i; + row.rowType = TraceRow.ROW_TYPE_HIPERF_CPU + row.rowParentId = 'HiPerf'; + row.rowHidden = !this.rowFolder.expansion + row.folder = false; + row.name = `Cpu ${i}`; + row.setAttribute('children', '') + row.favoriteChangeHandler = this.trace.favoriteChangeHandler; + row.selectChangeHandler = this.trace.selectChangeHandler; + let that = this; + row.supplier = () => queryHiPerfCpuData(i); + row.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`cpu${row.index}`, `HiPerf-Cpu-${i}`, { + list: row.must ? row.dataList : undefined, + offscreen: !row.isTransferCanvas ? row.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: row.dpr, + isHover: row.isHover, + flagMoveInfo: this.trace.hoverFlag, + flagSelectedInfo: this.trace.selectFlag, + hoverX: row.hoverX, + hoverY: row.hoverY, + canvasWidth: row.canvasWidth, + canvasHeight: row.canvasHeight, + hoverStruct: SpHiPerf.hoverCpuStruct, + selectStruct: SpHiPerf.selectCpuStruct, + isRangeSelect: row.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: row.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime: TraceRow.range?.slicesTime, + scale: TraceRow.range?.scale || 50, + intervalPerf:SpHiPerf.stringResult?.fValue||1, + frame: row.frame, + maxCpu: undefined + }, !row.isTransferCanvas ? row.offscreen[0] : undefined, (res: any, hover: any) => { + row.must = false; + if (row.isHover) { + SpHiPerf.hoverCpuStruct = hover; + } + }) + row.isTransferCanvas = true; + } + this.trace.rowsEL?.appendChild(row) + } + } + + async initProcess() { + Reflect.ownKeys(this.group).forEach((key, index) => { + let array = this.group[key] as Array; + let process = array.filter(th => th.pid === th.tid)[0]; + let row = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + row.rowId = `${process.pid}-Perf-Process`; + row.index = index; + row.rowType = TraceRow.ROW_TYPE_HIPERF_PROCESS + row.rowParentId = 'HiPerf'; + row.rowHidden = !this.rowFolder.expansion + row.folder = true; + row.name = `${process.processName} [${process.pid}]`; + row.folderPaddingLeft = 30; + row.favoriteChangeHandler = this.trace.favoriteChangeHandler; + row.selectChangeHandler = this.trace.selectChangeHandler; + let that = this; + row.supplier = () => queryHiPerfProcessData(process.pid); + row.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`process${(row.index) % procedurePool.processLen.length}`, `HiPerf-Process-${row.index}`, { + list: row.must ? row.dataList : undefined, + offscreen: !row.isTransferCanvas ? row.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: row.dpr, + isHover: row.isHover, + flagMoveInfo: this.trace.hoverFlag, + flagSelectedInfo: this.trace.selectFlag, + hoverX: row.hoverX, + hoverY: row.hoverY, + canvasWidth: row.canvasWidth, + canvasHeight: row.canvasHeight, + hoverStruct: SpHiPerf.hoverProcessStruct, + selectStruct: SpHiPerf.selectProcessStruct, + isRangeSelect: row.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: row.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime: TraceRow.range?.slicesTime, + scale: TraceRow.range?.scale || 50, + intervalPerf:SpHiPerf.stringResult?.fValue||1, + frame: row.frame + }, !row.isTransferCanvas ? row.offscreen[0] : undefined, (res: any, hover: any) => { + row.must = false; + if (row.isHover) { + SpHiPerf.hoverProcessStruct = hover; + // this.trace.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_HIPERF_PROCESS && it.name !== row.name).forEach(it => it.draw(true)); + } + }) + row.isTransferCanvas=true; + } + this.trace.rowsEL?.appendChild(row) + + array.forEach((thObj, thIdx) => { + let thread = new TraceRow({ + canvasNumber: 1, + alpha: false, + contextId: '2d', + isOffScreen: SpSystemTrace.isCanvasOffScreen + }); + thread.rowId = `${thObj.tid}-Perf-Thread`; + thread.index = thIdx; + thread.rowType = TraceRow.ROW_TYPE_HIPERF_THREAD + thread.rowParentId = row.rowId; + thread.rowHidden = !row.expansion + thread.folder = false; + thread.name = `${thObj.threadName} [${thObj.tid}]`; + thread.setAttribute('children', '') + thread.folderPaddingLeft = 30; + thread.favoriteChangeHandler = this.trace.favoriteChangeHandler; + thread.selectChangeHandler = this.trace.selectChangeHandler; + let that = this; + thread.supplier = () => queryHiPerfThreadData(thObj.tid); + thread.onThreadHandler = (useCache) => { + procedurePool.submitWithName(`process${(thread.index) % procedurePool.processLen.length}`, `HiPerf-Thread-${row.index}-${thread.index}`, { + list: thread.must ? thread.dataList : undefined, + offscreen: !thread.isTransferCanvas ? thread.offscreen[0] : undefined, + xs: TraceRow.range?.xs, + dpr: thread.dpr, + isHover: thread.isHover, + flagMoveInfo: this.trace.hoverFlag, + flagSelectedInfo: this.trace.selectFlag, + hoverX: thread.hoverX, + hoverY: thread.hoverY, + canvasWidth: thread.canvasWidth, + canvasHeight: thread.canvasHeight, + hoverStruct: SpHiPerf.hoverThreadStruct, + selectStruct: SpHiPerf.selectThreadStruct, + isRangeSelect: thread.rangeSelect, + rangeSelectObject: TraceRow.rangeSelectObject, + useCache: useCache, + lineColor: thread.getLineColor(), + startNS: TraceRow.range?.startNS || 0, + endNS: TraceRow.range?.endNS || 0, + totalNS: TraceRow.range?.totalNS || 0, + slicesTime: TraceRow.range?.slicesTime, + scale: TraceRow.range?.scale || 50, + intervalPerf:SpHiPerf.stringResult?.fValue||1, + frame: thread.frame + }, !thread.isTransferCanvas ? thread.offscreen[0] : undefined, (res: any, hover: any) => { + thread.must = false; + if (thread.isHover) { + SpHiPerf.hoverThreadStruct = hover; + } + }) + thread.isTransferCanvas=true; + } + this.trace.rowsEL?.appendChild(thread) + }); + }) + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/metrics/CpuStrategy.ts b/host/ide/src/trace/component/metrics/CpuStrategy.ts new file mode 100644 index 0000000..681ee1b --- /dev/null +++ b/host/ide/src/trace/component/metrics/CpuStrategy.ts @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initTest = (metricData: Array): ProcessInfoListItem => { + let processInfoListItems: Array = []; + for (let index = 0; index < metricData.length; index++) { + let eventName = metricData[index].event_name; + let stat_type = metricData[index].stat_type; + let count = metricData[index].count; + let source = metricData[index].source; + let serverity = metricData[index].serverity; + + let processInfoSource: ProcessInfoItem = { + // @ts-ignore + processName: eventName, + threads: { + // @ts-ignore + threadName: stat_type, + cpu: [{ + cpu: eventName, + minFreq: stat_type, + maxFreq: count, + avgFrequency: source, + duration: serverity, + }], + } + } + processInfoListItems?.push(processInfoSource) + } + return { + processInfo: processInfoListItems + } +} + +export const initCpuStrategyData = (metricData: Array): ProcessInfoListItem => { + let processInfoListItems: Array = []; + if (metricData.length == 10) { + + } else { + + } + const splitChar: string = ',' + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + if (metricData[sqlIndex].avg_frequency == null) { + continue + } + let cpus = metricData[sqlIndex].cpu.split(splitChar); + let minFrequencies = metricData[sqlIndex].min_freq.split(splitChar); + let maxFrequencies = metricData[sqlIndex].max_freq.split(splitChar); + let avgFrequencies = metricData[sqlIndex].avg_frequency.split(splitChar); + let durations = metricData[sqlIndex].duration.split(splitChar); + + let arrayCpu = []; + for (let index = 0; index < cpus.length; index++) { + let cpuIndex: CpuItem = { + cpu: cpus[index], + minFreq: minFrequencies[index], + maxFreq: maxFrequencies[index], + avgFrequency: avgFrequencies[index], + duration: durations[index], + } + arrayCpu.push(cpuIndex); + } + let processInfoSource: ProcessInfoItem = { + processName: metricData[sqlIndex].process_name, + threads: { + threadName: metricData[sqlIndex].thread_name, + cpu: arrayCpu, + } + } + processInfoListItems?.push(processInfoSource) + } + return { + processInfo: processInfoListItems + }; +} + +export interface ProcessInfoListItem { + processInfo: Array +} + +export interface ProcessInfoItem { + processName: string; + threads: ThreadsItem; +} + +export interface ThreadsItem { + threadName: string; + cpu: Array; +} + +export interface CpuItem { + cpu: string; + minFreq: string; + maxFreq: string; + avgFrequency: string; + duration: string; +} diff --git a/host/ide/src/trace/component/metrics/DistributeTermStrategy.ts b/host/ide/src/trace/component/metrics/DistributeTermStrategy.ts new file mode 100644 index 0000000..1fbded8 --- /dev/null +++ b/host/ide/src/trace/component/metrics/DistributeTermStrategy.ts @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initDistributedTermData = (metricData: Array): DistributedTermListItem => { + let distributedTermListItems: Array = [] + const splitChar = ',' + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let threadIdsList = metricData[sqlIndex].threadId.split(splitChar); + let threadNamesList = metricData[sqlIndex].threadName.split(splitChar); + let processIdList = metricData[sqlIndex].processId.split(splitChar); + let processNameList = metricData[sqlIndex].processName === null ? threadIdsList.length + '' : metricData[sqlIndex].processName.split(splitChar); + + let funNameList = metricData[sqlIndex].funName.split(splitChar); + let timeList = metricData[sqlIndex].ts.split(splitChar); + let durList = metricData[sqlIndex].dur.split(splitChar); + let flag = metricData[sqlIndex].flag; + let flagList = flag.split(splitChar); + let traceNameList = metricData[sqlIndex].trace_name; + let chainIdList = metricData[sqlIndex].chainId; + let spanIdList = metricData[sqlIndex].spanId; + let parentSpanIdList = metricData[sqlIndex].parentSpanId; + + let distributedTermListItem: DistributedTermItem = {} + for (let index = 0; index < flagList.length; index++) { + let across: boolean = true; + let receiverTime: number = 0; + let senderTime: number = 0; + let delay: number = 0; + if (flag.indexOf('S,C') > -1 || flag.indexOf('C,S') > -1) { + across = false; + if (flagList[index] == 'S') receiverTime = timeList[index] + if (flagList[index] == 'C') senderTime = timeList[index] + delay = receiverTime - senderTime; + } + + let type = { + acrossTheDevice: across, + traceName: traceNameList, + traceId: { + chainID: chainIdList, + spanID: spanIdList, + parentSpanID: parentSpanIdList, + }, + functionName: funNameList[index], + processInfo: { + processId: processIdList[index], + processName: processNameList[index], + }, + threadInfoItem: { + threadId: threadIdsList[index], + threadName: threadNamesList[index], + }, + dur: durList[index], + delay: delay, + } + if ("C" == flagList[index]) { + distributedTermListItem.sender = type + } else { + distributedTermListItem.receiver = type + } + } + distributedTermListItems?.push(distributedTermListItem) + } + return { + distributedTermItem: distributedTermListItems + } +} + +export interface DistributedTermListItem { + distributedTermItem: Array +} + +export interface DistributedTermItem { + sender?: SenderOrReceiverItem; + receiver?: SenderOrReceiverItem; +} + +export interface SenderOrReceiverItem { + acrossTheDevice?: boolean + traceName: string + traceId: TraceIdItem + functionName: string + processInfo: ProcessInfoItem + threadInfoItem: ThreadInfoItem + dur: string + delay: number +} + +export interface TraceIdItem { + chainID: string + spanID: string + parentSpanID: string +} + +export interface ProcessInfoItem { + processId: string + processName: string +} + +export interface ThreadInfoItem { + threadId: string + threadName: string +} diff --git a/host/ide/src/trace/component/metrics/MemAggStrategy.ts b/host/ide/src/trace/component/metrics/MemAggStrategy.ts new file mode 100644 index 0000000..62bc7a1 --- /dev/null +++ b/host/ide/src/trace/component/metrics/MemAggStrategy.ts @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initMemoryAggStrategy = (metricData: Array): ProcessValuesListItem => { + let processValuesListItems: Array = [] + const splitChar: string = ',' + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let processNames = metricData[sqlIndex].processName; + let names = metricData[sqlIndex].name.split(splitChar); + let values = metricData[sqlIndex].value.split(splitChar); + let times = metricData[sqlIndex].ts.split(splitChar); + let arrayMem = []; + let oomScoreValue = 0; + for (let indexScore = 0; indexScore < names.length; indexScore++) { + if ("oom_score_adj" === names[indexScore]) { + oomScoreValue = values[indexScore]; + break; + } + } + let processInfoSource: ProcessValuesItem = { + processName: processNames, + } + for (let index = 0; index < names.length; index++) { + let typeItem: TypeItem = { + ts: times[index], + oom_score: oomScoreValue, + value: values[index], + } + if (!processInfoSource) continue + if ("mem.rss.anon" === names[index]) { + processInfoSource.anonRss = typeItem + } + if ("mem.swap" === names[index]) { + processInfoSource.swap = typeItem + } + if ("mem.rss.file" === names[index]) { + processInfoSource.fileRss = typeItem + } + if ("oom_score_adj" === names[index]) { + processInfoSource.anonAndSwap = typeItem + } + } + processValuesListItems?.push(processInfoSource) + } + return { + processValues: processValuesListItems + } +} + +export interface ProcessValuesListItem { + processValues: Array +} + +export interface ProcessValuesItem { + processName: string; + anonRss?: TypeItem; + swap?: TypeItem; + fileRss?: TypeItem; + anonAndSwap?: TypeItem; +} + +export interface TypeItem { + ts: number; + oom_score: number; + value: number; +} diff --git a/host/ide/src/trace/component/metrics/MemStrategy.ts b/host/ide/src/trace/component/metrics/MemStrategy.ts new file mode 100644 index 0000000..f1f1edc --- /dev/null +++ b/host/ide/src/trace/component/metrics/MemStrategy.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initMemoryStrategy = (metricData: Array): ProcessMetricsListItems => { + let processMetricsListItems: Array = [] + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let processName = metricData[sqlIndex].processName; + let minNum = metricData[sqlIndex].minNum; + let maxNum = metricData[sqlIndex].maxNum; + let avgNum = metricData[sqlIndex].avgNum; + let processInfoSource: ProcessMetricsItems = { + processName: processName, + overallCounters: { + anonRss: { + min: minNum, + max: maxNum, + avg: avgNum, + } + } + } + processMetricsListItems?.push(processInfoSource); + } + return { + processMetrics: processMetricsListItems + } +} + +export interface ProcessMetricsListItems { + processMetrics: Array +} + +export interface ProcessMetricsItems { + processName: string + overallCounters: AnonRssItem +} + +export interface AnonRssItem { + anonRss: TypeItem +} + +export interface TypeItem { + min: number + max: number + avg: number +} diff --git a/host/ide/src/trace/component/metrics/MetaDataStrategy.ts b/host/ide/src/trace/component/metrics/MetaDataStrategy.ts new file mode 100644 index 0000000..cde73df --- /dev/null +++ b/host/ide/src/trace/component/metrics/MetaDataStrategy.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initMetaDataStrategy = (metricData: Array): TraceMetadata => { + let traceMetaDataList: Array = [] + let statDataArray = []; + let jsonText = `{`; + for (let index = 0; index < metricData.length; index++) { + let name = metricData[index].name; + let value = metricData[index].valueText; + if (!value.match('^-?\\d+$')) { + value = "\"" + value.replace('\r|\n', '') + '\"' + } + jsonText += `'` + name + `'` + `: ` + `'` + value.toString() + `'` + `,`; + if (index >= metricData.length - 1) { + jsonText += `}`; + } + } + + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let name = metricData[sqlIndex].name; + let value = metricData[sqlIndex].valueText; + if (!value.match('^-?\\d+$')) { + value = "\"" + value.replace('\r|\n', '') + '\"' + } + let traceMetaData = { + name: name, + value: value + } + traceMetaDataList?.push(traceMetaData); + } + return { + traceMetadata: traceMetaDataList + } +} + +export interface TraceMetadata { + traceMetadata: Array +} + +export interface TraceMetadataItem { + name: string + value: string +} + diff --git a/host/ide/src/trace/component/metrics/SysCallsStrategy.ts b/host/ide/src/trace/component/metrics/SysCallsStrategy.ts new file mode 100644 index 0000000..f7c3a8c --- /dev/null +++ b/host/ide/src/trace/component/metrics/SysCallsStrategy.ts @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initSysCallsStrategy = (metricData: Array): FunctionListItem => { + let functionListItems: Array = [] + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let functionNames = metricData[sqlIndex].funName; + let durMaxes = metricData[sqlIndex].maxDur; + let durMines = metricData[sqlIndex].minDur; + let durAvgs = metricData[sqlIndex].avgDur; + let functionItem: FunctionItem = { + functionName: functionNames, + durMax: durMaxes, + durMin: durMines, + durAvg: durAvgs, + } + functionListItems?.push(functionItem) + } + return { + function: functionListItems + } +} + +export interface FunctionListItem { + function: Array +} + +export interface FunctionItem { + functionName: string + durMax: string + durMin: string + durAvg: string +} diff --git a/host/ide/src/trace/component/metrics/SysCallsTopStrategy.ts b/host/ide/src/trace/component/metrics/SysCallsTopStrategy.ts new file mode 100644 index 0000000..cf824d8 --- /dev/null +++ b/host/ide/src/trace/component/metrics/SysCallsTopStrategy.ts @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initSysCallsTopStrategy = (metricData: Array): ProcessInfoListItem => { + let ProcessInfoListItems: Array = [] + + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let processNameList = metricData[sqlIndex].process_name; + let pidList = metricData[sqlIndex].pid; + let threadNameList = metricData[sqlIndex].ThreadName; + let tidList = metricData[sqlIndex].tid; + let functionNames = metricData[sqlIndex].funName; + let durMaxes = metricData[sqlIndex].maxDur; + let durMines = metricData[sqlIndex].minDur; + let durAvgs = metricData[sqlIndex].avgDur; + + let processInfoItem: ProcessInfoItem = { + name: processNameList, + pid: pidList, + threads: { + name: threadNameList, + tid: tidList, + function: { + functionName: functionNames, + durMax: durMaxes, + durMin: durMines, + durAvg: durAvgs, + }, + }, + } + ProcessInfoListItems?.push(processInfoItem) + } + return { + processInfo: ProcessInfoListItems + } +} + +export interface ProcessInfoListItem { + processInfo: Array +} + +export interface ProcessInfoItem { + name: string + pid: string + threads: ThreadsItem +} + + +export interface ThreadsItem { + name: string + tid: string + function: FunctionItem +} + +export interface FunctionItem { + functionName: string + durMax: string + durMin: string + durAvg: string +} diff --git a/host/ide/src/trace/component/metrics/TraceStatsStrategy.ts b/host/ide/src/trace/component/metrics/TraceStatsStrategy.ts new file mode 100644 index 0000000..3d3dddb --- /dev/null +++ b/host/ide/src/trace/component/metrics/TraceStatsStrategy.ts @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initTraceStateStrategy = (metricData: Array): StatListItem => { + let statListItems: Array = [] + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let names = metricData[sqlIndex].event_name; + let counts = metricData[sqlIndex].count; + let sources = metricData[sqlIndex].source; + let severities = metricData[sqlIndex].serverity; + let statListItem: StatItem = { + name: names, + count: counts, + source: sources, + severity: severities + } + statListItems?.push(statListItem) + } + return { + stat: statListItems + } +} + +export interface StatListItem { + stat: Array +} + +export interface StatItem { + name: string + count: string + source: string + severity: string +} diff --git a/host/ide/src/trace/component/metrics/TraceTaskStrategy.ts b/host/ide/src/trace/component/metrics/TraceTaskStrategy.ts new file mode 100644 index 0000000..9703590 --- /dev/null +++ b/host/ide/src/trace/component/metrics/TraceTaskStrategy.ts @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +export const initTraceTaskStrategy = (metricData: Array): ProcessListItem => { + let statListItems: Array = [] + for (let sqlIndex = 0; sqlIndex < metricData.length; sqlIndex++) { + let pidList = metricData[sqlIndex].pid; + let processNameList = metricData[sqlIndex].process_name; + let threadNameList = metricData[sqlIndex].thread_name; + let value = '' + if (threadNameList !== null) { + let threadNames = threadNameList.split(',') + for (const valueKey in threadNames) { + value = '\"' + valueKey + '\"' + } + } + let statListItem: ProcessItem = { + pid: pidList, + processName: processNameList, + threadName: value + } + statListItems?.push(statListItem) + } + return { + process: statListItems + } +} + +export interface ProcessListItem { + process: Array +} + +export interface ProcessItem { + pid: string + processName: string + threadName: string +} diff --git a/host/ide/src/trace/component/setting/SpAllocations.ts b/host/ide/src/trace/component/setting/SpAllocations.ts index 9763ea0..2a7e1ca 100644 --- a/host/ide/src/trace/component/setting/SpAllocations.ts +++ b/host/ide/src/trace/component/setting/SpAllocations.ts @@ -60,131 +60,132 @@ export class SpAllocations extends BaseElement { initHtml(): string { return ` - -
      -
      - Allocations -
      -
      - ProcessId or ProcessName : - -
      -
      - Max unwind level : - -
      -
      - Shared Memory Size (Must be a multiple of 4 KB) : -
      - - -
      -
      -
      - Filter Memory Size : -
      - - -
      -
      -
      `; + .font-style{ + font-family: Helvetica-Bold; + font-size: 1em; + color: var(--dark-color1,#000000); + line-height: 28px; + font-weight: 700; + } + .inner-font-style { + font-family: Helvetica,serif; + font-size: 1em; + color: var(--dark-color1,#000000); + text-align: left; + line-height: 20px; + font-weight: 400; + } + input { + width: 72%; + height: 25px; + border:0; + outline:none; + border-radius: 16px; + text-indent:2% + } + input::-webkit-input-placeholder{ + color:var(--bark-prompt,#999999); + } + .select { + height: 30px; + border:0; + border-radius: 3px; + outline:none; + border: 1px solid var(--dark-border,#B3B3B3); + width: 60px; + background-color:var(--dark-background5, #FFFFFF) + font-family: Helvetica; + font-size: 14px; + color:var(--dark-color,#212121) + text-align: center; + line-height: 16px; + font-weight: 400; + border-radius: 16px; + } + .application{ + display: flex; + flex-direction: column; + grid-gap: 15px; + margin-top: 40px; + } + .inputstyle{ + background: var(--dark-background5,#FFFFFF); + border: 1px solid var(--dark-background5,#999999); + font-family: Helvetica; + font-size: 14px; + color: var(--dark-color1,#212121); + text-align: left; + line-height: 16px; + font-weight: 400; + } + .inputstyle::-webkit-input-placeholder { + background: var(--dark-background5,#FFFFFF); + } + #one_mb{ + background-color:var(--dark-background5, #FFFFFF) + } + #one_kb{ + background-color:var(--dark-background5, #FFFFFF) + } + #two_mb{ + background-color:var(--dark-background5, #FFFFFF) + } + #two_kb{ + background-color:var(--dark-background5, #FFFFFF) + } + +
      +
      + Native Memory +
      +
      + ProcessId or ProcessName : + +
      +
      + Max unwind level : + +
      +
      + Shared Memory Size (Must be a multiple of 4 KB) : +
      + + +
      +
      +
      + Filter Memory Size : +
      + + +
      +
      +
      + `; } private convertToValue(input: string, unit: string): number { @@ -205,4 +206,4 @@ input::-webkit-input-placeholder{ } return parseInt(String(number)); } -} +} \ No newline at end of file diff --git a/host/ide/src/trace/component/setting/SpProbesConfig.ts b/host/ide/src/trace/component/setting/SpProbesConfig.ts index a2af05c..2d9f51d 100644 --- a/host/ide/src/trace/component/setting/SpProbesConfig.ts +++ b/host/ide/src/trace/component/setting/SpProbesConfig.ts @@ -95,7 +95,11 @@ export class SpProbesConfig extends BaseElement { + " enabled by other probes." } , {value: "Syscalls", isSelect: false, des: "Tracks the enter and exit of all syscalls"} - , {value: "FPS", isSelect: false, des: "Tracks the FPS"}] + , {value: "FPS", isSelect: false, des: "Tracks the FPS"}, { + value: "AbilityMonitor", + isSelect: false, + des: "Tracks the AbilityMonitor" + }] this._traceConfig = this.shadowRoot?.querySelector(".trace-config") as HTMLElement this.traceConfigList.forEach(configBean => { let checkDesBox = new SpCheckDesBox(); @@ -155,96 +159,98 @@ export class SpProbesConfig extends BaseElement { initHtml(): string { return ` - -
      -
      Record mode
      -
      -
      -
      -
      - -
      - -
      -
      -
      -
      -
      - Memory Config + #hitrace-cat{ + display: grid; + grid-template-columns: 1fr 1fr; + } + .user-events{ + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: 10px; + margin-left: 15px;; + } + +
      +
      Record mode
      +
      +
      +
      +
      + + +
      + +
      +
      +
      +
      +
      + Memory Config +
      +
      -
      -
      `; + `; } //当 custom element首次被插入文档DOM时,被调用。 diff --git a/host/ide/src/trace/component/setting/SpRecordPerf.ts b/host/ide/src/trace/component/setting/SpRecordPerf.ts new file mode 100644 index 0000000..0abdadd --- /dev/null +++ b/host/ide/src/trace/component/setting/SpRecordPerf.ts @@ -0,0 +1,589 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../base-ui/BaseElement.js"; +import {LitSelect} from "../../../base-ui/select/LitSelect.js"; +import {LitSlider} from "../../../base-ui/slider/LitSlider.js"; +import LitSwitch from "../../../base-ui/switch/lit-switch.js"; +import "../../../base-ui/switch/lit-switch.js"; + +@element("sp-record-perf") +export class SpRecordPerf extends BaseElement { + private addOptionButton: HTMLButtonElement | undefined | null; + private processSelect: LitSelect | undefined | null; + private frequencySetInput: HTMLInputElement | undefined | null; + private offCPUSwitch: LitSwitch | undefined | null; + private callSelect: LitSelect | undefined | null; + private configList: Array = []; + + get show(): boolean { + return this.hasAttribute("show"); + } + + set show(show: boolean) { + if (show) { + this.setAttribute("show", ""); + } else { + this.removeAttribute("show") + } + } + + set startSamp(start: boolean) { + if (start) { + this.setAttribute("startSamp", ""); + } else { + this.removeAttribute("startSamp") + } + } + + get startSamp(): boolean { + return this.hasAttribute("startSamp"); + } + + getPerfConfig(): PerfConfig | undefined { + let configVal = this.shadowRoot?.querySelectorAll(".config"); + let perfConfig: PerfConfig = { + process:"ALL", + cpu: "select ALL", + eventList: "NONE", + cpuPercent: 100, + frequency: 1000, + period: 1, + isOffCpu: false, + noInherit: false, + callStack: "none", + branch: "none", + mmap: 256, + clockType: "monotonic" + } + configVal!.forEach(value => { + switch (value.title) { + case "Process": + let processSelect = value as LitSelect; + if (processSelect.value.length > 0) { + perfConfig.process = processSelect.value + } + break; + case "CPU": + let selectV = value as LitSelect; + if (selectV.value.length > 0) { + perfConfig.cpu = selectV.value + } + break; + case "Event List": + let selectList = value as LitSelect; + if (selectList.value.length > 0) { + perfConfig.eventList = selectList.value; + } + break; + case "CPU Percent": + let selectSlider = value as LitSlider; + let parEle = value.parentElement; + if (parEle!.hasAttribute("percent")) { + let percent = parEle!.getAttribute("percent"); + perfConfig.cpuPercent = Number(percent); + } + break; + case "Frequency": + let input = value as HTMLInputElement; + if (input.value != "") { + perfConfig.frequency = Number(input.value); + } + break; + case "Period": + let periodInput = value as HTMLInputElement; + if (periodInput.value != "") { + perfConfig.period = Number(periodInput.value); + } + break; + case "Is Off CPU": + let cpuImage = value as LitSwitch; + perfConfig.isOffCpu = cpuImage.checked; + break; + case "No Inherit": + let InheritImage = value as LitSwitch; + perfConfig.noInherit = InheritImage.checked; + break; + case "Call Stack": + let callStack = value as LitSelect; + if (callStack.value != "") { + perfConfig.callStack = callStack.value; + } + break; + case "Branch": + let branch = value as LitSelect; + if (branch.value != "") { + perfConfig.branch = branch.value; + } + break; + case "Mmap Pages": + let pages = value as LitSlider; + let parent = value.parentElement; + if (parent!.hasAttribute("percent")) { + let pagesPercent = parent!.getAttribute("percent"); + perfConfig.mmap = Math.pow(2, Number(pagesPercent)); + } + break; + case "Clock Type": + let clock = value as LitSelect; + if (clock.value != "") { + perfConfig.clockType = clock.value; + } + break; + } + }) + return perfConfig; + } + + initElements(): void { + this.initConfigList(); + let configList = this.shadowRoot?.querySelector(".configList"); + this.addOptionButton = this.shadowRoot?.querySelector("#addOptions"); + this.configList.forEach(config => { + let div = document.createElement("div") + if (config.hidden) { + div.className = "config-div hidden"; + } else { + div.className = "config-div"; + } + let headDiv = document.createElement("div") + div.appendChild(headDiv); + let title = document.createElement("span") + title.className = "title" + title.textContent = config.title + headDiv.appendChild(title) + let des = document.createElement("span") + des.textContent = config.des + des.className = "des" + headDiv.appendChild(des); + switch (config.type) { + case "select-multiple": + let html = ''; + html += `` + config.selectArray.forEach((value: string) => { + html += `${value}` + }) + html += `` + div.innerHTML = div.innerHTML + html; + break; + case "lit-slider": + let silder = `
      + +
      ` + div.innerHTML = div.innerHTML + silder; + let litSlider = div.querySelector(".silderclass"); + litSlider!.percent = config.litSliderStyle.defaultValue + let sliderBody = div.querySelector(".sliderBody"); + let bufferInput = div?.querySelector('.sliderInput') as HTMLInputElement; + litSlider!.addEventListener('input', evt => { + bufferInput.value = sliderBody!.getAttribute("percent") + config.litSliderStyle.resultUnit; + }) + litSlider!.sliderStyle = config.litSliderStyle; + break; + case "Mmap-lit-slider": + let defaultValue = Math.pow(2,config.litSliderStyle.defaultValue); + let mapsilder = `
      + +
      ` + div.innerHTML = div.innerHTML + mapsilder; + let maplitSlider = div.querySelector(".silderclass"); + maplitSlider!.percent = config.litSliderStyle.defaultValue + let mapsliderBody = div.querySelector(".sliderBody"); + let mapbufferInput = div?.querySelector('.sliderInput') as HTMLInputElement; + maplitSlider!.addEventListener('input', evt => { + let percnet = mapsliderBody!.getAttribute("percent") ; + if(percnet != null) { + mapbufferInput.value = Math.pow(2,Number(percnet)) + config.litSliderStyle.resultUnit; + } + }) + maplitSlider!.sliderStyle = config.litSliderStyle; + break; + case "input": + let input = document.createElement("input"); + input.className = "input config"; + input.textContent = config.value; + input.value = config.value; + input.title = config.title; + div.appendChild(input); + break; + case "select": + let html1 = ''; + html1 += `` + config.selectArray.forEach((value: string) => { + html1 += `${value}` + }) + html1 += `` + div.innerHTML = div.innerHTML + html1; + break; + case "switch": + let switch1 = document.createElement("lit-switch") as LitSwitch; + switch1.className = "config" + switch1.title = config.title; + if (config.value) { + switch1.checked = true; + } else { + switch1.checked = false; + } + if (config.title == "Is Start Hiperf Sampling") { + switch1.addEventListener("change", (event: any) => { + let detail = event.detail; + if (detail.checked) { + this.startSamp = true; + this.unDisable(); + } else { + this.startSamp = false; + this.addOptionButton!.style.display = "unset"; + this.disable(); + this.show = false; + } + }) + } + headDiv.appendChild(switch1); + break; + default: + break; + } + configList!.appendChild(div); + }) + this.processSelect = this.shadowRoot?.querySelector("lit-select[title='Process']"); + this.frequencySetInput = this.shadowRoot?.querySelector("input[title='Frequency']"); + this.offCPUSwitch = this.shadowRoot?.querySelector("lit-switch[title='Is Off CPU']"); + this.callSelect = this.shadowRoot?.querySelector("lit-select[title='Call Stack']"); + this.addOptionButton!.addEventListener("click", (event) => { + if (!this.startSamp) { + return; + } + this.addOptionButton!.style.display = "none"; + this.show = true; + }); + this.disable(); + } + + private unDisable() { + if (this.processSelect) { + this.processSelect.removeAttribute("disabled"); + } + if (this.frequencySetInput) { + this.frequencySetInput!.disabled = false; + } + if (this.offCPUSwitch) { + this.offCPUSwitch!.disabled = false; + } + if (this.callSelect) { + this.callSelect!.removeAttribute("disabled"); + } + if (this.addOptionButton) { + this.addOptionButton.disabled = false; + } + } + + private disable() { + if (this.processSelect) { + this.processSelect.setAttribute("disabled", ''); + } + if (this.frequencySetInput) { + this.frequencySetInput!.disabled = true; + } + if (this.offCPUSwitch) { + this.offCPUSwitch!.disabled = true; + } + if (this.callSelect) { + this.callSelect!.setAttribute("disabled", ''); + } + if (this.addOptionButton) { + this.addOptionButton.disabled = true; + } + } + + initConfigList(): void { + this.configList = [ + { + title: "Is Start Hiperf Sampling", + des: "", + hidden: false, + type: "switch", + value: false + }, + { + title: "Process", + des: "Record process", + hidden: false, + type: "select-multiple", + selectArray: [ + "ALL-Process" + ] + }, + { + title: "CPU", + des: "Record assign cpu num such as 0,1,2", + hidden: true, + type: "select-multiple", + selectArray: [ + "ALL-CPU" + ] + }, { + title: "Event List", + des: "Event type Default is cpu cycles", + hidden: true, + type: "select-multiple", + selectArray: [ + "NONE" + ] + }, { + title: "CPU Percent", + des: "Set the max percent of cpu time used for recording", + hidden: true, + type: "lit-slider", + litSliderStyle: { + minRange: 0, + maxRange: 100, + defaultValue: '100', + resultUnit: "%", + stepSize: 1, + lineColor: "var(--dark-color3,#a88888)", + buttonColor: "#a88888" + } + }, + { + title: "Frequency", + des: "Set event sampling frequency", + hidden: false, + type: "input", + value: "1000" + }, + { + title: "Period", + des: "Set event sampling period for trace point events2", + hidden: true, + type: "input", + value: "1" + }, + { + title: "Is Off CPU", + des: "Trace when threads are scheduled off cpu", + hidden: false, + type: "switch", + value: false + }, + { + title: "No Inherit", + des: "Don't trace child processes", + hidden: true, + type: "switch", + value: false + }, + { + title: "Call Stack", + des: "Setup and enable call stack recording", + hidden: false, + type: "select", + selectArray: ["none", "fp", "dwarf"] + }, + { + title: "Branch", + des: "Taken branch stack sampling", + hidden: true, + type: "select", + selectArray: ["none", "any", "any_call", "any_ret", "ind_call", "call", "user", "kernel"] + }, + { + title: "Mmap Pages", + des: "Used to receiving record data from kernel", + hidden: true, + type: "Mmap-lit-slider", + litSliderStyle: { + minRange: 1, + maxRange: 10, + defaultValue: "8", + resultUnit: "MB", + stepSize: 1, + lineColor: "var(--dark-color3,#46B1E3)", + buttonColor: "#999999" + } + }, + { + title: "Clock Type", + des: "Set the clock id to use for the various time fields in the perf_event_type records", + hidden: true, + type: "select", + selectArray: ["monotonic", "monotonic_raw", "realtime", "boottime", "perf"] + }, + ] + } + + initHtml(): string { + return ` + +
      +
      +
      + +
      + `; + } +} + +export interface PerfConfig { + process:string; + cpu: string; + eventList: string; + cpuPercent: number; + frequency: number; + period: number; + isOffCpu: boolean; + noInherit: boolean; + callStack: string; + branch: string; + mmap: number; + clockType: string; +} diff --git a/host/ide/src/trace/component/setting/SpRecordSetting.ts b/host/ide/src/trace/component/setting/SpRecordSetting.ts index 9db5328..63fc5fe 100644 --- a/host/ide/src/trace/component/setting/SpRecordSetting.ts +++ b/host/ide/src/trace/component/setting/SpRecordSetting.ts @@ -18,12 +18,15 @@ import "../../../base-ui/radiobox/LitRadioBox.js"; import {LitRadioBox} from "../../../base-ui/radiobox/LitRadioBox.js"; import "../../../base-ui/slider/LitSlider.js"; import {LitSlider} from "../../../base-ui/slider/LitSlider.js"; +import "../../../base-ui/popover/LitPopover.js" @element('record-setting') export class SpRecordSetting extends BaseElement { private memoryBufferSlider: LitSlider | undefined; private maxDurationSliders: LitSlider | undefined; private radioBox: LitRadioBox | undefined + private bufferNumber: HTMLElement | undefined + private durationNumber: HTMLElement | undefined get recordMod(): boolean { if (this.radioBox) { @@ -33,91 +36,191 @@ export class SpRecordSetting extends BaseElement { } get bufferSize(): number { - let bufferSize = this.shadowRoot?.querySelector(".buffer-size") as HTMLElement - return Number(bufferSize.getAttribute("percent")); + if (this.bufferNumber?.hasAttribute('percent')) { + return Number(this.bufferNumber!.getAttribute("percent")); + } + return 64 } get maxDur(): number { - let bufferSize = this.shadowRoot?.querySelector(".max-duration") as HTMLElement - return Number(bufferSize.getAttribute("percent")); + if (this.durationNumber?.hasAttribute('percent')) { + return Number(this.durationNumber!.getAttribute("percent")); + } + return 50 } initElements(): void { + this.bufferNumber = this.shadowRoot?.querySelector(".buffer-size") as HTMLElement + this.durationNumber = this.shadowRoot?.querySelector(".max-duration") as HTMLElement + let bu = this.shadowRoot?.querySelector('.record') as HTMLDivElement + this.shadowRoot?.querySelectorAll('.MenuButton').forEach(button => { + + button!.addEventListener('mouseenter', e => { + button.style.backgroundColor = '#EFEFEF' + }) + + button!.addEventListener('mouseout', e => { + button.style.backgroundColor = '#E4E3E9' + }) + }) + this.radioBox = this.shadowRoot?.querySelector("#litradio") as LitRadioBox + this.initLitSlider() + } + + initLitSlider() { this.memoryBufferSlider = this.shadowRoot?.querySelector('#memory-buffer') as LitSlider; - let sliderSize1 = this.memoryBufferSlider.sliderSize; + this.memoryBufferSlider.sliderStyle = { + minRange: 4, + maxRange: 512, + defaultValue: "64", + resultUnit: "MB", + stepSize: 2, + lineColor: "var(--dark-color3,#46B1E3)", + buttonColor: "#999999" + }; + let bufferInput = this.shadowRoot?.querySelector('.memory_buffer_result') as HTMLInputElement; + bufferInput.value = ' ' + this.memoryBufferSlider.sliderStyle.defaultValue + ' MB' + this.memoryBufferSlider.addEventListener('input', evt => { + bufferInput.value = ' ' + this.bufferSize + ' MB' + }) + this.maxDurationSliders = this.shadowRoot?.querySelector('#max-duration') as LitSlider; - let sliderSize2 = this.maxDurationSliders.sliderSize; + this.maxDurationSliders.sliderStyle = { + minRange: 10, + maxRange: 600, + defaultValue: '00:00:50', + resultUnit: "h:m:s", + stepSize: 1, + lineColor: "var(--dark-color4,#61CFBE)", + buttonColor: "#999999" + } + + let durationInput = this.shadowRoot?.querySelector('.max_duration_result') as HTMLInputElement; + durationInput.value = ' ' + this.maxDurationSliders.sliderStyle.defaultValue + ' h:m:s' + this.maxDurationSliders.addEventListener('input', evt => { + durationInput.value = ' ' + this.maxDurationSliders!.formatSeconds(this.maxDur.toString()) + ' h:m:s' + }) } initHtml(): string { return ` - -
      -
      - Record mode - Stop when full -
      -
      - In-memory buffer size - -
      -
      - Max duration - -
      -
      `; + +
      +
      + Record mode + Stop when full +
      +
      + In-memory buffer size + + + +
      +
      + Max duration + + + +
      +
      + `; } -} +} \ No newline at end of file diff --git a/host/ide/src/trace/component/setting/SpTraceCommand.ts b/host/ide/src/trace/component/setting/SpTraceCommand.ts index b3f2a54..fbd4e91 100644 --- a/host/ide/src/trace/component/setting/SpTraceCommand.ts +++ b/host/ide/src/trace/component/setting/SpTraceCommand.ts @@ -56,91 +56,92 @@ export class SpTraceCommand extends BaseElement { initHtml(): string { return ` - -
      - - -
      `; + +
      + + +
      + `; } -} +} \ No newline at end of file diff --git a/host/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts b/host/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts index 88464f8..41d652c 100644 --- a/host/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts +++ b/host/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts @@ -675,6 +675,7 @@ export enum SysMeminfoType { MEMINFO_VMALLOC_CHUNK = "PMEM_VMALLOC_CHUNK", MEMINFO_CMA_TOTAL = "PMEM_CMA_TOTAL", MEMINFO_CMA_FREE = "PMEM_CMA_FREE", + MEMINFO_KERNEL_RECLAIMABLE = "PMEM_KERNEL_RECLAIMABLE", UNRECOGNIZED = "UNRECOGNIZED", } @@ -782,6 +783,9 @@ export function sysMeminfoTypeFromJSON(object: any): SysMeminfoType { case 33: case "MEMINFO_CMA_FREE": return SysMeminfoType.MEMINFO_CMA_FREE; + case 34: + case "MEMINFO_KERNEL_RECLAIMABLE": + return SysMeminfoType.MEMINFO_KERNEL_RECLAIMABLE; case -1: case "UNRECOGNIZED": default: @@ -848,3 +852,36 @@ export interface NativeHookConfig { export interface FpsConfig { reportFps: boolean; } + +export interface ProcessConfig { + report_process_tree: boolean; + report_cpu: boolean; + report_diskio: boolean; + report_pss: boolean; +} + +export interface CpuConfig { + pid: number; + reportProcessInfo: boolean; +} + +enum IoReportType { + UNSPECIFIED = "UNSPECIFIED", + IO_REPORT = "IO_REPORT", + IO_REPORT_EX = "IO_REPORT_EX" +} + +export interface DiskioConfig { + reportIoStats: string; +} + +export interface NetworkConfig { + testFile: string; +} + + +export interface HiperfPluginConfig { + isRoot: boolean; + outfileName: string; + recordArgs: string; +} \ No newline at end of file diff --git a/host/ide/src/trace/component/setting/utils/PluginConvertUtils.ts b/host/ide/src/trace/component/setting/utils/PluginConvertUtils.ts index 895520d..8d1c472 100644 --- a/host/ide/src/trace/component/setting/utils/PluginConvertUtils.ts +++ b/host/ide/src/trace/component/setting/utils/PluginConvertUtils.ts @@ -32,7 +32,8 @@ export class PluginConvertUtils { return this.handleObj(bean, 0, needColon, 1); } - public static BeanToCmdTxtWithObjName(bean: any, needColon: boolean, objName: string, spacesNumber: number): string { + public static BeanToCmdTxtWithObjName(bean: any, needColon: boolean, objName: string, + spacesNumber: number): string { return objName + ": {" + this.handleObj(bean, 0, needColon, spacesNumber) + "}"; } @@ -50,33 +51,70 @@ export class PluginConvertUtils { } else { switch (typeof value) { case "bigint": - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + value.toString() + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + value.toString() + + this.crlf break case "boolean": - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + value.toString() + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + value.toString() + + this.crlf break case "number": if (value == 0 && !needColon) { break; } - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + value.toString() + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + value.toString() + + this.crlf break case "string": if (value == '') { break } - if (value.startsWith("LOG_")) { - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + value.toString() + this.crlf + if (value.startsWith("LOG_") || value.startsWith("IO_REPORT")) { + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + value.toString() + + this.crlf } else { - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": \"" + value.toString() + "\"" + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": \"" + + value.toString() + + "\"" + + this.crlf } break case "object": default: if (needColon) { - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + this.handleObj(value, indentation + 1, needColon, spacesNumber) + "" + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + this.handleObj(value, indentation + 1, needColon, spacesNumber) + + "" + + this.crlf } else { - prefixText = prefixText + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + this.handleObj(value, indentation + 1, needColon, spacesNumber) + "" + this.crlf + prefixText = prefixText + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + this.handleObj(value, indentation + 1, needColon, spacesNumber) + + "" + + this.crlf } } } @@ -88,35 +126,73 @@ export class PluginConvertUtils { } } - private static handleArray(key: string, arr: Array, indentation: number, needColon: boolean, spacesNumber: number): string { + private static handleArray(key: string, arr: Array, indentation: number, + needColon: boolean, spacesNumber: number): string { let text = ""; arr.forEach(arrValue => { switch (typeof arrValue) { case "bigint": - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + arrValue.toString() + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + arrValue.toString() + + this.crlf break case "boolean": - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + arrValue.toString() + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + arrValue.toString() + + this.crlf break case "number": - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + arrValue.toString() + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + arrValue.toString() + + this.crlf break case "string": if (arrValue == '') { break } if (arrValue.startsWith("VMEMINFO") || arrValue.startsWith("PMEM")) { - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + arrValue.toString() + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + arrValue.toString() + + this.crlf } else { - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": \"" + arrValue.toString() + "\"" + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": \"" + + arrValue.toString() + + "\"" + + this.crlf } break case "object": default: if (needColon) { - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + ": " + this.handleObj(arrValue, indentation + 1, needColon, spacesNumber) + "" + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + ": " + + this.handleObj(arrValue, indentation + 1, needColon, spacesNumber) + + "" + + this.crlf } else { - text = text + ' '.repeat(spacesNumber).repeat(indentation + 1) + this.humpToSnake(key) + this.handleObj(arrValue, indentation + 1, needColon, spacesNumber) + "" + this.crlf + text = text + + ' '.repeat(spacesNumber).repeat(indentation + 1) + + this.humpToSnake(key) + + this.handleObj(arrValue, indentation + 1, needColon, spacesNumber) + + "" + + this.crlf } } }) @@ -127,6 +203,5 @@ export class PluginConvertUtils { private static humpToSnake(humpString: string): string { return humpString.replace(/[A-Z]/g, (value) => '_' + value.toLowerCase()); } - } diff --git a/host/ide/src/trace/component/trace/TimerShaftElement.ts b/host/ide/src/trace/component/trace/TimerShaftElement.ts index 04bb21e..a076618 100644 --- a/host/ide/src/trace/component/trace/TimerShaftElement.ts +++ b/host/ide/src/trace/component/trace/TimerShaftElement.ts @@ -149,6 +149,7 @@ export class TimerShaftElement extends BaseElement { this.rangeRuler.cpuUsage = [] this.sportRuler!.flagList.length = 0 this.sportRuler!.isRangeSelect = false + this.setSlicesMark(); } this.removeTriangle("inverted"); this.totalNS = 10_000_000_000; @@ -192,6 +193,12 @@ export class TimerShaftElement extends BaseElement { } if (!this.rangeRuler) { this.rangeRuler = new RangeRuler(this, new Rect(0, 25, width, 75), { + slicesTime:{ + startTime:null, + endTime:null, + color:null, + }, + scale: 0, startX: 0, endX: this.canvas?.clientWidth || 0, startNS: 0, @@ -225,14 +232,6 @@ export class TimerShaftElement extends BaseElement { } updateWidth(width: number) { - if (this.isOffScreen) { - this.frame.width = width - (this.totalEL?.clientWidth || 0); - this.frame.height = this.shadowRoot!.host.clientHeight || 0; - this.canvasWidth = Math.round((this.frame.width) * this.dpr); - this.canvasHeight = Math.round((this.frame.height) * this.dpr); - this.render(); - return; - } this.canvas!.width = width - (this.totalEL?.clientWidth || 0); this.canvas!.height = this.shadowRoot!.host.clientHeight || 0; let oldWidth = this.canvas!.width; @@ -251,167 +250,29 @@ export class TimerShaftElement extends BaseElement { } documentOnMouseDown = (ev: MouseEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - offsetLeft: this.canvas?.offsetLeft || 0, - offsetTop: this.canvas?.offsetTop || 0, - mouseDown: {offsetX: ev.offsetX, offsetY: ev.offsetY}, - mouseUp: null, - mouseMove: null, - mouseOut: null, - keyPressCode: null, - keyUpCode: null, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.mouseDown(ev); - } + this.rangeRuler?.mouseDown(ev); } documentOnMouseUp = (ev: MouseEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - offsetLeft: this.canvas?.offsetLeft || 0, - offsetTop: this.canvas?.offsetTop || 0, - mouseUp: {offsetX: ev.offsetX, offsetY: ev.offsetY}, - mouseMove: null, - mouseOut: null, - keyPressCode: null, - keyUpCode: null, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.mouseUp(ev); - this._sportRuler?.mouseUp(ev); - } + this.rangeRuler?.mouseUp(ev); + this.sportRuler?.mouseUp(ev); } documentOnMouseMove = (ev: MouseEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - offsetLeft: this.canvas?.offsetLeft || 0, - offsetTop: this.canvas?.offsetTop || 0, - mouseMove: {offsetX: ev.offsetX, offsetY: ev.offsetY}, - mouseOut: null, - keyPressCode: null, - keyUpCode: null, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.mouseMove(ev); - this._sportRuler?.mouseMove(ev); - } + this.rangeRuler?.mouseMove(ev); + this.sportRuler?.mouseMove(ev); } documentOnMouseOut = (ev: MouseEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - offsetLeft: this.canvas?.offsetLeft || 0, - offsetTop: this.canvas?.offsetTop || 0, - mouseOut: {offsetX: ev.offsetX, offsetY: ev.offsetY}, - keyPressCode: null, - keyUpCode: null, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.mouseOut(ev); - } + this.rangeRuler?.mouseOut(ev); } documentOnKeyPress = (ev: KeyboardEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - keyPressCode: {key: ev.key}, - keyUpCode: null, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.keyPress(ev); - } + this.rangeRuler?.keyPress(ev); } documentOnKeyUp = (ev: KeyboardEvent) => { - if (this.isOffScreen) { - procedurePool.submitWithName(`timeline`, `timeline`, { - offscreen: this.must ? this.offscreen : undefined,//是否离屏 - dpr: this.dpr,//屏幕dpr值 - hoverX: this.hoverX, - hoverY: this.hoverY, - canvasWidth: this.canvasWidth, - canvasHeight: this.canvasHeight, - keyPressCode: null, - keyUpCode: {key: ev.key}, - lineColor: "#dadada", - startNS: this.startNS, - endNS: this.endNS, - totalNS: this.totalNS, - frame: this.frame, - }, this.must ? this.offscreen : undefined, (res: any) => { - this.must = false; - }) - } else { - this.rangeRuler?.keyUp(ev); - } + this.rangeRuler?.keyUp(ev); } disconnectedCallback() { @@ -450,72 +311,76 @@ export class TimerShaftElement extends BaseElement { } drawTriangle(time: number, type: string) { - this._sportRuler?.drawTriangle(time, type); + return this._sportRuler?.drawTriangle(time, type); } - removeTriangle(type:string){ + removeTriangle(type: string) { this._sportRuler?.removeTriangle(type) } + setSlicesMark(startTime: null | number = null,endTime: null | number = null) { + this._sportRuler?.setSlicesMark(startTime,endTime) + } + initHtml(): string { return ` - -
      -
      -
      -
      - 10 - 0 + +
      +
      +
      +
      + 10 + 0 +
      +
      +
      -
      - -
      `; } } diff --git a/host/ide/src/trace/component/trace/base/ColorUtils.ts b/host/ide/src/trace/component/trace/base/ColorUtils.ts index e5798ef..103e405 100644 --- a/host/ide/src/trace/component/trace/base/ColorUtils.ts +++ b/host/ide/src/trace/component/trace/base/ColorUtils.ts @@ -83,4 +83,4 @@ export class ColorUtils { } return t.split("").reverse().join("") } -} +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/base/RangeSelect.ts b/host/ide/src/trace/component/trace/base/RangeSelect.ts index 3e2e8f5..55df72d 100644 --- a/host/ide/src/trace/component/trace/base/RangeSelect.ts +++ b/host/ide/src/trace/component/trace/base/RangeSelect.ts @@ -65,6 +65,7 @@ export class RangeSelect { if (this.isInRowsEl(ev)) { this.rangeTraceRow = []; this.isMouseDown = true; + TraceRow.rangeSelectObject = undefined; this.startX = ev.offsetX - this.rowsEL!.offsetLeft!; if (this.isInSpacerEL(ev)) { this.startY = 0; @@ -138,6 +139,8 @@ export class RangeSelect { let markB = this.movingMark == "markB" ? mouseX : this.mark.endMark; let startX = markA < markB ? markA : markB let endX = markB < markA ? markA : markB + rangeSelect.startX = startX; + rangeSelect.endX = endX; rangeSelect.startNS = Math.floor((TraceRow.range!.endNS - TraceRow.range!.startNS) * startX / it.frame.width + TraceRow.range!.startNS!); rangeSelect.endNS = Math.floor((TraceRow.range!.endNS - TraceRow.range!.startNS) * endX / it.frame.width + TraceRow.range!.startNS!); if (rangeSelect.startNS <= TraceRow.range!.startNS) { @@ -188,6 +191,8 @@ export class RangeSelect { rangeSelect = new RangeSelectStruct(); let startX = Math.floor(rt.x <= 0 ? 0 : rt.x); let endX = Math.floor((rt.x + rt.width) > it.frame.width ? it.frame.width : (rt.x + rt.width)); + rangeSelect.startX = startX; + rangeSelect.endX = endX; rangeSelect.startNS = Math.floor((TraceRow.range!.endNS - TraceRow.range!.startNS) * startX / it.frame.width + TraceRow.range!.startNS!); rangeSelect.endNS = Math.floor((TraceRow.range!.endNS - TraceRow.range!.startNS) * endX / it.frame.width + TraceRow.range!.startNS!); } diff --git a/host/ide/src/trace/component/trace/base/TraceRow.ts b/host/ide/src/trace/component/trace/base/TraceRow.ts index dc54efb..ebd7f48 100644 --- a/host/ide/src/trace/component/trace/base/TraceRow.ts +++ b/host/ide/src/trace/component/trace/base/TraceRow.ts @@ -39,11 +39,20 @@ export class TraceRow extends HTMLElement { static ROW_TYPE_CPU_FREQ = "cpu-freq" static ROW_TYPE_FPS = "fps" static ROW_TYPE_NATIVE_MEMORY = "native-memory" + static ROW_TYPE_HIPERF = "hiperf" + static ROW_TYPE_HIPERF_CPU = "hiperf-cpu" + static ROW_TYPE_HIPERF_PROCESS = "hiperf-process" + static ROW_TYPE_HIPERF_THREAD = "hiperf-thread" static ROW_TYPE_PROCESS = "process" static ROW_TYPE_THREAD = "thread" static ROW_TYPE_MEM = "mem" static ROW_TYPE_HEAP = "heap" static ROW_TYPE_FUNC = "func" + static ROW_TYPE_MONITOR = "ability-monitor" + static ROW_TYPE_CPU_ABILITY = "cpu-ability" + static ROW_TYPE_MEMORY_ABILITY = "memory-ability" + static ROW_TYPE_DISK_ABILITY = "disk-ability" + static ROW_TYPE_NETWORK_ABILITY = "network-ability" static range: TimeRange | undefined | null; static rangeSelectObject: RangeSelectStruct | undefined public obj: TraceRowObject | undefined | null; @@ -62,8 +71,7 @@ export class TraceRow extends HTMLElement { public tipEL: HTMLDivElement | null | undefined; public checkBoxEL: LitCheckBox | null | undefined; public collectEL: LitIcon | null | undefined; - public onDrawHandler: ((ctx: CanvasRenderingContext2D) => void) | undefined | null - public onThreadHandler: ((useCache: boolean) => void) | undefined | null + public onThreadHandler: ((useCache: boolean, buf: ArrayBuffer | undefined | null) => void) | undefined | null public onDrawTypeChangeHandler: ((type: number) => void) | undefined | null public supplier: (() => Promise>) | undefined | null public favoriteChangeHandler: ((fav: TraceRow) => void) | undefined | null @@ -74,12 +82,15 @@ export class TraceRow extends HTMLElement { canvasWidth = 0 canvasHeight = 0 public _frame: Rect | undefined; + public isLoading: boolean = false + public readonly args: any; private rootEL: HTMLDivElement | null | undefined; private nameEL: HTMLLabelElement | null | undefined; - public isLoading: boolean = false private _rangeSelect: boolean = false; - public readonly args: any; private _drawType: number = 0 + private folderIconEL: LitIcon | null | undefined; + online: boolean = false; + static isUserInteraction: boolean; constructor(args: { canvasNumber: number, alpha: boolean, contextId: string, isOffScreen: boolean }) { super(); @@ -91,7 +102,8 @@ export class TraceRow extends HTMLElement { static get observedAttributes() { return ["folder", "name", "expansion", "children", "height", "row-type", "row-id", "row-parent-id", "sleeping", "check-type", - "collect-type" + "collect-type", + "disabled-check" ]; } @@ -194,6 +206,9 @@ export class TraceRow extends HTMLElement { if (!it.collect) { it.rowHidden = !this.expansion; } + if (it.folder && !value && it.expansion) { + it.expansion = value; + } }) this.dispatchEvent(new CustomEvent("expansion-change", { detail: { @@ -230,12 +245,34 @@ export class TraceRow extends HTMLElement { this._frame = f; } + get disabledCheck(): boolean { + return this.hasAttribute("disabled-check"); + } + + set disabledCheck(value: boolean) { + if (value) { + this.setAttribute("disabled-check", '') + this.checkBoxEL!.style.display = "none"; + } else { + this.removeAttribute('disabled-check') + this.checkBoxEL!.style.display = "flex"; + } + } + get checkType(): string { return this.getAttribute("check-type") || ""; } set checkType(value: string) { + if (!value || value.length == 0) { + this.removeAttribute("check-type"); + return; + } this.setAttribute("check-type", value); + if (this.hasAttribute("disabled-check")) { + this.checkBoxEL!.style.display = "none"; + return; + } switch (value) { case "-1": this.checkBoxEL!.style.display = "none"; @@ -286,11 +323,16 @@ export class TraceRow extends HTMLElement { } } + set folderPaddingLeft(value: number) { + this.folderIconEL!.style.marginLeft = value + "px"; + } + initElements(): void { this.rootEL = this.shadowRoot?.querySelector('.root') this.checkBoxEL = this.shadowRoot?.querySelector('.lit-check-box') this.collectEL = this.shadowRoot?.querySelector('.collect') this.describeEl = this.shadowRoot?.querySelector('.describe') + this.folderIconEL = this.shadowRoot?.querySelector('.icon') this.nameEL = this.shadowRoot?.querySelector('.name') this.canvasContainer = this.shadowRoot?.querySelector('.panel-container') this.tipEL = this.shadowRoot?.querySelector('.tip') @@ -310,12 +352,12 @@ export class TraceRow extends HTMLElement { initCanvas(list: Array): void { let timerShaftCanvas = this.parentElement!.parentElement!.querySelector("timer-shaft-element")!.shadowRoot!.querySelector("canvas"); - let tempHeight:number = 0; - if(this.rowType==TraceRow.ROW_TYPE_FUNC ){ + let tempHeight: number = 0; + if (this.rowType == TraceRow.ROW_TYPE_FUNC) { tempHeight = 20; - }else if(this.rowType==TraceRow.ROW_TYPE_THREAD ){ + } else if (this.rowType == TraceRow.ROW_TYPE_THREAD) { tempHeight = 30; - }else{ + } else { tempHeight = 40; } list.forEach((canvas, i) => { @@ -335,7 +377,14 @@ export class TraceRow extends HTMLElement { updateWidth(width: number) { let dpr = window.devicePixelRatio || 1; - let tempHeight = 40; + let tempHeight: number = 0; + if (this.rowType == TraceRow.ROW_TYPE_FUNC) { + tempHeight = 20; + } else if (this.rowType == TraceRow.ROW_TYPE_THREAD) { + tempHeight = 30; + } else { + tempHeight = 40; + } let tempTop = 0; if (this.canvas.length > 1) { tempHeight = 20; @@ -497,6 +546,15 @@ export class TraceRow extends HTMLElement { if (this.sleeping) { return; } + if (this.online) { + if (!useCache && !TraceRow.isUserInteraction) { + this.supplier?.().then(res => { + this.onThreadHandler?.(useCache, res as any); + }); + } + this.onThreadHandler?.(useCache, null); + return; + } if (!this.isComplete) { if (this.supplier && !this.isLoading) { this.isLoading = true; @@ -521,7 +579,7 @@ export class TraceRow extends HTMLElement { } } else { if (this.onThreadHandler && this.dataList) { - this.onThreadHandler!(useCache) + this.onThreadHandler!(useCache, null); } } } @@ -593,231 +651,232 @@ export class TraceRow extends HTMLElement { initHtml(): string { return ` - -
      -
      - - - - -
      -
      Current Bytes
      -
      Native Memory Density
      + } + #setting{ + color: var(--dark-color1,#606060); + } + :host([expansion]) #setting{ + color: #FFFFFF; + } + :host([highlight]) .flash{ + background-color: #ffe263; + } + + +
      +
      + + + + +
      +
      + Current Bytes
      +
      + Native Memory Density
      +
      + +
      + +
      +
      +
      + P:process [1573]
      + T:Thread [675] +
      - - - -
      -
      -
      - P:process [1573]
      - T:Thread [675]
      -
      -
      `; } - } diff --git a/host/ide/src/trace/component/trace/base/TraceRowRecyclerView.ts b/host/ide/src/trace/component/trace/base/TraceRowRecyclerView.ts index f5ce848..4da1ed4 100644 --- a/host/ide/src/trace/component/trace/base/TraceRowRecyclerView.ts +++ b/host/ide/src/trace/component/trace/base/TraceRowRecyclerView.ts @@ -118,7 +118,7 @@ export class TraceRowRecyclerView extends BaseElement { } if (!this.recycler) this.visibleRowsCount = this.dataSource.length; for (let i = 0; i <= this.visibleRowsCount; i++) { - let el = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + let el = new TraceRow({canvasNumber: 1, alpha: true, contextId: '2d', isOffScreen: true}); el.className = "recycler-cell" this.container?.appendChild(el); el.addEventListener('expansion-change', (ev: any) => { @@ -149,42 +149,42 @@ export class TraceRowRecyclerView extends BaseElement { initHtml(): string { return ` - -
      -
      -
      + +
      +
      +
      -`; + `; } } diff --git a/host/ide/src/trace/component/trace/base/TraceSheet.ts b/host/ide/src/trace/component/trace/base/TraceSheet.ts index 0ede469..6c6cbb3 100644 --- a/host/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/host/ide/src/trace/component/trace/base/TraceSheet.ts @@ -37,6 +37,8 @@ import "../sheet/TabPaneNMStatstics.js"; import "../sheet/TabPaneNMCallInfo.js"; import "../sheet/TabPaneNMemory.js"; import "../sheet/TabPaneNMSampleList.js"; +import "../sheet/TabPerfProfile.js"; +import "../sheet/TabPerfSampleList.js"; import {BoxJumpParam, SelectionParam} from "../../../bean/BoxSelection.js"; import {TabPaneThreadStates} from "../sheet/TabPaneThreadStates.js"; import {TabPaneCpuByProcess} from "../sheet/TabPaneCpuByProcess.js"; @@ -65,6 +67,20 @@ import {TabPaneNMemory} from "../sheet/TabPaneNMemory.js"; import {TabPaneNMSampleList} from "../sheet/TabPaneNMSampleList.js"; import {WakeupBean} from "../../../bean/WakeupBean.js"; import {LitIcon} from "../../../../base-ui/icon/LitIcon.js"; +import {TabPaneCpuAbility} from "../sheet/TabPaneCpuAbility.js"; +import "../sheet/TabPaneCpuAbility.js"; +import {TabPaneDiskAbility} from "../sheet/TabPaneDiskAbility.js"; +import "../sheet/TabPaneDiskAbility.js"; +import {TabPaneMemoryAbility} from "../sheet/TabPaneMemoryAbility.js"; +import "../sheet/TabPaneMemoryAbility.js"; +import {TabPaneNetworkAbility} from "../sheet/TabPaneNetworkAbility.js"; +import "../sheet/TabPaneNetworkAbility.js"; +import {TabPaneHistoryProcesses} from "../sheet/TabPaneHistoryProcesses.js"; +import "../sheet/TabPaneHistoryProcesses.js"; +import {TabPaneLiveProcesses} from "../sheet/TabPaneLiveProcesses.js"; +import "../sheet/TabPaneLiveProcesses.js"; +import {TabpanePerfProfile} from "../sheet/TabPerfProfile.js"; +import {TabPanePerfSample} from "../sheet/TabPerfSampleList.js"; @element("trace-sheet") export class TraceSheet extends BaseElement { @@ -89,6 +105,8 @@ export class TraceSheet extends BaseElement { private tabBoxNMCallInfo: LitTabpane | undefined | null private tabBoxNMemory: LitTabpane | undefined | null private tabBoxNMSample: LitTabpane | undefined | null + private tabBoxPerfProfile: LitTabpane | undefined | null + private tabBoxPerfSample: LitTabpane | undefined | null private tabSPT: TabPaneSPT | undefined | null private tabPTS: TabPanePTS | undefined | null private tabCs: TabPaneContextSwitch | undefined | null @@ -98,9 +116,25 @@ export class TraceSheet extends BaseElement { private tabNativeMemory: TabPaneNMemory | undefined | null private tabNativeCallInfo: TabPaneNMCallInfo | undefined | null private tabNativeSample: TabPaneNMSampleList | undefined | null + private tabPerfProfile: TabpanePerfProfile | undefined | null + private tabPerfSample: TabPanePerfSample | undefined | null private currentKey: string = "1"; private selection: SelectionParam | undefined | null; + private tabBoxLiveProcesses: LitTabpane | undefined | null + private tabBoxHistoryProcesses: LitTabpane | undefined | null + private tabBoxSystemCpu: LitTabpane | undefined | null + private tabBoxSystemMemory: LitTabpane | undefined | null + private tabBoxSystemDiskIo: LitTabpane | undefined | null + private tabBoxSystemNetwork: LitTabpane | undefined | null + + private tabLiveProcesses: TabPaneLiveProcesses | undefined | null + private tabHistoryProcesses: TabPaneHistoryProcesses | undefined | null + private tabSystemCpu: TabPaneCpuAbility | undefined | null + private tabSystemMemory: TabPaneMemoryAbility | undefined | null + private tabSystemDiskIo: TabPaneDiskAbility | undefined | null + private tabSystemNetwork: TabPaneNetworkAbility | undefined | null + static get observedAttributes() { return ['mode']; } @@ -128,6 +162,16 @@ export class TraceSheet extends BaseElement { this.tabBoxNMemory = this.shadowRoot?.querySelector("#box-native-memory"); this.tabBoxNMSample = this.shadowRoot?.querySelector("#box-native-sample"); + this.tabBoxLiveProcesses = this.shadowRoot?.querySelector("#box-live-processes-child"); + this.tabBoxHistoryProcesses = this.shadowRoot?.querySelector("#box-history-processes-child"); + this.tabBoxSystemCpu = this.shadowRoot?.querySelector("#box-system-cpu-child"); + this.tabBoxSystemMemory = this.shadowRoot?.querySelector("#box-system-memory-child"); + this.tabBoxSystemDiskIo = this.shadowRoot?.querySelector("#box-system-diskIo-child"); + this.tabBoxSystemNetwork = this.shadowRoot?.querySelector("#box-system-network-child"); + + this.tabBoxPerfProfile = this.shadowRoot?.querySelector("#box-perf-profile"); + this.tabBoxPerfSample = this.shadowRoot?.querySelector("#box-perf-sample"); + this.tabSPT = this.shadowRoot!.querySelector('#tab-spt'); this.tabPTS = this.shadowRoot!.querySelector('#tab-pts'); this.tabCs = this.shadowRoot!.querySelector('#tab-cs'); @@ -139,6 +183,15 @@ export class TraceSheet extends BaseElement { this.tabNativeMemory = this.shadowRoot!.querySelector('#tab-box-native-memory'); this.tabNativeSample = this.shadowRoot!.querySelector('#tab-box-native-sample'); + this.tabLiveProcesses = this.shadowRoot?.querySelector("#tab-live-processes-child"); + this.tabHistoryProcesses = this.shadowRoot?.querySelector("#tab-history-processes-child"); + this.tabSystemCpu = this.shadowRoot?.querySelector("#tab-system-cpu-child"); + this.tabSystemMemory = this.shadowRoot?.querySelector("#tab-system-memory-child"); + this.tabSystemDiskIo = this.shadowRoot?.querySelector("#tab-system-diskIo-child"); + this.tabSystemNetwork = this.shadowRoot?.querySelector("#tab-system-network-child"); + + this.tabPerfProfile = this.shadowRoot!.querySelector('#tab-box-perf-profile'); + this.tabPerfSample = this.shadowRoot!.querySelector('#tab-box-perf-sample'); let minBtn = this.shadowRoot?.querySelector("#min-btn"); minBtn?.addEventListener('click', (e) => { }) @@ -162,7 +215,7 @@ export class TraceSheet extends BaseElement { this.tabTs!.addEventListener("row-click", (e) => { this.jumpBoxChild("14", e) }) - this.tabNativeStatistics!.addEventListener("row-click",(e)=>{ + this.tabNativeStatistics!.addEventListener("row-click", (e) => { // @ts-ignore this.selection!.statisticsSelectData = e.detail this.tabNativeMemory?.fromStastics(this.selection) @@ -253,100 +306,152 @@ export class TraceSheet extends BaseElement { initHtml(): string { return ` - -
      - -
      - - -
      - - - - - - - - - - - - - - - - - - - - -
      -
      `; + +
      + +
      + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + `; } clear() { this.shadowRoot?.querySelectorAll("lit-tabpane").forEach(it => this.litTabs?.removeChild(it)) } - displayThreadData(data: ThreadStruct, scrollCallback: ((e: ThreadStruct) => void) | undefined) { + displayThreadData(data: ThreadStruct, scrollCallback: ((e: ThreadStruct) => void) | undefined,scrollWakeUp:(d:any) => void | undefined) { this.setAttribute("mode", "max") this.tabCurrentSelection!.hidden = false; this.hideBoxTab(); this.litTabs?.activeByKey("1") let tabCpu = this.shadowRoot!.querySelector('#tabpane-cpu'); - tabCpu!.setThreadData(data, scrollCallback); + tabCpu!.setThreadData(data, scrollCallback,scrollWakeUp); } displayMemData(data: ProcessMemStruct) { @@ -388,12 +493,13 @@ export class TraceSheet extends BaseElement { tabFlag!.setFlagObj(flagObj) } - boxSelection(selection: SelectionParam):boolean { + boxSelection(selection: SelectionParam): boolean { this.tabBoxChild!.hidden = true; this.selection = selection; if (selection.hasFps || selection.cpus.length > 0 || selection.threadIds.length > 0 || selection.funTids.length > 0 || selection.trackIds.length > 0 || selection.heapIds.length > 0 - || selection.nativeMemory.length > 0) { + || selection.nativeMemory.length > 0 || selection.cpuAbilityIds.length > 0 || selection.memoryAbilityIds.length > 0 || selection.diskAbilityIds.length > 0 || selection.networkAbilityIds.length > 0 + || selection.perfSampleIds.length > 0) { this.setAttribute("mode", "max") this.tabCurrentSelection!.hidden = true; this.tabBoxFlag!.hidden = true; @@ -413,6 +519,15 @@ export class TraceSheet extends BaseElement { this.tabBoxNMCallInfo!.hidden = selection.nativeMemory.length == 0 this.tabBoxNMemory!.hidden = selection.nativeMemory.length == 0 this.tabBoxNMSample!.hidden = selection.nativeMemory.length == 0 + + this.tabBoxLiveProcesses!.hidden = selection.cpuAbilityIds.length == 0 && selection.memoryAbilityIds.length == 0 && selection.diskAbilityIds.length == 0 && selection.networkAbilityIds.length == 0 + this.tabBoxHistoryProcesses!.hidden = selection.cpuAbilityIds.length == 0 && selection.memoryAbilityIds.length == 0 && selection.diskAbilityIds.length == 0 && selection.networkAbilityIds.length == 0 + this.tabBoxSystemCpu!.hidden = selection.cpuAbilityIds.length == 0 + this.tabBoxSystemMemory!.hidden = selection.memoryAbilityIds.length == 0 + this.tabBoxSystemDiskIo!.hidden = selection.diskAbilityIds.length == 0 + this.tabBoxSystemNetwork!.hidden = selection.networkAbilityIds.length == 0 + this.tabBoxPerfProfile!.hidden = selection.perfSampleIds.length == 0 + this.tabBoxPerfSample!.hidden = selection.perfSampleIds.length == 0 this.setBoxActiveKey(selection); return true; } else { @@ -439,6 +554,8 @@ export class TraceSheet extends BaseElement { this.tabBoxNMCallInfo!.hidden = !(this.selection!.nativeMemory.length > 0) this.tabBoxNMemory!.hidden = !(this.selection!.nativeMemory.length > 0) this.tabBoxNMSample!.hidden = !(this.selection!.nativeMemory.length > 0) + this.tabBoxPerfProfile!.hidden = !(this.selection!.perfSampleIds.length > 0) + this.tabBoxPerfSample!.hidden = !(this.selection!.perfSampleIds.length > 0) } setBoxActiveKey(val: SelectionParam) { @@ -460,10 +577,25 @@ export class TraceSheet extends BaseElement { } else if (val.heapIds.length > 0) { this.litTabs?.activeByKey("9") this.loadTabPaneData("9") - } else if(val.nativeMemory.length > 0) { + } else if (val.nativeMemory.length > 0) { this.litTabs?.activeByKey("16") this.loadTabPaneData("16") - }else{ + } else if (val.cpuAbilityIds.length > 0) { + this.litTabs?.activeByKey("32") + this.loadTabPaneData("32") + } else if (val.memoryAbilityIds.length > 0) { + this.litTabs?.activeByKey("33") + this.loadTabPaneData("33") + } else if (val.diskAbilityIds.length > 0) { + this.litTabs?.activeByKey("34") + this.loadTabPaneData("34") + } else if (val.networkAbilityIds.length > 0) { + this.litTabs?.activeByKey("35") + this.loadTabPaneData("35") + } else if (val.perfSampleIds.length > 0) { + this.litTabs?.activeByKey("20") + this.loadTabPaneData("20") + } else { this.litTabs?.activeByKey("1") this.loadTabPaneData("1") } @@ -512,6 +644,22 @@ export class TraceSheet extends BaseElement { this.tabNativeMemory!.data = this.selection; } else if (key == "19") { this.tabNativeSample!.data = this.selection; + } else if (key == "20") { + this.tabPerfProfile!.data = this.selection; + } else if (key == "21") { + this.tabPerfSample!.data = this.selection; + } else if (key == "30") { + this.tabLiveProcesses!.data = this.selection; + } else if (key == "31") { + this.tabHistoryProcesses!.data = this.selection; + } else if (key == "32") { + this.tabSystemCpu!.data = this.selection; + } else if (key == "33") { + this.tabSystemMemory!.data = this.selection; + } else if (key == "34") { + this.tabSystemDiskIo!.data = this.selection; + } else if (key == "35") { + this.tabSystemNetwork!.data = this.selection; } } @@ -534,6 +682,8 @@ export class TraceSheet extends BaseElement { this.tabBoxNMCallInfo!.hidden = true; this.tabBoxNMemory!.hidden = true; this.tabBoxNMSample!.hidden = true; + this.tabBoxPerfProfile!.hidden = true; + this.tabBoxPerfSample!.hidden = true; } hideOtherBoxTab(key: string) { @@ -549,6 +699,8 @@ export class TraceSheet extends BaseElement { this.tabBoxNMCallInfo!.hidden = true; this.tabBoxNMemory!.hidden = true; this.tabBoxNMSample!.hidden = true; + this.tabBoxPerfProfile!.hidden = true; + this.tabBoxPerfSample!.hidden = true; if (key == "11") { this.tabBoxPTS!.hidden = true; this.tabBoxContextSwitch!.hidden = true; diff --git a/host/ide/src/trace/component/trace/base/Utils.ts b/host/ide/src/trace/component/trace/base/Utils.ts index cb7e6da..3a8d60f 100644 --- a/host/ide/src/trace/component/trace/base/Utils.ts +++ b/host/ide/src/trace/component/trace/base/Utils.ts @@ -148,23 +148,359 @@ export class Utils { return "-" + this.getByteWithUnit(Math.abs(bytes)) } let currentBytes = bytes - let kb1 = 1024 - let mb1 = 1048576 - let gb1 = 1073741824; // 1 gb + let kb1 = 1 << 10; + let mb1 = 1 << 10 << 10; + let gb1 = 1 << 10 << 10 << 10; // 1 gb let res = "" if (currentBytes > gb1) { res += (currentBytes / gb1).toFixed(2) + " Gb"; } else if (currentBytes > mb1) { res += (currentBytes / mb1).toFixed(2) + " Mb"; } else if (currentBytes > kb1) { - res += (currentBytes / kb1).toFixed(2) + " kb"; + res += (currentBytes / kb1).toFixed(2) + " Kb"; } else { - res += currentBytes + " byte"; + res += Math.round(currentBytes) + " byte"; } return res } + public static groupByMap(array: Array, key: string) { + let result = new Map(); + array.forEach(item => { + let value = item[key]; + if (!result.has(value)) { + result.set(value, []) + } + result.get(value).push(item); + }) + return result; + } + + public static groupBy(array: Array, key: string) { + return array.reduce((pre, current, index, arr) => { + (pre[current[key]] = pre[current[key]] || []).push(current); + return pre; + }, {}); + } + + public static timeMsFormat2p(ns: number) { + let currentNs = ns + let hour1 = 3600_000 + let minute1 = 60_000 + let second1 = 1_000; // 1 second + let res = "" + if (currentNs >= hour1) { + res += Math.floor(currentNs / hour1).toFixed(2) + "h" + return res + } + if (currentNs >= minute1) { + res += Math.floor(currentNs / minute1).toFixed(2) + "min" + return res + } + if (currentNs >= second1) { + res += Math.floor(currentNs / second1).toFixed(2) + "s" + return res + } + if (currentNs > 0) { + res += currentNs.toFixed(2) + "ms"; + return res + } + if (res == "") { + res = "0s"; + } + return res + } + + public static uuid(): string { + // @ts-ignore + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); + } + + public static MD5(uint8Array: any) { + function md5cycle(x: any, k: any) { + let a = x[0], b = x[1], c = x[2], d = x[3]; + + a = ff(a, b, c, d, k[0], 7, -680876936); + d = ff(d, a, b, c, k[1], 12, -389564586); + c = ff(c, d, a, b, k[2], 17, 606105819); + b = ff(b, c, d, a, k[3], 22, -1044525330); + a = ff(a, b, c, d, k[4], 7, -176418897); + d = ff(d, a, b, c, k[5], 12, 1200080426); + c = ff(c, d, a, b, k[6], 17, -1473231341); + b = ff(b, c, d, a, k[7], 22, -45705983); + a = ff(a, b, c, d, k[8], 7, 1770035416); + d = ff(d, a, b, c, k[9], 12, -1958414417); + c = ff(c, d, a, b, k[10], 17, -42063); + b = ff(b, c, d, a, k[11], 22, -1990404162); + a = ff(a, b, c, d, k[12], 7, 1804603682); + d = ff(d, a, b, c, k[13], 12, -40341101); + c = ff(c, d, a, b, k[14], 17, -1502002290); + b = ff(b, c, d, a, k[15], 22, 1236535329); + + a = gg(a, b, c, d, k[1], 5, -165796510); + d = gg(d, a, b, c, k[6], 9, -1069501632); + c = gg(c, d, a, b, k[11], 14, 643717713); + b = gg(b, c, d, a, k[0], 20, -373897302); + a = gg(a, b, c, d, k[5], 5, -701558691); + d = gg(d, a, b, c, k[10], 9, 38016083); + c = gg(c, d, a, b, k[15], 14, -660478335); + b = gg(b, c, d, a, k[4], 20, -405537848); + a = gg(a, b, c, d, k[9], 5, 568446438); + d = gg(d, a, b, c, k[14], 9, -1019803690); + c = gg(c, d, a, b, k[3], 14, -187363961); + b = gg(b, c, d, a, k[8], 20, 1163531501); + a = gg(a, b, c, d, k[13], 5, -1444681467); + d = gg(d, a, b, c, k[2], 9, -51403784); + c = gg(c, d, a, b, k[7], 14, 1735328473); + b = gg(b, c, d, a, k[12], 20, -1926607734); + + a = hh(a, b, c, d, k[5], 4, -378558); + d = hh(d, a, b, c, k[8], 11, -2022574463); + c = hh(c, d, a, b, k[11], 16, 1839030562); + b = hh(b, c, d, a, k[14], 23, -35309556); + a = hh(a, b, c, d, k[1], 4, -1530992060); + d = hh(d, a, b, c, k[4], 11, 1272893353); + c = hh(c, d, a, b, k[7], 16, -155497632); + b = hh(b, c, d, a, k[10], 23, -1094730640); + a = hh(a, b, c, d, k[13], 4, 681279174); + d = hh(d, a, b, c, k[0], 11, -358537222); + c = hh(c, d, a, b, k[3], 16, -722521979); + b = hh(b, c, d, a, k[6], 23, 76029189); + a = hh(a, b, c, d, k[9], 4, -640364487); + d = hh(d, a, b, c, k[12], 11, -421815835); + c = hh(c, d, a, b, k[15], 16, 530742520); + b = hh(b, c, d, a, k[2], 23, -995338651); + + a = ii(a, b, c, d, k[0], 6, -198630844); + d = ii(d, a, b, c, k[7], 10, 1126891415); + c = ii(c, d, a, b, k[14], 15, -1416354905); + b = ii(b, c, d, a, k[5], 21, -57434055); + a = ii(a, b, c, d, k[12], 6, 1700485571); + d = ii(d, a, b, c, k[3], 10, -1894986606); + c = ii(c, d, a, b, k[10], 15, -1051523); + b = ii(b, c, d, a, k[1], 21, -2054922799); + a = ii(a, b, c, d, k[8], 6, 1873313359); + d = ii(d, a, b, c, k[15], 10, -30611744); + c = ii(c, d, a, b, k[6], 15, -1560198380); + b = ii(b, c, d, a, k[13], 21, 1309151649); + a = ii(a, b, c, d, k[4], 6, -145523070); + d = ii(d, a, b, c, k[11], 10, -1120210379); + c = ii(c, d, a, b, k[2], 15, 718787259); + b = ii(b, c, d, a, k[9], 21, -343485551); + + x[0] = add32(a, x[0]); + x[1] = add32(b, x[1]); + x[2] = add32(c, x[2]); + x[3] = add32(d, x[3]); + + } + + function cmn(q: any, a: any, b: any, x: any, s: any, t: any) { + a = add32(add32(a, q), add32(x, t)); + return add32((a << s) | (a >>> (32 - s)), b); + } + + function ff(a: any, b: any, c: any, d: any, x: any, s: any, t: any) { + return cmn((b & c) | ((~b) & d), a, b, x, s, t); + } + + function gg(a: any, b: any, c: any, d: any, x: any, s: any, t: any) { + return cmn((b & d) | (c & (~d)), a, b, x, s, t); + } + + function hh(a: any, b: any, c: any, d: any, x: any, s: any, t: any) { + return cmn(b ^ c ^ d, a, b, x, s, t); + } + + function ii(a: any, b: any, c: any, d: any, x: any, s: any, t: any) { + return cmn(c ^ (b | (~d)), a, b, x, s, t); + } + + function md51(s: any) { + let n = s.length, + state = [1732584193, -271733879, -1732584194, 271733878], i; + for (i = 64; i <= s.length; i += 64) { + md5cycle(state, md5blk(s.subarray(i - 64, i))); + } + s = s.subarray(i - 64); + let tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (i = 0; i < s.length; i++) + tail[i >> 2] |= s[i] << ((i % 4) << 3); + tail[i >> 2] |= 0x80 << ((i % 4) << 3); + if (i > 55) { + md5cycle(state, tail); + for (i = 0; i < 16; i++) tail[i] = 0; + } + tail[14] = n * 8; + md5cycle(state, tail); + return state; + } + + /* there needs to be support for Unicode here, + * unless we pretend that we can redefine the MD-5 + * algorithm for multi-byte characters (perhaps + * by adding every four 16-bit characters and + * shortening the sum to 32 bits). Otherwise + * I suggest performing MD-5 as if every character + * was two bytes--e.g., 0040 0025 = @%--but then + * how will an ordinary MD-5 sum be matched? + * There is no way to standardize text to something + * like UTF-8 before transformation; speed cost is + * utterly prohibitive. The JavaScript standard + * itself needs to look at this: it should start + * providing access to strings as preformed UTF-8 + * 8-bit unsigned value arrays. + */ + function md5blk(s: any) { /* I figured global was faster. */ + let md5blks = [], i; /* Andy King said do it this way. */ + for (i = 0; i < 64; i += 4) { + md5blks[i >> 2] = s[i] + + (s[i + 1] << 8) + + (s[i + 2] << 16) + + (s[i + 3] << 24); + } + return md5blks; + } + + let hex_chr = '0123456789abcdef'.split(''); + + function rhex(n: any) { + let s = '', j = 0; + for (; j < 4; j++) + s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + + hex_chr[(n >> (j * 8)) & 0x0F]; + return s; + } + + function hex(x: any) { + for (let i = 0; i < x.length; i++) + x[i] = rhex(x[i]); + return x.join(''); + } + + function md5(s: any) { + return hex(md51(s)); + } + + function add32(a: any, b: any) { + return (a + b) & 0xFFFFFFFF; + } + + return md5(uint8Array); + }; + + public static getBinaryByteWithUnit(bytes: number): string { + if (bytes == 0) { + return "0Bytes" + } + let currentBytes = bytes + let kib1 = 1024 + let mib1 = 1024 * 1024 + let gib1 = 1024 * 1024 * 1024; + let res = "" + if (currentBytes > gib1) { + res += (currentBytes / gib1).toFixed(2) + "Gib"; + } else if (currentBytes > mib1) { + res += (currentBytes / mib1).toFixed(2) + "Mib"; + } else if (currentBytes > kib1) { + res += (currentBytes / kib1).toFixed(2) + "kib"; + } else { + res += currentBytes.toFixed(2) + "Bytes"; + } + return res + } + + public static getTimeStampHMS(ns: number): string { + let currentNs = ns + let hour1 = 3600_000_000_000 + let minute1 = 60_000_000_000 + let second1 = 1_000_000_000; // 1 second + let millisecond1 = 1_000_000; // 1 millisecond + let microsecond1 = 1_000; // 1 microsecond + let res = ""; + if (currentNs >= hour1) { + res += this.getCompletionTime(Math.floor(currentNs / hour1), 2) + ":"; + currentNs = currentNs - Math.floor(currentNs / hour1) * hour1 + } + if (currentNs >= minute1) { + res += this.getCompletionTime(Math.floor(currentNs / minute1), 2) + ":"; + currentNs = currentNs - Math.floor(ns / minute1) * minute1 + } + if (currentNs >= second1) { + res += this.getCompletionTime(Math.floor(currentNs / second1), 2) + ":"; + currentNs = currentNs - Math.floor(currentNs / second1) * second1 + } else { + res += '00:' + } + if (currentNs >= millisecond1) { + res += this.getCompletionTime(Math.floor(currentNs / millisecond1), 3) + "."; + currentNs = currentNs - Math.floor(currentNs / millisecond1) * millisecond1 + } else { + res += "000." + } + if (currentNs >= microsecond1) { + res += this.getCompletionTime(Math.floor(currentNs / microsecond1), 3) + "."; + currentNs = currentNs - Math.floor(currentNs / microsecond1) * microsecond1 + } else { + res += "000" + } + if (currentNs > 0) { + res += this.getCompletionTime(currentNs, 3); + } + if (res == "") { + res = ns + ""; + } + return res + } + + public static getDurString(ns: number): string { + let currentNs = ns + let minute1 = 60_000_000_000 + let second1 = 1_000_000_000; + let millisecond1 = 1_000_000; + let res = ""; + if (currentNs >= minute1) { + res += Math.floor(currentNs / minute1) + ":"; + currentNs = currentNs - Math.floor(ns / minute1) * minute1 + } + if (currentNs >= second1) { + res += Math.floor(currentNs / second1) + "."; + currentNs = currentNs - Math.floor(currentNs / second1) * second1; + res += Math.floor(currentNs / millisecond1) + "s "; + return res; + } + if (currentNs >= millisecond1) { + res += Math.floor(currentNs / millisecond1) + "ms "; + return res; + } + if (res == "") { + res = ns + ""; + } + return res + } + + private static getCompletionTime(time: number, maxLength: number): string { + if (maxLength == 2) { + if (time.toString().length == 2) { + return '' + time; + } else { + return '0' + time; + } + } else if (maxLength == 3) { + if (time.toString().length == 3) { + return time.toString(); + } else if (time.toString().length == 2) { + return '0' + time; + } else { + return '00' + time; + } + } else { + return '0' + } + } + public getStatusMap(): Map { return Utils.statusMap; } + } diff --git a/host/ide/src/trace/component/trace/search/Search.ts b/host/ide/src/trace/component/trace/search/Search.ts index 23ff8f9..1e9607d 100644 --- a/host/ide/src/trace/component/trace/search/Search.ts +++ b/host/ide/src/trace/component/trace/search/Search.ts @@ -40,7 +40,7 @@ export class LitSearch extends BaseElement { set index(value: number) { this._index = value; - this.indexEL!.textContent = `${value+1}`; + this.indexEL!.textContent = `${value + 1}`; } get total(): number { @@ -89,9 +89,10 @@ export class LitSearch extends BaseElement { this.list = []; } - blur(){ + blur() { this.search?.blur(); } + initElements(): void { this.search = this.shadowRoot!.querySelector("input"); this.totalEL = this.shadowRoot!.querySelector("#total"); @@ -116,18 +117,21 @@ export class LitSearch extends BaseElement { this.dispatchEvent(new CustomEvent("previous-data", { detail: { value: this.search!.value - } + }, + composed:false })); } else { this.dispatchEvent(new CustomEvent("next-data", { detail: { value: this.search!.value - } + }, + composed:false })); } } else { this.valueChangeHandler?.(this.search!.value); } + e.stopPropagation(); }); this.shadowRoot?.querySelector("#arrow-left")?.addEventListener("click", (e) => { this.dispatchEvent(new CustomEvent("previous-data", { @@ -147,70 +151,73 @@ export class LitSearch extends BaseElement { initHtml(): string { return ` - - + + `; } - } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneBoxChild.ts b/host/ide/src/trace/component/trace/sheet/TabPaneBoxChild.ts index c37351b..7b0f2c3 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneBoxChild.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneBoxChild.ts @@ -30,7 +30,7 @@ export class TabPaneBoxChild extends BaseElement { set data(val: BoxJumpParam) { // @ts-ignore - this.tbl?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 45)+"px"; + this.tbl?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 45) + "px"; this.range!.textContent = "Selected range: " + parseFloat(((val.rightNs - val.leftNs) / 1000000.0).toFixed(5)) + " ms" if (this.loadDataInCache) { this.getDataByCache(val).then((arr) => { @@ -53,7 +53,7 @@ export class TabPaneBoxChild extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45)+"px" + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!) @@ -83,13 +83,12 @@ export class TabPaneBoxChild extends BaseElement { getDataByCache(val: BoxJumpParam): Promise> { return new Promise>((resolve, reject) => { - let time = Date.now(); let arr: Array = []; SpSystemTrace.SPT_DATA.map((spt) => { let b1 = (val.state != undefined && val.state != '') ? spt.state == val.state : true let b2 = (val.processId != undefined && val.processId != -1) ? spt.processId == val.processId : true let b3 = (val.threadId != undefined && val.threadId != -1) ? spt.threadId == val.threadId : true - if(!(spt.end_ts < val.leftNs || spt.start_ts > val.rightNs) && b1 && b2 && b3){ + if (!(spt.end_ts < val.leftNs || spt.start_ts > val.rightNs) && b1 && b2 && b3) { let sptChild = new SPTChild(); sptChild.startTime = Utils.getTimeString(spt.start_ts) sptChild.state = Utils.getEndState(spt.state)! @@ -107,23 +106,30 @@ export class TabPaneBoxChild extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - + + + + + + + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneContextSwitch.ts b/host/ide/src/trace/component/trace/sheet/TabPaneContextSwitch.ts index 0098d18..309ddb3 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneContextSwitch.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneContextSwitch.ts @@ -33,7 +33,7 @@ export class TabPaneContextSwitch extends BaseElement { set data(val: SelectionParam | any) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45)+"px" + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" this.range!.textContent = "Selected range: " + parseFloat(((val.rightNs - val.leftNs) / 1000000.0).toFixed(5)) + " ms" if (this.loadDataInCache) { this.queryDataInCacheData(val).then((arr) => { @@ -50,7 +50,7 @@ export class TabPaneContextSwitch extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45)+"px" + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!) @@ -61,8 +61,8 @@ export class TabPaneContextSwitch extends BaseElement { let pMap: Map = new Map(); let ptMap: Map = new Map(); let ptsMap: Map = new Map(); - SpSystemTrace.SPT_DATA.map((d)=>{ - if(!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)){ + SpSystemTrace.SPT_DATA.map((d) => { + if (!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)) { if (pMap.has(d.processId + "")) { let obj1 = pMap.get(d.processId + ""); obj1!.count++; @@ -244,19 +244,20 @@ export class TabPaneContextSwitch extends BaseElement { initHtml(): string { return ` - - - - - - + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCounter.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCounter.ts index 582811f..e4d6467 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCounter.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCounter.ts @@ -33,7 +33,7 @@ export class TabPaneCounter extends BaseElement { let sumCount = 0; for (let key of collect.keys()) { let counters = collect.get(key); - let list:Array = []; + let list: Array = []; let index = counters!.findIndex((item) => item.startTime >= val.leftNs); if (index != -1) { list = counters!.splice(index > 0 ? index - 1 : index) @@ -68,25 +68,34 @@ export class TabPaneCounter extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCpu.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCpu.ts index cb5a3a7..6010d75 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCpu.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCpu.ts @@ -40,19 +40,20 @@ export class TabPaneCpu extends BaseElement { initHtml(): string { return ` - - - - - - + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCpuAbility.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCpuAbility.ts new file mode 100644 index 0000000..4ce6a98 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCpuAbility.ts @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabCpuAbilityData,} from "../../../database/SqlLite.js"; +import {SystemCpuSummary} from "../../../bean/AbilityMonitor.js"; +import {Utils} from "../base/Utils.js"; +import {ColorUtils} from "../base/ColorUtils.js"; +import "../../../component/SpFilter.js"; + +@element('tabpane-cpu-ability') +export class TabPaneCpuAbility extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private queryResult: Array = [] + private float: HTMLDivElement | null | undefined; + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-cpu-ability'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toCpuAbilityArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toCpuAbilityArray(systemCpuSummary: SystemCpuSummary): any[] { + let array: Array = [] + array.push(systemCpuSummary.startTimeStr) + array.push(systemCpuSummary.durationStr) + array.push(systemCpuSummary.totalLoadStr) + array.push(systemCpuSummary.userLoadStr) + array.push(systemCpuSummary.systemLoadStr) + array.push(systemCpuSummary.threadsStr) + return array + } + + queryDataByDB(val: SelectionParam | any) { + getTabCpuAbilityData(val.leftNs, val.rightNs).then(result => { + if (result.length != null && result.length > 0) { + for (const systemCpuSummary of result) { + if (systemCpuSummary.startTime == 0) { + systemCpuSummary.startTimeStr = '0:000.000.000'; + } else { + systemCpuSummary.startTimeStr = Utils.getTimeStampHMS(systemCpuSummary.startTime); + } + systemCpuSummary.durationStr = Utils.getDurString(systemCpuSummary.duration); + systemCpuSummary.totalLoadStr = (systemCpuSummary.totalLoad).toFixed(2) + "%" + systemCpuSummary.userLoadStr = (systemCpuSummary.userLoad).toFixed(2) + "%" + systemCpuSummary.systemLoadStr = (systemCpuSummary.systemLoad).toFixed(2) + "%" + systemCpuSummary.threadsStr = ColorUtils.formatNumberComma(systemCpuSummary.threads); + } + this.source = result + this.queryResult = result; + this.tbl!.recycleDataSource = this.source + } else { + this.source = [] + this.queryResult = [] + this.tbl!.recycleDataSource = [] + } + }) + } + + initHtml(): string { + return ` + + + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: SystemCpuSummary, b: SystemCpuSummary) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key === 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } + +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCpuByProcess.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCpuByProcess.ts index 5537ba5..21d381c 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCpuByProcess.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCpuByProcess.ts @@ -62,21 +62,26 @@ export class TabPaneCpuByProcess extends BaseElement { initHtml(): string { return ` - - - - - - - - - + + + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCpuByThread.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCpuByThread.ts index 69192dd..8248c2a 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCpuByThread.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCpuByThread.ts @@ -64,23 +64,30 @@ export class TabPaneCpuByThread extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - + + + + + + + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCpuUsage.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCpuUsage.ts index e66a633..8d3b9b1 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCpuUsage.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCpuUsage.ts @@ -152,24 +152,32 @@ export class TabPaneCpuUsage extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + `; } } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/host/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index 6ffdaf1..5757273 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -20,8 +20,10 @@ import "../../../../base-ui/table/lit-table-column.js"; import { queryBinderArgsByArgset, - queryWakeUpThread_WakeThread, - queryWakeUpThread_WakeTime + queryThreadWakeUp, + queryThreadWakeUpFrom, + queryWakeUpFromThread_WakeThread, + queryWakeUpFromThread_WakeTime, } from "../../../database/SqlLite.js"; import {WakeupBean} from "../../../bean/WakeupBean.js"; import {ThreadStruct} from "../../../bean/ThreadStruct.js"; @@ -127,7 +129,7 @@ export class TabPaneCurrentSelection extends BaseElement { list.push({name: 'Duration', value: getTimeString(data.dur || 0)}) list.push({name: 'Prio', value: data.priority || 0}) list.push({name: 'End State', value: state}) - this.queryWakeUpData(data).then((bean) => { + this.queryCPUWakeUpFromData(data).then((bean) => { if (callback) { callback(bean) } @@ -209,7 +211,7 @@ export class TabPaneCurrentSelection extends BaseElement { } - setThreadData(data: ThreadStruct, scrollCallback: ((d: any) => void) | undefined) {//线程信息 + setThreadData(data: ThreadStruct, scrollCallback: ((d: any) => void) | undefined,scrollWakeUp:(d:any) => void | undefined) {//线程信息 this.initCanvas() let leftTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector("#leftTitle"); let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector("#rightTitle"); @@ -217,7 +219,7 @@ export class TabPaneCurrentSelection extends BaseElement { rightTitle.style.visibility = "hidden" } if (leftTitle) { - leftTitle.innerText = "Counter Details" + leftTitle.innerText = "Thread State" } let list: any[] = [] list.push({name: 'StartTime', value: getTimeString(data.startTime || 0)}) @@ -248,21 +250,76 @@ export class TabPaneCurrentSelection extends BaseElement { processName = data.name; } list.push({name: 'Process', value: processName + " [" + data.pid + "] "}) - this.tbl!.dataSource = list - this.tbl?.shadowRoot?.querySelector("#state-click")?.addEventListener("click", () => { - //线程点击 - if (scrollCallback) { - scrollCallback(data) + let cpu = new CpuStruct(); + cpu.id = data.id; + cpu.startTime = data.startTime; + Promise.all([this.queryThreadWakeUpFromData(data.id!,data.startTime!,data.dur!),this.queryThreadWakeUpData(data.id!,data.startTime!,data.dur!)]).then((result)=>{ + let fromBean = result[0] + let wakeUps = result[1]; + if(fromBean != null && fromBean != undefined && fromBean.pid != 0 && fromBean.tid != 0){ + list.push({ + name: 'wakeup from tid', value: `
      +
      ${fromBean.tid}
      + +
      ` + }) + } + if(wakeUps != null){ + for (let key in wakeUps) { + list.push({ + name: 'wakeup tid', value: `
      +
      ${wakeUps[key].tid}
      + +
      ` + }) + } + } + this.tbl!.dataSource = list + this.tbl?.shadowRoot?.querySelector("#state-click")?.addEventListener("click", () => { + //线程点击 + if (scrollCallback) { + scrollCallback(data) + } + }) + this.tbl?.shadowRoot?.querySelector("#wakeup-from")?.addEventListener("click", (e) => { + //点击跳转,唤醒和被唤醒的 线程 + if(fromBean && scrollWakeUp){ + scrollWakeUp({ + processId: fromBean.pid, + tid: fromBean.tid, + startTime: fromBean.ts, + }) + } + }) + if(wakeUps){ + for (let key in wakeUps) { + this.tbl?.shadowRoot?.querySelector(`#wakeup-${key}`)?.addEventListener("click", (e) => { + //点击跳转,唤醒和被唤醒的 线程 + let up = wakeUps[key]; + if(up && scrollWakeUp != undefined){ + scrollWakeUp({ + tid: up.tid, + startTime: up.ts, + processId:up.pid, + }) + } + }) + } } }) } - async queryWakeUpData(data: CpuStruct) { + /** + * 查询出 线程被唤醒的 线程信息 + * @param data + */ + async queryCPUWakeUpFromData(data: CpuStruct) { + // console.log(data); let wb: WakeupBean | null = null if (data.id == undefined || data.startTime == undefined) { return null } - let wakeupTimes = await queryWakeUpThread_WakeTime(data.id, data.startTime)// 3,4835380000 + let wakeupTimes = await queryWakeUpFromThread_WakeTime(data.id, data.startTime)// 3,4835380000 if (wakeupTimes != undefined && wakeupTimes.length > 0) { let wakeupTime = wakeupTimes[0] if (wakeupTime.wakeTs != undefined && wakeupTime.preRow != undefined && wakeupTime.wakeTs < wakeupTime.preRow) { @@ -271,7 +328,7 @@ export class TabPaneCurrentSelection extends BaseElement { if (wakeupTime.wakeTs == undefined) { return null } - let wakeupBeans = await queryWakeUpThread_WakeThread(wakeupTime.wakeTs) + let wakeupBeans = await queryWakeUpFromThread_WakeThread(wakeupTime.wakeTs) if (wakeupBeans != undefined && wakeupBeans.length > 0) { wb = wakeupBeans[0] if (wb != null) { @@ -292,6 +349,32 @@ export class TabPaneCurrentSelection extends BaseElement { return wb } + /** + * 查询出 线程唤醒了哪些线程信息 + * @param data + */ + async queryThreadWakeUpFromData(itid: number, startTime: number,dur:number) : Promise { + let wakeUps = await queryThreadWakeUpFrom(itid, startTime,dur)// 3,4835380000 + if (wakeUps != undefined && wakeUps.length > 0) { + return wakeUps[0]; + } + } + /** + * 查询出 线程唤醒了哪些线程信息 + * @param data + */ + async queryThreadWakeUpData(itid: number, startTime: number,dur:number) : Promise> { + let list :Array = []; + if (itid == undefined || startTime == undefined) { + return list + } + let wakeUps = await queryThreadWakeUp(itid, startTime,dur)// 3,4835380000 + if (wakeUps != undefined && wakeUps.length > 0) { + list.push(...wakeUps) + } + return list + } + initCanvas(): HTMLCanvasElement | null { let canvas = this.shadowRoot!.querySelector("#rightDraw") let width = getComputedStyle(this.tbl!).getPropertyValue("width") @@ -342,7 +425,7 @@ export class TabPaneCurrentSelection extends BaseElement { let strList = [] strList.push("wakeup @ " + getTimeString(wakeupBean?.wakeupTime || 0) + " on CPU " + wakeupBean?.cpu + " by") strList.push("P:" + wakeupBean?.process + " [ " + wakeupBean?.pid + " ]") - strList.push("F:" + wakeupBean?.thread + " [ " + wakeupBean?.tid + " ]") + strList.push("T:" + wakeupBean?.thread + " [ " + wakeupBean?.tid + " ]") strList.forEach((str, index) => { if (context != null) { context.fillText(str, 40, 40 + 16 * index) @@ -446,5 +529,4 @@ export class TabPaneCurrentSelection extends BaseElement {
      `; } - } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneDiskAbility.ts b/host/ide/src/trace/component/trace/sheet/TabPaneDiskAbility.ts new file mode 100644 index 0000000..6469888 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneDiskAbility.ts @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabDiskAbilityData} from "../../../database/SqlLite.js"; +import {SystemDiskIOSummary} from "../../../bean/AbilityMonitor.js"; +import {Utils} from "../base/Utils.js"; +import {ColorUtils} from "../base/ColorUtils.js"; +import "../../../component/SpFilter.js"; + +@element('tabpane-disk-ability') +export class TabPaneDiskAbility extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private queryResult: Array = [] + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-disk-ability'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl!.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl!.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toDiskAbilityArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toDiskAbilityArray(systemDiskIOSummary: SystemDiskIOSummary): any[] { + let array: Array = [] + array.push(systemDiskIOSummary.startTimeStr) + array.push(systemDiskIOSummary.durationStr) + array.push(systemDiskIOSummary.dataReadStr) + array.push(systemDiskIOSummary.dataReadSecStr) + array.push(systemDiskIOSummary.dataWriteStr) + array.push(systemDiskIOSummary.readsInStr) + array.push(systemDiskIOSummary.readsInSecStr) + array.push(systemDiskIOSummary.writeOutStr) + array.push(systemDiskIOSummary.writeOutSecStr) + return array + } + + queryDataByDB(val: SelectionParam | any) { + getTabDiskAbilityData(val.leftNs, val.rightNs).then((result) => { + if (result.length != null && result.length > 0) { + for (const systemDiskIOSummary of result) { + if (systemDiskIOSummary.startTime <= 0) { + systemDiskIOSummary.startTimeStr = '0:000.000.000'; + } else { + systemDiskIOSummary.startTimeStr = Utils.getTimeStampHMS(systemDiskIOSummary.startTime); + } + systemDiskIOSummary.durationStr = Utils.getDurString(systemDiskIOSummary.duration); + systemDiskIOSummary.dataReadStr = systemDiskIOSummary.dataRead + "KB"; + systemDiskIOSummary.dataReadSecStr = systemDiskIOSummary.dataReadSec + "KB/S"; + systemDiskIOSummary.dataWriteStr = systemDiskIOSummary.dataWrite + "KB"; + systemDiskIOSummary.dataWriteSecStr = systemDiskIOSummary.dataWriteSec + "KB/S"; + systemDiskIOSummary.readsInStr = ColorUtils.formatNumberComma(systemDiskIOSummary.readsIn); + systemDiskIOSummary.readsInSecStr = systemDiskIOSummary.readsInSec.toString(); + systemDiskIOSummary.writeOutStr = ColorUtils.formatNumberComma(systemDiskIOSummary.writeOut); + systemDiskIOSummary.writeOutSecStr = systemDiskIOSummary.writeOutSec.toString(); + } + this.source = result; + this.queryResult = result; + this.tbl!.recycleDataSource = result; + } else { + this.source = []; + this.queryResult = [] + this.tbl!.recycleDataSource = [] + } + }) + } + + initHtml(): string { + return ` + + + + + + + + + + + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: SystemDiskIOSummary, b: SystemDiskIOSummary) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key === 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } + +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneFilter.ts b/host/ide/src/trace/component/trace/sheet/TabPaneFilter.ts index 4ce88d3..60f4ec3 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneFilter.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneFilter.ts @@ -18,347 +18,722 @@ import "../../../../base-ui/select/LitSelect.js"; import "../../../../base-ui/select/LitSelectOption.js"; import '../../../../base-ui/icon/LitIcon.js' import {LitIcon} from "../../../../base-ui/icon/LitIcon.js"; +import {LitSelect} from "../../../../base-ui/select/LitSelect.js"; +import "../../../../base-ui/popover/LitPopoverV.js" +import {LitCheckBox} from "../../../../base-ui/checkbox/LitCheckBox.js"; -export interface FilterData{ - inputValue:string, - firstSelect:string|null|undefined, - secondSelect:string|null|undefined, - mark:boolean|null|undefined, - icon:string|null, +export interface FilterData { + inputValue: string, + firstSelect: string | null | undefined, + secondSelect: string | null | undefined, + mark: boolean | null | undefined, + icon: string | null, +} + +export interface MiningData { + type: string, + item: any | null | undefined, + remove?: Array | null | undefined, } @element('tab-pane-filter') export class TabPaneFilter extends BaseElement { - private filterInputEL: HTMLInputElement | null | undefined; - private firstSelectEL: HTMLSelectElement | null | undefined; - private secondSelectEL: HTMLSelectElement | null | undefined; - private markButtonEL: HTMLButtonElement | null | undefined; - private iconEL: LitIcon | null | undefined; - private getFilter: ((e:FilterData)=>void) | undefined; - - initElements(): void { - // this.firstSelectEL = this.shadowRoot?.querySelector("#first-select") - // this.secondSelectEL = this.shadowRoot?.querySelector("#second-select") - this.filterInputEL = this.shadowRoot?.querySelector("#filter-input") - this.markButtonEL = this.shadowRoot?.querySelector("#mark") - this.iconEL = this.shadowRoot?.querySelector("#icon") - - this.iconEL!.onclick=(e)=>{ - if (this.iconEL!.name == "statistics") { - this.iconEL!.name = "menu"; - this.iconEL!.size = 18; - if (this.getFilter) { - this.getFilter({ - inputValue:this.filterInputEL!.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:false, - icon:this.icon - }) - } - }else if (this.iconEL!.name == "menu") { - this.iconEL!.name = "statistics"; - this.iconEL!.size = 16; - if (this.getFilter) { - this.getFilter({ - inputValue:this.filterInputEL!.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:false, - icon:this.icon - }) - } - } - } - - this.markButtonEL!.onclick=(e)=>{ - if (this.getFilter) { - this.getFilter({ - inputValue:this.filterInputEL!.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:true, - icon:this.icon - }) - } - } - - this.filterInputEL?.addEventListener("keydown", (event:any) => { - if (event.keyCode == 13) { - this.iconEL!.name="menu" - if (this.getFilter) { - this.getFilter({ - inputValue:event.target.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:false, - icon:this.icon - }) - } - } - }); - - // this.firstSelectEL!.onchange = (e)=>{ - // if (this.getFilter) { - // this.getFilter({ - // inputValue:this.filterInputEL!.value, - // firstSelect:this.firstSelectEL?.value, - // secondSelect:this.secondSelectEL?.value, - // mark:false - // }) - // } - // } - // this.secondSelectEL!.onchange = (e)=>{ - // if (this.getFilter) { - // this.getFilter({ - // inputValue:this.filterInputEL!.value, - // firstSelect:this.firstSelectEL?.value, - // secondSelect:this.secondSelectEL?.value, - // mark:false - // }) - // } - // } - this.setSelectList() - } - - set firstSelect(value:string){ - this.firstSelectEL!.value = value; - } - - get firstSelect(){ - return this.firstSelectEL?.value||"" - } - - set secondSelect(value:string){ - this.secondSelectEL!.value = value; - } - - get secondSelect(){ - return this.secondSelectEL?.value||"" - } - - set filterValue(value:string){ - this.filterInputEL!.value = value; - } - get filterValue(){ - return this.filterInputEL!.value - } - - get inputPlaceholder(){ - return this.getAttribute("inputPlaceholder") || "Detail Filter"; - } - - get icon(){ - if (this.getAttribute("icon") != "false") { - if (this.iconEL!.name == "statistics") { - return "tree" - }else if (this.iconEL!.name == "menu") { - return "block" - }else { - return "" - } - } else { - return ""; - } - } - - set icon(value:string){ - if (value == "block") { - this.iconEL!.name = "menu"; - this.iconEL!.size = 18; - }else if (value == "tree") { - this.iconEL!.name = "statistics"; - this.iconEL!.size = 16; - } - } - - - getFilterData(getFilter:(v:FilterData)=>void){ - this.getFilter = getFilter - } - - setSelectList(firstList :Array|null|undefined = [ "All Allocations" ,"Created & Existing" ,"Created & Destroyed" ], - secondList :Array|null|undefined = ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"]){ - if (!firstList && !secondList) return; - let sLE = this.shadowRoot?.querySelector("#load") - let html = ``; - if (firstList) { - html += ` - Allocation Lifespan` - firstList!.forEach((a,b)=>{ - html+=`${a}` - }) - html+=`` - } - if (secondList) { - html+=` - Allocation Type` - secondList!.forEach((a,b)=>{ - html+=`${a}` - }) - html+=`` - } - if (!firstList) { - this.secondSelectEL!.outerHTML = html; - } else if (!secondList) { - this.firstSelectEL!.outerHTML = html; - }else { - sLE!.innerHTML=html; - } - - this.firstSelectEL = this.shadowRoot?.querySelector("#first-select") - this.secondSelectEL = this.shadowRoot?.querySelector("#second-select") - - this.firstSelectEL!.onchange = (e)=>{ - if (this.getFilter) { - this.getFilter({ - inputValue:this.filterInputEL!.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:false, - icon:this.icon - }) - } - } - this.secondSelectEL!.onchange = (e)=>{ - if (this.getFilter) { - this.getFilter({ - inputValue:this.filterInputEL!.value, - firstSelect:this.firstSelectEL?.value, - secondSelect:this.secondSelectEL?.value, - mark:false, - icon:this.icon - }) - } - } - - } - - initHtml(): string { - return ` - - -Input Filter - - -
      - -
      - - - - - - - - - - - - - Call Tree - Call Tree Constraints - Data Mining + + Input Filter + + +
      + +
      + +
      +
      Invert
      +
      Hide System so
      +
      + Options +
      + +
      + + + +
      +
      Constraints:Only enabled with data and while stopped;
      +
      filters data to thresholds.
      +
      + +
      +
      + Sample Count Filter +
      + +
      +
      + +
      +
      +
      Reset
      +
      +
      + Symbol Filter +
      + +
      +
      + +
      +
      +
      Reset
      +
      +
      + Library Filter +
      `; - } + } } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneFps.ts b/host/ide/src/trace/component/trace/sheet/TabPaneFps.ts index c98bab2..3114835 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneFps.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneFps.ts @@ -51,19 +51,20 @@ export class TabPaneFps extends BaseElement { initHtml(): string { return ` - - - - - - + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneHeap.ts b/host/ide/src/trace/component/trace/sheet/TabPaneHeap.ts index ae9da25..3fea46a 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneHeap.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneHeap.ts @@ -12,11 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import "../../../../base-ui/table/lit-table-column.js"; + +import "../../../../base-ui/table/lit-table-column.js"; import {BaseElement, element} from "../../../../base-ui/BaseElement.js"; import {LitTable} from "../../../../base-ui/table/lit-table.js"; import {SelectionParam} from "../../../bean/BoxSelection.js"; -import {queryHeapAllData, queryHeapAllTable, queryHeapTable, queryHeapTreeTable} from "../../../database/SqlLite.js"; +import {queryHeapAllData} from "../../../database/SqlLite.js"; import {Utils} from "../base/Utils.js"; import {HeapBean} from "../../../bean/HeapBean.js"; import {HeapTreeDataBean} from "../../../bean/HeapTreeDataBean.js"; @@ -27,145 +28,142 @@ export class TabPaneHeap extends BaseElement { private tbl: LitTable | null | undefined; private range: HTMLLabelElement | null | undefined; - initElements(): void { - this.tbl = this.shadowRoot?.querySelector('#tb-heap'); - this.range = this.shadowRoot?.querySelector('#time-range') - new ResizeObserver((entries) => { - if (this.parentElement?.clientHeight != 0) { - // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20)+"px" - this.tbl?.reMeauseHeight() - } - }).observe(this.parentElement!) - } - - - - set data(val: SelectionParam|any) { + set data(val: SelectionParam | any) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20)+"px" - queryHeapAllData(val.leftNs,val.rightNs,val.heapIds).then((allHeap)=>{ - if(allHeap.length>0){ - let groups:any = {}; - let treeGroup:any = {} - let treeData:HeapBean[] = [] - allHeap.forEach((heapData)=>{ + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20) + "px" + queryHeapAllData(val.leftNs, val.rightNs, val.heapIds).then((allHeap) => { + if (allHeap.length > 0) { + let groups: any = {}; + let treeGroup: any = {} + let treeData: HeapBean[] = [] + allHeap.forEach((heapData) => { groups[heapData.eventId] = heapData }) - SpSystemTrace.HEAP_FRAME_DATA.map((frame)=>{ - if(groups[frame.eventId]){ - treeGroup[frame.eventId] = treeGroup[frame.eventId]||[] + SpSystemTrace.HEAP_FRAME_DATA.map((frame) => { + if (groups[frame.eventId]) { + treeGroup[frame.eventId] = treeGroup[frame.eventId] || [] frame.heapSize = groups[frame.eventId].heapSize - frame.startTs = groups[frame.eventId].startTs + frame.startTs = groups[frame.eventId].startTs frame.endTs = groups[frame.eventId].endTs frame.eventType = groups[frame.eventId].eventType treeGroup[frame.eventId].push(frame) } }) - Object.keys(treeGroup).forEach((key)=>{ + Object.keys(treeGroup).forEach((key) => { if (treeGroup[key].length > 0) { - if(treeData.length>0){ - this.merageTree(0,treeData,treeGroup[key],val) - }else { + if (treeData.length > 0) { + this.merageTree(0, treeData, treeGroup[key], val) + } else { let currentData = new HeapBean() - let firstData = treeGroup[key][0] + let firstData = treeGroup[key][0] currentData.AllocationFunction = firstData.AllocationFunction currentData.depth = firstData.depth currentData.MoudleName = firstData.MoudleName treeData.push(currentData) - this.merageTree(0,treeData,treeGroup[key],val) + this.merageTree(0, treeData, treeGroup[key], val) } } }) this.setTreeDataSize(treeData) this.tbl!.recycleDataSource = treeData - }else { + } else { this.tbl!.recycleDataSource = [] } }) } - setTreeDataSize(list:HeapBean[]){ - list.forEach((item)=>{ + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-heap'); + this.range = this.shadowRoot?.querySelector('#time-range') + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + } + + setTreeDataSize(list: HeapBean[]) { + list.forEach((item) => { item.AllocationSize = Utils.getByteWithUnit(Number(item.AllocationSize)) item.DeAllocationSize = Utils.getByteWithUnit(Number(item.DeAllocationSize)) item.RemainingSize = Utils.getByteWithUnit(Number(item.RemainingSize)) - if(item.children.length>0){ + if (item.children.length > 0) { this.setTreeDataSize(item.children) } }) } - merageTree(depth: number,beanList:HeapBean[],list:HeapTreeDataBean[],selection: SelectionParam|any){ - if(beanList.length>0){ - if(depth < list.length){ - let treeData = list[depth] - let currentData = beanList.find((item)=>{ + merageTree(depth: number, beanList: HeapBean[], list: HeapTreeDataBean[], selection: SelectionParam | any) { + if (beanList.length > 0) { + if (depth < list.length) { + let treeData = list[depth] + let currentData = beanList.find((item) => { return treeData.MoudleName == item.MoudleName && treeData.AllocationFunction == item.AllocationFunction }) - if(currentData!=undefined){ - (currentData.Allocations as number) += selection.leftNstreeData.endTs?1:0; - (currentData.AllocationSize as number) += selection.leftNstreeData.endTs?treeData.heapSize:0; - ( currentData.Total as number) = (currentData.Allocations as number) - (currentData.Deallocations as number); + if (currentData != undefined) { + (currentData.Allocations as number) += selection.leftNs < treeData.startTs ? 1 : 0; + (currentData.Deallocations as number) += selection.rightNs > treeData.endTs ? 1 : 0; + (currentData.AllocationSize as number) += selection.leftNs < treeData.startTs ? treeData.heapSize : 0; + (currentData.DeAllocationSize as number) += selection.rightNs > treeData.endTs ? treeData.heapSize : 0; + (currentData.Total as number) = (currentData.Allocations as number) - (currentData.Deallocations as number); currentData.RemainingSize = (currentData.AllocationSize as number) - (currentData.DeAllocationSize as number) - }else { + } else { currentData = new HeapBean() currentData.AllocationFunction = treeData.AllocationFunction currentData.depth = treeData.depth currentData.MoudleName = (treeData.MoudleName as string); - (currentData.Allocations as number) += selection.leftNstreeData.endTs?1:0; - (currentData.AllocationSize as number) += selection.leftNstreeData.endTs?treeData.heapSize:0; + (currentData.Allocations as number) += selection.leftNs < treeData.startTs ? 1 : 0; + (currentData.Deallocations as number) += selection.rightNs > treeData.endTs ? 1 : 0; + (currentData.AllocationSize as number) += selection.leftNs < treeData.startTs ? treeData.heapSize : 0; + (currentData.DeAllocationSize as number) += selection.rightNs > treeData.endTs ? treeData.heapSize : 0; currentData.Total = (currentData.Allocations as number) - (currentData.Deallocations as number); currentData.RemainingSize = (currentData.AllocationSize as number) - (currentData.DeAllocationSize as number); beanList.push(currentData) } - if(depth+1 -:host{ - display: flex; - flex-direction: column; - padding: 10px 10px; -} - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneHistoryProcesses.ts b/host/ide/src/trace/component/trace/sheet/TabPaneHistoryProcesses.ts new file mode 100644 index 0000000..3f7c8c7 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneHistoryProcesses.ts @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabProcessHistoryData} from "../../../database/SqlLite.js"; +import {Utils} from "../base/Utils.js"; +import {ProcessHistory} from "../../../bean/AbilityMonitor.js"; +import "../../../component/SpFilter.js"; + +@element('tabpane-history-processes') +export class TabPaneHistoryProcesses extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private queryResult: Array = [] + private float: HTMLDivElement | null | undefined; + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-history-processes'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toProcessHistoryArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toProcessHistoryArray(process: ProcessHistory): any[] { + let array: Array = [] + array.push(process.processId.toString()) + array.push(process.processName) + array.push(process.alive) + array.push(process.firstSeen) + array.push(process.lastSeen) + array.push(process.responsibleProcess) + array.push(process.userName) + array.push(process.cpuTime) + return array + } + + queryDataByDB(val: SelectionParam | any) { + getTabProcessHistoryData(val.leftNs, val.rightNs, val.processId, val.threadId).then(item => { + if (item.length != null && item.length > 0) { + for (const processHistory of item) { + processHistory.alive = processHistory.alive == '0' ? 'No' : 'Yes' + if (Number(processHistory.firstSeen) <= 0) { + processHistory.firstSeen = '0:000.000.000'; + } else { + processHistory.firstSeen = Utils.getTimeStampHMS(Number(processHistory.firstSeen)) + } + processHistory.lastSeen = Utils.getTimeStampHMS(Number(processHistory.lastSeen)) + processHistory.processName = processHistory.processName + '(' + processHistory.processId + ')' + processHistory.cpuTime = this.timeFormat(Number(processHistory.cpuTime)) + } + this.source = item + this.queryResult = item; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.queryResult = [] + this.tbl!.recycleDataSource = []; + } + }) + } + + timeFormat(ms: number) : string { + let currentNs = ms + let minute1 = 60000 + let second1 = 1000; + let millisecond1 = 1; + let res = ""; + if (currentNs >= minute1) { + res += Math.floor(currentNs / minute1) + ":"; + currentNs = currentNs - Math.floor(ms / minute1) * minute1 + } + if (currentNs >= second1) { + res += Math.floor(currentNs / second1) + "."; + currentNs = currentNs - Math.floor(currentNs / second1) * second1; + res += Math.floor(currentNs / millisecond1) + "s "; + return res; + } + if (res == "") { + res = ms + "ms"; + } + return res + } + + initHtml(): string { + return ` + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: ProcessHistory, b: ProcessHistory) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else if (type === 'alive') { + let aaaa = 0; + let bbbb = 0; + // @ts-ignore + if (b[property] == "Yes") { + bbbb = 1; + } + // @ts-ignore + if (a[property] == "Yes") { + aaaa = 1; + } + if (aaaa - bbbb == 0) { + return 0; + } + return aaaa - bbbb ? -1 : 1 + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key === 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else if (detail.key === 'alive') { + this.source.sort(compare(detail.key, detail.sort, 'alive')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } + +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneLiveProcesses.ts b/host/ide/src/trace/component/trace/sheet/TabPaneLiveProcesses.ts new file mode 100644 index 0000000..cf19902 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneLiveProcesses.ts @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabLiveProcessData} from "../../../database/SqlLite.js"; +import {LiveProcess} from "../../../bean/AbilityMonitor.js"; +import "../../../component/SpFilter.js"; +import {Utils} from "../base/Utils.js"; + +@element('tabpane-live-processes') +export class TabPaneLiveProcesses extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private queryResult: Array = [] + private float: HTMLDivElement | null | undefined; + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-live-processes'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toLiveProcessArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toLiveProcessArray(liveProcess: LiveProcess): any[] { + let array: Array = [] + array.push(liveProcess.processId.toString()) + array.push(liveProcess.processName) + array.push(liveProcess.responsibleProcess) + array.push(liveProcess.userName) + array.push(liveProcess.threads.toString()) + array.push(liveProcess.cpu) + array.push(liveProcess.memory) + array.push(liveProcess.diskReads.toString()) + array.push(liveProcess.diskWrite.toString()) + return array + } + + queryDataByDB(val: SelectionParam | any) { + getTabLiveProcessData(val.leftNs, val.rightNs).then(item => { + if (item.length != null && item.length > 0) { + for (const liveProcess of item) { + liveProcess.processName = liveProcess.processName + '(' + liveProcess.processId + ')' + liveProcess.memory = Utils.getBinaryByteWithUnit(Number(liveProcess.memory)) + if (Number(liveProcess.cpu) > 0) { + liveProcess.cpu = Number(Number(liveProcess.cpu).toFixed(3)) + "%" + } else { + liveProcess.cpu = "0%"; + } + liveProcess.cpuTimeNumber = Number(liveProcess.cpuTime); + liveProcess.cpuTime = this.timeFormat(Number(liveProcess.cpuTime)) + } + this.source = item + this.queryResult = item; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.queryResult = [] + this.tbl!.recycleDataSource = []; + } + }) + } + + + timeFormat(ms: number): string { + let currentNs = ms + let minute1 = 60000 + let second1 = 1000; + let millisecond1 = 1; + let res = ""; + if (currentNs >= minute1) { + res += Math.floor(currentNs / minute1) + ":"; + currentNs = currentNs - Math.floor(ms / minute1) * minute1 + } + if (currentNs >= second1) { + res += Math.floor(currentNs / second1) + "."; + currentNs = currentNs - Math.floor(currentNs / second1) * second1; + res += Math.floor(currentNs / millisecond1) + "s "; + return res; + } + if (res == "") { + res = ms + "ms"; + } + return res + } + initHtml(): string { + return ` + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: LiveProcess, b: LiveProcess) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else if (type === 'cpuTime') { + return sort === 2 ? b.cpuTimeNumber - a.cpuTimeNumber : a.cpuTimeNumber - b.cpuTimeNumber; + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key == 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else if (detail.key == 'cpuTime') { + this.source.sort(compare(detail.key, detail.sort, 'cpuTime')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneMemoryAbility.ts b/host/ide/src/trace/component/trace/sheet/TabPaneMemoryAbility.ts new file mode 100644 index 0000000..faadcd1 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneMemoryAbility.ts @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabMemoryAbilityData, queryStartTime} from "../../../database/SqlLite.js"; +import {SystemMemorySummary} from "../../../bean/AbilityMonitor.js"; +import {Utils} from "../base/Utils.js"; +import "../../../component/SpFilter.js"; + +@element('tabpane-memory-ability') +export class TabPaneMemoryAbility extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private float: HTMLDivElement | null | undefined; + private queryResult: Array = [] + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-memory-ability'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toMemoryAbilityArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toMemoryAbilityArray(systemMemorySummary: SystemMemorySummary): any[] { + let array: Array = [] + array.push(systemMemorySummary.startTimeStr) + array.push(systemMemorySummary.durationStr) + array.push(systemMemorySummary.memoryTotal) + array.push(systemMemorySummary.cached) + array.push(systemMemorySummary.swapTotal) + return array + } + + queryDataByDB(val: SelectionParam | any) { + queryStartTime().then(res => { + let startTime = res[0].start_ts; + getTabMemoryAbilityData(val.leftNs + startTime, val.rightNs + startTime).then(items => { + this.source = [] + this.queryResult = []; + if (items.length != null && items.length > 0) { + let lastTime = 0; + for (const item of items) { + let systemMemorySummary = new SystemMemorySummary() + if (item.startTime - startTime <= 0) { + systemMemorySummary.startTimeStr = '0:000.000.000'; + } else { + systemMemorySummary.startTimeStr = Utils.getTimeStampHMS(item.startTime - startTime); + } + if (lastTime !== 0) { + systemMemorySummary.durationStr = Utils.getDurString(item.startTime - lastTime); + } else { + systemMemorySummary.durationStr = '-'; + } + lastTime = item.startTime; + let memorys = item.value.split(","); + let names = item.name.split(","); + if (memorys.length != names.length) { + continue; + } + for (let i = 0; i < names.length; i++) { + switch (names[i]) { + case "sys.mem.total": + systemMemorySummary.memoryTotal = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.free": + systemMemorySummary.memFree = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.buffers": + systemMemorySummary.buffers = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.cached": + systemMemorySummary.cached = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.shmem": + systemMemorySummary.shmem = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.slab": + systemMemorySummary.slab = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.swap.total": + systemMemorySummary.swapTotal = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.swap.free": + systemMemorySummary.swapFree = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.mapped": + systemMemorySummary.mapped = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.vmalloc.used": + systemMemorySummary.vmallocUsed = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.page.tables": + systemMemorySummary.pageTables = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.kernel.stack": + systemMemorySummary.kernelStack = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.active": + systemMemorySummary.active = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.inactive": + systemMemorySummary.inactive = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.unevictable": + systemMemorySummary.unevictable = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.vmalloc.total": + systemMemorySummary.vmallocTotal = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.slab.unreclaimable": + systemMemorySummary.sUnreclaim = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.cma.total": + systemMemorySummary.cmaTotal = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.cma.free": + systemMemorySummary.cmaFree = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.kernel.reclaimable": + systemMemorySummary.kReclaimable = Utils.getBinaryByteWithUnit(Number(memorys[i])) + break; + case "sys.mem.zram": + systemMemorySummary.zram = Utils.getBinaryByteWithUnit(Number(memorys[i]) * 1000) + break; + } + } + this.source.push(systemMemorySummary); + } + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + }) + + }); + } + + initHtml(): string { + return ` + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: SystemMemorySummary, b: SystemMemorySummary) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key === 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } +} + + diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneNMCallInfo.ts b/host/ide/src/trace/component/trace/sheet/TabPaneNMCallInfo.ts index 0ad18bf..ac878c7 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneNMCallInfo.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneNMCallInfo.ts @@ -22,31 +22,40 @@ import {SpSystemTrace} from "../../SpSystemTrace.js"; import {Utils} from "../base/Utils.js"; import "./TabPaneFilter.js" import {FilterData, TabPaneFilter} from "./TabPaneFilter"; +import "../../FrameChart.js"; +import {FrameChart} from "../../FrameChart.js"; +import {ChartMode} from "../../../database/ProcedureWorkerCommon.js"; + @element('tabpane-native-callinfo') export class TabPaneNMCallInfo extends BaseElement { private tbl: LitTable | null | undefined; private tblData: LitTable | null | undefined; private source: Array = [] + private rightSource: Array = [] private queryResult: Array = [] - private native_type:Array = ["All Heap & Anonymous VM","All Heap","All Anonymous VM"]; - private filterAllocationType:string = "0" - private filterNativeType:string = "0" - private currentSelection:SelectionParam|undefined + private native_type: Array = ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"]; + private filterAllocationType: string = "0" + private filterNativeType: string = "0" + private currentSelection: SelectionParam | undefined + private frameChart: FrameChart | null | undefined; + private isChartShow: boolean = false; + private selectTotalSize = 0; + set data(val: SelectionParam | any) { - if(val!=this.currentSelection){ + if (val != this.currentSelection) { this.currentSelection = val this.initFilterTypes() } - let types:Array = [] - if(val.nativeMemory.indexOf(this.native_type[0]) != -1){ + let types: Array = [] + if (val.nativeMemory.indexOf(this.native_type[0]) != -1) { types.push("'AllocEvent'"); types.push("'MmapEvent'"); - }else{ - if(val.nativeMemory.indexOf(this.native_type[1]) != -1){ + } else { + if (val.nativeMemory.indexOf(this.native_type[1]) != -1) { types.push("'AllocEvent'"); } - if(val.nativeMemory.indexOf(this.native_type[2]) != -1){ + if (val.nativeMemory.indexOf(this.native_type[2]) != -1) { types.push("'MmapEvent'"); } } @@ -58,76 +67,79 @@ export class TabPaneNMCallInfo extends BaseElement { this.tblData?.recycleDataSource = []; // @ts-ignore this.tbl?.recycleDataSource = []; - queryNativeHookEventTid(val.leftNs,val.rightNs,types).then((result)=>{ - if(result.length > 0){ - this.queryResult = result + queryNativeHookEventTid(val.leftNs, val.rightNs, types).then((result) => { + if (result.length > 0) { + this.queryResult = result; this.source = this.handleQueryResult(result); - }else{ + } else { this.source = []; + this.frameChart!.data = []; + this.frameChart?.clearCanvas(); } this.filterQueryData() }) } - handleQueryResult(result:Array):Array{ - let resultMap = new Map(); - result.map((r)=>{ - resultMap.set(r.eventId,r); - }) - let map = new Map(); + handleQueryResult(result: Array): Array { + let resultMap = new Map(); + result.map((r) => { + resultMap.set(r.eventId, r); + }); + let map = new Map(); SpSystemTrace.HEAP_FRAME_DATA.map((frame) => { let frameEventId = parseInt(frame.eventId); - if(frameEventId >= result[0].eventId && frameEventId <= result[result.length - 1].eventId){ - if(resultMap.has(frameEventId)){ + if (frameEventId >= result[0].eventId && frameEventId <= result[result.length - 1].eventId) { + if (resultMap.has(frameEventId)) { let hook = resultMap.get(frameEventId); - if(hook != undefined){ + if (hook != undefined) { let target = new NativeHookCallInfo(); target.id = frame.eventId + "_" + frame.depth; target.eventId = frameEventId; target.depth = frame.depth; target.count = 1; - target.heapSize = hook.heapSize; + target.size = hook.heapSize; target.threadId = hook.tid; - target.heapSizeStr = Utils.getByteWithUnit(target.heapSize); + target.heapSizeStr = Utils.getByteWithUnit(target.size); let sym_arr = frame.AllocationFunction?.split("/"); let lib_arr = frame.MoudleName?.split("/"); target.symbol = sym_arr![sym_arr!.length - 1]; target.library = lib_arr![lib_arr!.length - 1]; target.title = `[ ${target.symbol} ] ${target.library}`; target.type = (target.library.endsWith(".so.1") || target.library.endsWith(".dll") || target.library.endsWith(".so")) ? 0 : 1; - if(map.has(frame.eventId)){ + if (map.has(frame.eventId)) { let src = map.get(frame.eventId); - this.listToTree(target,src!); - }else{ - map.set(frame.eventId,target); + this.listToTree(target, src!); + } else { + map.set(frame.eventId, target); } } } } - if(frameEventId > result[result.length -1].eventId){ + if (frameEventId > result[result.length - 1].eventId) { return false; } }); - let groupMap = new Map>(); + let groupMap = new Map>(); for (let value of map.values()) { - let key = value.threadId+ "_" + value.symbol; - if(groupMap.has(key)){ + let key = value.threadId + "_" + value.symbol; + if (groupMap.has(key)) { groupMap.get(key)!.push(value); - }else{ - let arr:Array = []; + } else { + let arr: Array = []; arr.push(value); - groupMap.set(key,arr); + groupMap.set(key, arr); } } - let data:Array = []; + let data: Array = []; for (let arr of groupMap.values()) { - if(arr.length > 1){ + if (arr.length > 1) { for (let i = 1; i < arr.length; i++) { - if(arr[i].children.length > 0){ - this.mergeTree(arr[i].children[0],arr[0]); - }else{ - arr[0].heapSize += arr[i].heapSize; - arr[0].heapSizeStr = Utils.getByteWithUnit(arr[0].heapSize); + if (arr[i].children.length > 0) { + this.mergeTree(arr[i].children[0], arr[0]); + } else { + arr[0].size += arr[i].size; + arr[0].heapSizeStr = Utils.getByteWithUnit(arr[0].size); + } } } @@ -137,109 +149,137 @@ export class TabPaneNMCallInfo extends BaseElement { return this.groupByWithTid(data) } - groupByWithTid(data:Array):Array{ - let tidMap = new Map(); + groupByWithTid(data: Array): Array { + let tidMap = new Map(); for (let call of data) { - call.pid = "tid_"+call.threadId; - if(tidMap.has(call.threadId)){ + call.pid = "tid_" + call.threadId; + if (tidMap.has(call.threadId)) { let tidCall = tidMap.get(call.threadId); - tidCall!.heapSize += call.heapSize; - tidCall!.heapSizeStr = Utils.getByteWithUnit(tidCall!.heapSize); + tidCall!.size += call.size; + tidCall!.heapSizeStr = Utils.getByteWithUnit(tidCall!.size); tidCall!.count += call.count; tidCall!.children.push(call); - }else{ + } else { let tidCall = new NativeHookCallInfo(); tidCall.id = "tid_" + call.threadId; tidCall.count = call.count; - tidCall.heapSize = call.heapSize; - tidCall.heapSizeStr = Utils.getByteWithUnit(call.heapSize); + tidCall.size = call.size; + tidCall.heapSizeStr = Utils.getByteWithUnit(call.size); tidCall.title = "Thread " + call.threadId; + tidCall.symbol = tidCall.title; tidCall.type = -1; tidCall.children.push(call); - tidMap.set(call.threadId,tidCall); + tidMap.set(call.threadId, tidCall); } } - return Array.from(tidMap.values()); + this.source = data; + let showData = Array.from(tidMap.values()) + this.frameChart!.mode = ChartMode.Byte; + this.frameChart!.data = showData; + this.frameChart?.updateCanvas(true); + this.frameChart?.calculateChartData(); + return showData; } - listToTree(target:NativeHookCallInfo,src:NativeHookCallInfo){ - if(target.depth == src.depth + 1){ + listToTree(target: NativeHookCallInfo, src: NativeHookCallInfo) { + if (target.depth == src.depth + 1) { target.pid = src.id; src.children.push(target) - }else{ - if(src.children.length > 0){ - this.listToTree(target,src.children[0]); + } else { + if (src.children.length > 0) { + this.listToTree(target, src.children[0]); } } } - mergeTree(target:NativeHookCallInfo,src:NativeHookCallInfo){ + mergeTree(target: NativeHookCallInfo, src: NativeHookCallInfo) { let len = src.children.length; - if(len == 0){ + if (len == 0) { target.pid = src.id; - src.heapSize += target.heapSize; - src.heapSizeStr = Utils.getByteWithUnit(src.heapSize); + src.size += target.size; + src.heapSizeStr = Utils.getByteWithUnit(src.size); src.children.push(target); - }else{ + } else { let index = src.children.findIndex((hook) => hook.symbol == target.symbol && hook.depth == target.depth); - src.heapSize += target.heapSize; - src.heapSizeStr = Utils.getByteWithUnit(src.heapSize); - if(index != -1){ - let srcChild = src.children[index]; + src.size += target.size; + src.heapSizeStr = Utils.getByteWithUnit(src.size); + if (index != -1) { + let srcChild = src.children[index]; srcChild.count += 1; - if(target.children.length > 0){ - this.mergeTree(target.children[0],srcChild) - }else{ - srcChild.heapSize += target.heapSize; - srcChild.heapSizeStr = Utils.getByteWithUnit(srcChild.heapSize) + if (target.children.length > 0) { + this.mergeTree(target.children[0], srcChild) + } else { + srcChild.size += target.size; + srcChild.heapSizeStr = Utils.getByteWithUnit(srcChild.size) + } - }else{ + } else { target.pid = src.id; src.children.push(target) } } } - setRightTableData(hook:NativeHookCallInfo){ - let arr:Array = []; + getParentTree(src: Array, target: NativeHookCallInfo, parents: Array): boolean { + for (let hook of src) { + if (hook.id == target.id) { + parents.push(hook) + return true + } else { + if (this.getParentTree(hook.children as Array, target, parents)) { + parents.push(hook); + return true; + } + } + } + return false; + } + + getChildTree(src: Array, eventId: number, children: Array): boolean { + for (let hook of src) { + if (hook.eventId == eventId && hook.children.length == 0) { + children.push(hook) + return true + } else { + if (this.getChildTree(hook.children as Array, eventId, children)) { + children.push(hook); + return true; + } + } + } + return false; + } + + setRightTableData(hook: NativeHookCallInfo) { + let parents: Array = []; + let children: Array = []; + this.getParentTree(this.source, hook, parents); let maxEventId = hook.eventId; let maxHeap = 0; - function findMaxStack(hook:NativeHookCallInfo){ - if(hook.children.length == 0){ - if(hook.heapSize > maxHeap){ - maxHeap = hook.heapSize; + + function findMaxStack(hook: NativeHookCallInfo) { + if (hook.children.length == 0) { + if (hook.size > maxHeap) { + maxHeap = hook.size; maxEventId = hook.eventId; } - }else{ - hook.children.map((hookChild)=>{ - findMaxStack(hookChild); + } else { + hook.children.map((hookChild) => { + findMaxStack(hookChild); }) } } + findMaxStack(hook); - SpSystemTrace.HEAP_FRAME_DATA.map((frame) => { - let eventId = parseInt(frame.eventId); - if(eventId == maxEventId){ - let target = new NativeHookCallInfo(); - target.eventId = eventId; - target.depth = frame.depth; - let sym_arr = frame.AllocationFunction?.split("/"); - let lib_arr = frame.MoudleName?.split("/"); - target.symbol = sym_arr![sym_arr!.length - 1]; - target.library = lib_arr![lib_arr!.length - 1]; - target.title = `[ ${target.symbol} ] ${target.library}`; - target.type = (target.library.endsWith(".so.1") || target.library.endsWith(".dll") || target.library.endsWith(".so")) ? 0 : 1; - arr.push(target); - } - if(eventId > maxEventId){ - return false; - } - }); - // @ts-ignore - this.tblData?.recycleDataSource = arr; + this.getChildTree(hook.children as Array, maxEventId, children); + this.rightSource = parents.reverse().concat(children.reverse()); + let len = this.rightSource.length; + // @ts-ignore + this.tblData?.recycleDataSource = len == 0 ? [] : this.rightSource.slice(1, len); + } - initFilterTypes(){ + initFilterTypes() { let filter = this.shadowRoot?.querySelector("#filter") this.queryResult = [] filter!.firstSelect = "0" @@ -248,97 +288,214 @@ export class TabPaneNMCallInfo extends BaseElement { this.filterNativeType = "0" } + sortTreeByColumn(column: string, sort: number) { + this.tbl!.recycleDataSource = this.sortTree(this.source, column, sort) + } + + sortTree(arr: Array, column: string, sort: number): Array { + let sortArr = arr.sort((a, b) => { + if (column == 'size') { + if (sort == 0) { + return a.eventId - b.eventId; + } else if (sort == 1) { + return a.size - b.size; + } else { + return b.size - a.size; + } + } else { + if (sort == 0) { + return a.eventId - b.eventId; + } else if (sort == 1) { + return a.count - b.count; + } else { + return b.count - a.count; + } + } + }) + sortArr.map((call) => { + call.children = this.sortTree(call.children as Array, column, sort); + }) + return sortArr; + } + initElements(): void { this.tbl = this.shadowRoot?.querySelector('#tb-native-callinfo'); this.tblData = this.shadowRoot?.querySelector('#tb-native-data'); + this.frameChart = this.shadowRoot?.querySelector('#framechart'); + let pageTab = this.shadowRoot?.querySelector('#show_table'); + let pageChart = this.shadowRoot?.querySelector('#show_chart'); this.tbl!.addEventListener("row-click", (e) => { // @ts-ignore - let data = (e.detail as NativeHookCallInfo) + let data = (e.detail.data as NativeHookCallInfo); + (data as any).isSelected = true this.setRightTableData(data); + this.tblData?.clearAllSelection(data) + this.tblData?.setCurrentSelection(data) + // @ts-ignore + if ((e.detail as any).callBack) { + // @ts-ignore + (e.detail as any).callBack(true) + } + }) + this.tblData!.addEventListener("row-click", (e) => { + this.tbl!.expandList(this.rightSource) + // @ts-ignore + let detail = e.detail.data as NativeHookCallInfo; + this.tbl?.clearAllSelection(detail) + detail.isSelected = true + this.tbl!.scrollToData(this.rightSource[detail.depth + 1]) + // @ts-ignore + if ((e.detail as any).callBack) { + // @ts-ignore + (e.detail as any).callBack(true) + } }) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortTreeByColumn(evt.detail.key == "count" ? 'count' : 'size', evt.detail.sort) + }); + let filterHeight = 0; new ResizeObserver((entries) => { + if(this.parentElement!.scrollTop != 0){ + this.parentElement!.scrollTo(0,0); + } + let tabPaneFilter = this.shadowRoot!.querySelector("#filter") as HTMLElement; + if (tabPaneFilter.clientHeight > 0) filterHeight = tabPaneFilter.clientHeight; + if (this.parentElement!.clientHeight > filterHeight) { + tabPaneFilter.style.display = "flex"; + } else { + tabPaneFilter.style.display = "none"; + } if (this.parentElement?.clientHeight != 0) { + if (!this.isChartShow) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) + "px" + this.tbl?.reMeauseHeight() + } else { + // @ts-ignore + this.frameChart?.updateCanvas(false,entries[0].contentRect.width); + this.frameChart?.calculateChartData(); + } // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight)-10-31+"px"; - this.tbl?.reMeauseHeight() + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) - 10 - 31 + "px"; + this.tbl?.reMeauseHeight(); // @ts-ignore - this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) -10+"px" + this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) - 10 - 31 + "px"; this.tblData?.reMeauseHeight() } }).observe(this.parentElement!); - this.shadowRoot?.querySelector("#filter")!.getFilterData((data:FilterData)=>{ - this.filterAllocationType = data.firstSelect||"0" - this.filterNativeType = data.secondSelect||"0" + this.shadowRoot?.querySelector("#filter")!.getFilterData((data: FilterData) => { + if (data.icon == 'block') { + pageChart?.setAttribute('class', 'show'); + pageTab?.setAttribute('class', ''); + this.isChartShow = true; + } else if (data.icon == 'tree') { + pageChart?.setAttribute('class', ''); + pageTab?.setAttribute('class', 'show'); + this.isChartShow = false; + } + this.filterAllocationType = data.firstSelect || "0" + this.filterNativeType = data.secondSelect || "0" this.filterQueryData() - }) + }); + + this.parentElement!.onscroll = () => { + this.frameChart!.tabPaneScrollTop = this.parentElement!.scrollTop; + }; this.initFilterTypes() } - filterQueryData(){ - if (this.queryResult.length > 0&&this.currentSelection) { - let filter = this.queryResult.filter((item)=>{ - let filterAllocation = true - let filterNative = true - if(this.filterAllocationType=="1"){ - filterAllocation = item.startTs>=this.currentSelection!.leftNs&&item.startTs<=this.currentSelection!.rightNs&&item.endTs>this.currentSelection!.rightNs - }else if(this.filterAllocationType=="2"){ - filterAllocation = item.startTs>=this.currentSelection!.leftNs&&item.startTs<=this.currentSelection!.rightNs&&item.endTs<=this.currentSelection!.rightNs + filterQueryData() { + if (this.queryResult.length > 0 && this.currentSelection) { + let filter = this.queryResult.filter((item) => { + let filterAllocation = true; + let filterNative = true; + if (this.filterAllocationType == "1") { + filterAllocation = item.startTs >= this.currentSelection!.leftNs && item.startTs <= this.currentSelection!.rightNs && item.endTs > this.currentSelection!.rightNs + } else if (this.filterAllocationType == "2") { + filterAllocation = item.startTs >= this.currentSelection!.leftNs && item.startTs <= this.currentSelection!.rightNs && item.endTs <= this.currentSelection!.rightNs } - if(this.filterNativeType=="1"){ + if (this.filterNativeType == "1") { filterNative = item.eventType == "AllocEvent" - }else if(this.filterNativeType=="2"){ + } else if (this.filterNativeType == "2") { filterNative = item.eventType == "MmapEvent" } - return filterAllocation&&filterNative - }) - if(filter.length>0){ + return filterAllocation && filterNative + }); + if (filter.length > 0) { this.source = this.handleQueryResult(filter); this.tbl!.recycleDataSource = this.source; - }else { + } else { this.source = [] this.tbl!.recycleDataSource = []; + this.frameChart!.data = []; + this.frameChart!.clearCanvas() } } } initHtml(): string { return ` - -
      -
      - - - - - - - - - -
      -
      - - - - - - -
      -
      - + +
      + +
      + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      + + + + +
      `; } } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneNMSampleList.ts b/host/ide/src/trace/component/trace/sheet/TabPaneNMSampleList.ts index df7e7eb..c90fc5a 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneNMSampleList.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneNMSampleList.ts @@ -13,16 +13,11 @@ * limitations under the License. */ -import "../../../../base-ui/table/lit-table-column.js"; +import "../../../../base-ui/table/lit-table-column.js"; import {BaseElement, element} from "../../../../base-ui/BaseElement.js"; import {LitTable} from "../../../../base-ui/table/lit-table.js"; -import {Counter, SelectionData, SelectionParam} from "../../../bean/BoxSelection.js"; -import { - getTabCounters, queryAllHookData, - queryNativeHookEventId, - queryNativeHookSnapshot, - queryNativeHookSnapshotTypes -} from "../../../database/SqlLite.js"; +import {SelectionData, SelectionParam} from "../../../bean/BoxSelection.js"; +import {queryAllHookData, queryNativeHookSnapshot, queryNativeHookSnapshotTypes} from "../../../database/SqlLite.js"; import {SpSystemTrace} from "../../SpSystemTrace.js"; import { NativeHookCallInfo, @@ -41,82 +36,83 @@ export class TabPaneNMSampleList extends BaseElement { static filter: any static filterSelect: string = "0" static source: Array = []; - static groups:any = undefined; - static types:Array = [] - static native_type:Array = ["All Heap & Anonymous VM","All Heap","All Anonymous VM"]; + static groups: any = undefined; + static types: Array = [] + static native_type: Array = ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"]; static tableMarkData: Array = [] - static selectionParam:SelectionParam|undefined = undefined - static sampleTypes:Array = [] - static sampleTypesList:any[] = [] + static selectionParam: SelectionParam | undefined = undefined + static sampleTypes: Array = [] + static sampleTypesList: any[] = [] + set data(val: SelectionParam | any) { TabPaneNMSampleList.serSelection(val) this.filterAllList() } - static serSelection(val: SelectionParam){ - if(this.selectionParam !== val){ + static serSelection(val: SelectionParam) { + if (this.selectionParam !== val) { this.clearData() this.selectionParam = val this.initTypes() } - if(val.nativeMemory.indexOf(this.native_type[0]) != -1){ + if (val.nativeMemory.indexOf(this.native_type[0]) != -1) { this.types.push("'AllocEvent'"); this.types.push("'MmapEvent'"); - }else{ - if(val.nativeMemory.indexOf(this.native_type[1]) != -1){ + } else { + if (val.nativeMemory.indexOf(this.native_type[1]) != -1) { this.types.push("'AllocEvent'"); } - if(val.nativeMemory.indexOf(this.native_type[2]) != -1){ + if (val.nativeMemory.indexOf(this.native_type[2]) != -1) { this.types.push("'MmapEvent'"); } } } - static initTypes(){ - queryNativeHookSnapshotTypes().then((result)=>{ - if(result.length>0){ + static initTypes() { + queryNativeHookSnapshotTypes().then((result) => { + if (result.length > 0) { this.sampleTypes = result } }) } - static addSampleData(data:any){ - if(TabPaneNMSampleList.tableMarkData.indexOf(data)!=-1){ + static addSampleData(data: any) { + if (TabPaneNMSampleList.tableMarkData.indexOf(data) != -1) { return } TabPaneNMSampleList.tableMarkData.push(data) this.initGroups() let rootSample = new NativeHookSamplerInfo() - rootSample.snapshot = "Snapshot"+this.numberToWord(this.source.length+1) + rootSample.snapshot = "Snapshot" + this.numberToWord(this.source.length + 1) rootSample.startTs = data.startTs rootSample.timestamp = Utils.getTimeString(data.startTs) rootSample.eventId = data.eventId - this.queryAllHookInfo(data,rootSample) + this.queryAllHookInfo(data, rootSample) } - static querySnapshot(data:any,rootSample:NativeHookSamplerInfo){ - let copyTypes = this.sampleTypes.map((type)=>{ + static querySnapshot(data: any, rootSample: NativeHookSamplerInfo) { + let copyTypes = this.sampleTypes.map((type) => { let copyType = new NativeHookSampleQueryInfo() copyType.eventType = type.eventType copyType.subType = type.subType return copyType }) - queryNativeHookSnapshot(data.startTs).then((result)=>{ - if(result.length>0){ - let nameGroup:any = {} - copyTypes.forEach((item)=> { + queryNativeHookSnapshot(data.startTs).then((result) => { + if (result.length > 0) { + let nameGroup: any = {} + copyTypes.forEach((item) => { nameGroup[item.eventType] = nameGroup[item.eventType] || [] nameGroup[item.eventType].push(item) }) - result.forEach((item)=>{ - if(nameGroup[item.eventType]!=undefined){ - if(item.subType == null){ + result.forEach((item) => { + if (nameGroup[item.eventType] != undefined) { + if (item.subType == null) { nameGroup[item.eventType][0].existing = item.existing nameGroup[item.eventType][0].growth = item.growth - }else{ - let filter = nameGroup[item.eventType].filter((type:any)=>{ - return type.subType == item.subType + } else { + let filter = nameGroup[item.eventType].filter((type: any) => { + return type.subType == item.subType }) if (filter.length > 0) { filter[0].existing = item.existing @@ -125,35 +121,35 @@ export class TabPaneNMSampleList extends BaseElement { } } }) - if(this.sampleTypesList.length>0){ - let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length-1]; - sampleTypesListElement.forEach((item:any,index:number)=>{ + if (this.sampleTypesList.length > 0) { + let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length - 1]; + sampleTypesListElement.forEach((item: any, index: number) => { copyTypes[index].current = copyTypes[index].growth - if(index{ + } else { + copyTypes.forEach((item: any, index: number) => { item.current = item.growth }) } this.sampleTypesList.push(copyTypes) - this.createTree(nameGroup,rootSample) + this.createTree(nameGroup, rootSample) rootSample.tempList = [...rootSample.children] this.source.push(rootSample) } }) } - static merageSampleData(leftTime:number,startNs:number,rootSample:NativeHookSampleQueryInfo,merageSample:NativeHookSampleQueryInfo){ - if(merageSample.endTs >= startNs){ + static merageSampleData(leftTime: number, startNs: number, rootSample: NativeHookSampleQueryInfo, merageSample: NativeHookSampleQueryInfo) { + if (merageSample.endTs >= startNs) { rootSample.growth += merageSample.growth } - if(merageSample.startTs > leftTime){ + if (merageSample.startTs > leftTime) { rootSample.existing++; let childSample = new NativeHookSamplerInfo()//新增最下层的叶子节点 - childSample.snapshot = "0x"+merageSample.addr + childSample.snapshot = "0x" + merageSample.addr childSample.eventId = merageSample.eventId; childSample.heapSize = merageSample.growth childSample.growth = Utils.getByteWithUnit(merageSample.growth) @@ -166,75 +162,75 @@ export class TabPaneNMSampleList extends BaseElement { rootSample.total += merageSample.growth } - static queryAllHookInfo(data:any,rootSample:NativeHookSamplerInfo){ - let copyTypes = this.sampleTypes.map((type)=>{ + static queryAllHookInfo(data: any, rootSample: NativeHookSamplerInfo) { + let copyTypes = this.sampleTypes.map((type) => { let copyType = new NativeHookSampleQueryInfo() copyType.eventType = type.eventType copyType.subType = type.subType return copyType }) - queryAllHookData(data.startTs).then((result)=>{ - if(result.length > 0){ - let nameGroup:any = {} - copyTypes.forEach((item)=> { + queryAllHookData(data.startTs).then((result) => { + if (result.length > 0) { + let nameGroup: any = {} + copyTypes.forEach((item) => { nameGroup[item.eventType] = nameGroup[item.eventType] || [] nameGroup[item.eventType].push(item) }) - let leftTime = TabPaneNMSampleList.tableMarkData.length == 1?0:TabPaneNMSampleList.tableMarkData[TabPaneNMSampleList.tableMarkData.length - 2].startTs - result.forEach((item)=>{ - if(nameGroup[item.eventType]!=undefined){ - if(item.subType == null){ - this.merageSampleData(leftTime,data.startTs,nameGroup[item.eventType][0],item) - }else{ - let filter = nameGroup[item.eventType].filter((type:any)=>{ + let leftTime = TabPaneNMSampleList.tableMarkData.length == 1 ? 0 : TabPaneNMSampleList.tableMarkData[TabPaneNMSampleList.tableMarkData.length - 2].startTs + result.forEach((item) => { + if (nameGroup[item.eventType] != undefined) { + if (item.subType == null) { + this.merageSampleData(leftTime, data.startTs, nameGroup[item.eventType][0], item) + } else { + let filter = nameGroup[item.eventType].filter((type: any) => { return type.subType == item.subType }) if (filter.length > 0) { - this.merageSampleData(leftTime,data.startTs,filter[0],item) + this.merageSampleData(leftTime, data.startTs, filter[0], item) } } } }) - if(this.sampleTypesList.length>0){ - let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length-1]; - sampleTypesListElement.forEach((item:any,index:number)=>{ + if (this.sampleTypesList.length > 0) { + let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length - 1]; + sampleTypesListElement.forEach((item: any, index: number) => { copyTypes[index].current = copyTypes[index].growth - if(index{ + } else { + copyTypes.forEach((item: any, index: number) => { item.current = item.growth }) } this.sampleTypesList.push(copyTypes) - this.createTree(nameGroup,rootSample) + this.createTree(nameGroup, rootSample) rootSample.tempList = [...rootSample.children] this.source.push(rootSample) } }) } - static initGroups(){ - if(this.groups==undefined){ + static initGroups() { + if (this.groups == undefined) { this.groups = {} - SpSystemTrace.HEAP_FRAME_DATA.map((frame)=>{ - this.groups[frame.eventId] = this.groups[frame.eventId]||[] + SpSystemTrace.HEAP_FRAME_DATA.map((frame) => { + this.groups[frame.eventId] = this.groups[frame.eventId] || [] this.groups[frame.eventId].push(frame) }) } } - static createTree(nameGroup:any,rootSample:NativeHookSamplerInfo){ - Object.keys(nameGroup).forEach((key)=>{ + static createTree(nameGroup: any, rootSample: NativeHookSamplerInfo) { + Object.keys(nameGroup).forEach((key) => { let parentSample = new NativeHookSamplerInfo() parentSample.snapshot = key if (nameGroup[key].length > 0) { - nameGroup[key].forEach((child:any)=>{ + nameGroup[key].forEach((child: any) => { let childSample = new NativeHookSamplerInfo() - childSample.snapshot = child.subType||child.eventType + childSample.snapshot = child.subType || child.eventType childSample.heapSize = child.growth childSample.growth = Utils.getByteWithUnit(child.growth) childSample.total = child.total @@ -243,10 +239,10 @@ export class TabPaneNMSampleList extends BaseElement { childSample.currentSize = child.current childSample.current = Utils.getByteWithUnit(child.current) parentSample.merageObj(childSample) - if(childSample.snapshot != parentSample.snapshot){//根据名称是否一致来判断是否需要添加子节点 + if (childSample.snapshot != parentSample.snapshot) {//根据名称是否一致来判断是否需要添加子节点 childSample.children.push(...child.children) parentSample.children.push(childSample) - }else { + } else { parentSample.children.push(...child.children) } }) @@ -256,25 +252,25 @@ export class TabPaneNMSampleList extends BaseElement { }) } - static prepChild(currentSample:NativeHookSamplerInfo,rootSample:NativeHookSamplerInfo){ + static prepChild(currentSample: NativeHookSamplerInfo, rootSample: NativeHookSamplerInfo) { currentSample.heapSize -= rootSample.heapSize currentSample.growth = Utils.getByteWithUnit(currentSample.heapSize) - let currentMap:any = {} - currentSample.children.forEach((currentChild)=>{ + let currentMap: any = {} + currentSample.children.forEach((currentChild) => { currentMap[currentChild.snapshot] = currentChild }) - rootSample.children.forEach((rootChild)=>{ + rootSample.children.forEach((rootChild) => { if (currentMap[rootChild.snapshot] == undefined) { let perpSample = new NativeHookSamplerInfo() - perpSample.snapshot =rootChild.snapshot + perpSample.snapshot = rootChild.snapshot currentMap[rootChild.snapshot] = perpSample currentSample.children.push(perpSample) } - this.prepChild(currentMap[rootChild.snapshot],rootChild) + this.prepChild(currentMap[rootChild.snapshot], rootChild) }) } - static clearData(){ + static clearData() { this.types = [] this.source = [] this.tblData!.dataSource = [] @@ -284,22 +280,22 @@ export class TabPaneNMSampleList extends BaseElement { TabPaneNMSampleList.filter!.firstSelect = "0" } - static numberToWord(num:number){ + static numberToWord(num: number) { let word = "" - while (num>0){ - let end = num%26 - end = end === 0?(end = 26):end; - word = String.fromCharCode(96 + end)+word - num = ( num - end ) / 26 + while (num > 0) { + let end = num % 26 + end = end === 0 ? (end = 26) : end; + word = String.fromCharCode(96 + end) + word + num = (num - end) / 26 } return word.toUpperCase() } - setRightTableData(eventId:number){ - let arr:Array = []; + setRightTableData(eventId: number) { + let arr: Array = []; let frameArr = TabPaneNMSampleList.groups[eventId]; - if(frameArr){ - frameArr.map((frame:any)=>{ + if (frameArr) { + frameArr.map((frame: any) => { let target = new NativeHookCallInfo(); target.eventId = parseInt(frame.eventId); target.depth = frame.depth; @@ -318,25 +314,25 @@ export class TabPaneNMSampleList extends BaseElement { initElements(): void { TabPaneNMSampleList.tbl = this.shadowRoot?.querySelector('#tb-native-sample'); - TabPaneNMSampleList.tbl!.addEventListener('row-click', (evt:any) => { + TabPaneNMSampleList.tbl!.addEventListener('row-click', (evt: any) => { // @ts-ignore - this.setRightTableData(evt.detail.eventId); + this.setRightTableData(evt.detail.data.eventId); }) TabPaneNMSampleList.tblData = this.shadowRoot?.querySelector('#tb-native-data'); new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - TabPaneNMSampleList.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 10 - 31)+"px" + TabPaneNMSampleList.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 10 - 31) + "px" TabPaneNMSampleList.tbl?.reMeauseHeight() // @ts-ignore - TabPaneNMSampleList.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 10)+"px" + TabPaneNMSampleList.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 10) + "px" TabPaneNMSampleList.tblData?.reMeauseHeight() } }).observe(this.parentElement!) TabPaneNMSampleList.filter = this.shadowRoot?.querySelector("#filter") - this.shadowRoot?.querySelector("#filter")!.setSelectList(TabPaneNMSampleList.native_type,null) - this.shadowRoot?.querySelector("#filter")!.getFilterData((data:FilterData)=>{ - if(data.firstSelect){ + this.shadowRoot?.querySelector("#filter")!.setSelectList(TabPaneNMSampleList.native_type, null) + this.shadowRoot?.querySelector("#filter")!.getFilterData((data: FilterData) => { + if (data.firstSelect) { TabPaneNMSampleList.filterSelect = data.firstSelect this.filterAllList() } @@ -345,42 +341,42 @@ export class TabPaneNMSampleList extends BaseElement { } - filterAllList(){ - TabPaneNMSampleList.source.forEach((rootSample)=>{ + filterAllList() { + TabPaneNMSampleList.source.forEach((rootSample) => { rootSample.heapSize = 0 rootSample.existing = 0 rootSample.total = 0 - if(TabPaneNMSampleList.filterSelect == "0"){ - rootSample.children = [...rootSample.tempList] - rootSample.tempList.forEach((parentSample)=>{ - rootSample.heapSize +=parentSample.heapSize - rootSample.existing +=parentSample.existing - rootSample.total +=parentSample.total + if (TabPaneNMSampleList.filterSelect == "0") { + rootSample.children = [...rootSample.tempList] + rootSample.tempList.forEach((parentSample) => { + rootSample.heapSize += parentSample.heapSize + rootSample.existing += parentSample.existing + rootSample.total += parentSample.total }) rootSample.growth = Utils.getByteWithUnit(rootSample.heapSize) - rootSample.totalGrowth =Utils.getByteWithUnit(rootSample.total) - }else if(TabPaneNMSampleList.filterSelect == "2"){ - if(rootSample.tempList.length>1){ + rootSample.totalGrowth = Utils.getByteWithUnit(rootSample.total) + } else if (TabPaneNMSampleList.filterSelect == "2") { + if (rootSample.tempList.length > 1) { rootSample.children = [rootSample.tempList[1]] - rootSample.heapSize +=rootSample.tempList[1].heapSize - rootSample.existing +=rootSample.tempList[1].existing + rootSample.heapSize += rootSample.tempList[1].heapSize + rootSample.existing += rootSample.tempList[1].existing rootSample.growth = Utils.getByteWithUnit(rootSample.heapSize) rootSample.total += rootSample.tempList[1].total rootSample.totalGrowth = Utils.getByteWithUnit(rootSample.total) - }else { + } else { rootSample.children = [] rootSample.growth = "" rootSample.totalGrowth = "" } - }else { - if(rootSample.tempList.length>0){ + } else { + if (rootSample.tempList.length > 0) { rootSample.children = [rootSample.tempList[0]] - rootSample.heapSize +=rootSample.tempList[0].heapSize - rootSample.existing +=rootSample.tempList[0].existing + rootSample.heapSize += rootSample.tempList[0].heapSize + rootSample.existing += rootSample.tempList[0].existing rootSample.growth = Utils.getByteWithUnit(rootSample.heapSize) rootSample.total += rootSample.tempList[0].total rootSample.totalGrowth = Utils.getByteWithUnit(rootSample.total) - }else { + } else { rootSample.children = [] rootSample.growth = "" rootSample.totalGrowth = "" @@ -392,36 +388,42 @@ export class TabPaneNMSampleList extends BaseElement { initHtml(): string { return ` - -
      -
      - - - - - - - - -
      -
      - - - - - - -
      -
      + +
      +
      + + + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      `; } @@ -453,4 +455,4 @@ export class TabPaneNMSampleList extends BaseElement { TabPaneNMSampleList.tbl!.recycleDataSource = TabPaneNMSampleList.source; } -} \ No newline at end of file +} diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneNMStatstics.ts b/host/ide/src/trace/component/trace/sheet/TabPaneNMStatstics.ts index e022aaf..4a1a4f0 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneNMStatstics.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneNMStatstics.ts @@ -15,18 +15,13 @@ import {BaseElement, element} from "../../../../base-ui/BaseElement.js"; import {LitTable} from "../../../../base-ui/table/lit-table.js"; -import { SelectionParam} from "../../../bean/BoxSelection.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; import { queryNativeHookStatistics, queryNativeHookStatisticsMalloc, queryNativeHookStatisticsSubType } from "../../../database/SqlLite.js"; -import { - NativeHookMalloc, - NativeHookStatistics, - NativeHookStatisticsTableData, - NativeMemory -} from "../../../bean/NativeHook.js"; +import {NativeHookMalloc, NativeHookStatistics, NativeHookStatisticsTableData} from "../../../bean/NativeHook.js"; import {Utils} from "../base/Utils.js"; import {SpSystemTrace} from "../../SpSystemTrace.js"; import "./TabProgressBar.js" @@ -35,39 +30,39 @@ import "./TabProgressBar.js" export class TabPaneNMStatstics extends BaseElement { private tbl: LitTable | null | undefined; private source: Array = [] - private native_type:Array = ["All Heap & Anonymous VM","All Heap","All Anonymous VM"]; - private allMax:number = 0; + private native_type: Array = ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"]; + private allMax: number = 0; set data(val: SelectionParam | any) { this.allMax = 0; - SpSystemTrace.EVENT_HEAP.map((heap)=>{ + SpSystemTrace.EVENT_HEAP.map((heap) => { this.allMax += heap.sumHeapSize; }); // @ts-ignore this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20) + "px" // @ts-ignore this.tbl?.recycleDataSource = []; - Promise.all([queryNativeHookStatistics(val.leftNs,val.rightNs), - queryNativeHookStatisticsSubType(val.leftNs,val.rightNs), - queryNativeHookStatisticsMalloc(val.leftNs,val.rightNs) - ]).then((values)=>{ - let arr:Array = []; + Promise.all([queryNativeHookStatistics(val.leftNs, val.rightNs), + queryNativeHookStatisticsSubType(val.leftNs, val.rightNs), + queryNativeHookStatisticsMalloc(val.leftNs, val.rightNs) + ]).then((values) => { + let arr: Array = []; let index1 = val.nativeMemory.indexOf(this.native_type[0]) let index2 = val.nativeMemory.indexOf(this.native_type[1]) let index3 = val.nativeMemory.indexOf(this.native_type[2]) - this.setMemoryTypeData(val,values[0],arr); - if(index1 != -1 || index3 != -1){ - this.setSubTypeTableData(values[1],arr); + this.setMemoryTypeData(val, values[0], arr); + if (index1 != -1 || index3 != -1) { + this.setSubTypeTableData(values[1], arr); } - if(index1 != -1 || index2 != -1){ - this.setMallocTableData(values[2],arr); + if (index1 != -1 || index2 != -1) { + this.setMallocTableData(values[2], arr); } this.tbl!.recycleDataSource = arr; }) } - setMallocTableData(result:Array,arr:Array){ - result.map((malloc)=>{ + setMallocTableData(result: Array, arr: Array) { + result.map((malloc) => { let data = new NativeHookStatisticsTableData(); data.memoryTap = "Malloc " + Utils.getByteWithUnit(malloc.heapSize); data.existing = malloc.allocByte; @@ -79,111 +74,113 @@ export class TabPaneNMStatstics extends BaseElement { data.existingString = Utils.getByteWithUnit(data.existing); data.totalBytesString = Utils.getByteWithUnit(data.totalBytes); data.maxStr = Utils.getByteWithUnit(malloc.heapSize); - data.existingValue = [data.existing,data.totalBytes,this.allMax]; + data.existingValue = [data.existing, data.totalBytes, this.allMax]; arr.push(data); }) } - setSubTypeTableData(result:Array,arr:Array){ - result.map((sub)=>{ - let data = new NativeHookStatisticsTableData(); - data.memoryTap = sub.subType - data.existing = sub.allocByte - data.allocCount = sub.allocCount; - data.freeCount = sub.freeCount; - data.totalBytes = sub.allocByte + sub.freeByte; - data.totalCount = sub.allocCount + sub.freeCount; - data.max = sub.heapSize; - data.existingString = Utils.getByteWithUnit(data.existing); - data.totalBytesString = Utils.getByteWithUnit(data.totalBytes); - data.maxStr = Utils.getByteWithUnit(sub.heapSize); - data.existingValue = [data.existing,data.totalBytes,this.allMax]; - arr.push(data); + setSubTypeTableData(result: Array, arr: Array) { + result.map((sub) => { + if (sub.subType != null && sub.subType != "") { + let data = new NativeHookStatisticsTableData(); + data.memoryTap = sub.subType + data.existing = sub.allocByte + data.allocCount = sub.allocCount; + data.freeCount = sub.freeCount; + data.totalBytes = sub.allocByte + sub.freeByte; + data.totalCount = sub.allocCount + sub.freeCount; + data.max = sub.heapSize; + data.existingString = Utils.getByteWithUnit(data.existing); + data.totalBytesString = Utils.getByteWithUnit(data.totalBytes); + data.maxStr = Utils.getByteWithUnit(sub.heapSize); + data.existingValue = [data.existing, data.totalBytes, this.allMax]; + arr.push(data); + } }) } - setMemoryTypeData(val:SelectionParam,result:Array,arr:Array){ - let all:NativeHookStatisticsTableData | null = null - let heap:NativeHookStatisticsTableData | null = null - let anonymous:NativeHookStatisticsTableData | null = null - if(val.nativeMemory.indexOf(this.native_type[0]) != -1){ + setMemoryTypeData(val: SelectionParam, result: Array, arr: Array) { + let all: NativeHookStatisticsTableData | null = null + let heap: NativeHookStatisticsTableData | null = null + let anonymous: NativeHookStatisticsTableData | null = null + if (val.nativeMemory.indexOf(this.native_type[0]) != -1) { all = new NativeHookStatisticsTableData(); all.memoryTap = this.native_type[0]; } - if(val.nativeMemory.indexOf(this.native_type[1]) != -1){ + if (val.nativeMemory.indexOf(this.native_type[1]) != -1) { heap = new NativeHookStatisticsTableData(); heap.memoryTap = this.native_type[1]; } - if(val.nativeMemory.indexOf(this.native_type[2]) != -1){ + if (val.nativeMemory.indexOf(this.native_type[2]) != -1) { anonymous = new NativeHookStatisticsTableData(); anonymous.memoryTap = this.native_type[2]; } for (let hook of result) { - if(all != null){ - if(hook.eventType == "AllocEvent" || hook.eventType == "MmapEvent"){ + if (all != null) { + if (hook.eventType == "AllocEvent" || hook.eventType == "MmapEvent") { all.existing += hook.sumHeapSize; all.allocCount += hook.count; all.totalBytes += hook.sumHeapSize; all.totalCount += hook.count; - if(hook.max > all.max){ + if (hook.max > all.max) { all.max = hook.max; all.maxStr = Utils.getByteWithUnit(all.max); } - }else if(hook.eventType == "FreeEvent" || hook.eventType == "MunmapEvent"){ + } else if (hook.eventType == "FreeEvent" || hook.eventType == "MunmapEvent") { all.totalBytes += hook.sumHeapSize; all.freeCount += hook.count; all.totalCount += hook.count; } } - if(heap != null){ - if(hook.eventType == "AllocEvent" ){ + if (heap != null) { + if (hook.eventType == "AllocEvent") { heap.existing += hook.sumHeapSize; heap.allocCount += hook.count; heap.totalBytes += hook.sumHeapSize; heap.totalCount += hook.count; - if(hook.max > heap.max){ + if (hook.max > heap.max) { heap.max = hook.max; heap.maxStr = Utils.getByteWithUnit(heap.max); } - }else if(hook.eventType == "FreeEvent"){ + } else if (hook.eventType == "FreeEvent") { heap.totalBytes += hook.sumHeapSize; heap.totalCount += hook.count; heap.freeCount += hook.count; } } - if(anonymous != null){ - if(hook.eventType == "MmapEvent" ){ + if (anonymous != null) { + if (hook.eventType == "MmapEvent") { anonymous.existing += hook.sumHeapSize; anonymous.allocCount += hook.count; anonymous.totalBytes += hook.sumHeapSize; anonymous.totalCount += hook.count; - if(hook.max > anonymous.max){ + if (hook.max > anonymous.max) { anonymous.max = hook.max; anonymous.maxStr = Utils.getByteWithUnit(anonymous.max); } - }else if(hook.eventType == "MunmapEvent"){ + } else if (hook.eventType == "MunmapEvent") { anonymous.totalBytes += hook.sumHeapSize; anonymous.freeCount += hook.count; anonymous.totalCount += hook.count; } } } - if(all != null){ + if (all != null) { all.existingString = Utils.getByteWithUnit(all.existing) all.totalBytesString = Utils.getByteWithUnit(all.totalBytes) - all.existingValue = [all.existing,all.totalBytes,this.allMax] + all.existingValue = [all.existing, all.totalBytes, this.allMax] arr.push(all) } - if(heap != null){ + if (heap != null) { heap.existingString = Utils.getByteWithUnit(heap.existing) heap.totalBytesString = Utils.getByteWithUnit(heap.totalBytes) - heap.existingValue = [heap.existing,heap.totalBytes,this.allMax] + heap.existingValue = [heap.existing, heap.totalBytes, this.allMax] arr.push(heap) } - if(anonymous != null){ + if (anonymous != null) { anonymous.existingString = Utils.getByteWithUnit(anonymous.existing) anonymous.totalBytesString = Utils.getByteWithUnit(anonymous.totalBytes) - anonymous.existingValue = [anonymous.existing,anonymous.totalBytes,this.allMax] + anonymous.existingValue = [anonymous.existing, anonymous.totalBytes, this.allMax] arr.push(anonymous) } } @@ -193,7 +190,7 @@ export class TabPaneNMStatstics extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20)+"px" + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!) @@ -202,25 +199,35 @@ export class TabPaneNMStatstics extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + `; } } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneNMemory.ts b/host/ide/src/trace/component/trace/sheet/TabPaneNMemory.ts index 43fde1a..6e0c365 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneNMemory.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneNMemory.ts @@ -27,32 +27,37 @@ import {TabPaneNMSampleList} from "./TabPaneNMSampleList.js"; @element('tabpane-native-memory') export class TabPaneNMemory extends BaseElement { - private defaultNativeTypes = ["All Heap & Anonymous VM","All Heap","All Anonymous VM"]; + private defaultNativeTypes = ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"]; private tbl: LitTable | null | undefined; private tblData: LitTable | null | undefined; private source: Array = [] - private native_type:Array = [...this.defaultNativeTypes]; + private native_type: Array = [...this.defaultNativeTypes]; private statsticsSelection: Array = [] private queryResult: Array = [] - private filterAllocationType:string = "0" - private filterNativeType:string = "0" - private currentSelection:SelectionParam|undefined - private rowSelectData:any = undefined; + private filterAllocationType: string = "0" + private filterNativeType: string = "0" + private currentSelection: SelectionParam | undefined + private rowSelectData: any = undefined; + set data(val: SelectionParam | any) { - if(val==this.currentSelection){ + if (val == this.currentSelection) { return } this.currentSelection = val this.initFilterTypes() - let types:Array = [] - if(val.nativeMemory.indexOf(this.defaultNativeTypes[0]) != -1){ + this.queryData(val) + } + + queryData(val: SelectionParam | any) { + let types: Array = [] + if (val.nativeMemory.indexOf(this.defaultNativeTypes[0]) != -1) { types.push("'AllocEvent'"); types.push("'MmapEvent'"); - }else{ - if(val.nativeMemory.indexOf(this.defaultNativeTypes[1]) != -1){ + } else { + if (val.nativeMemory.indexOf(this.defaultNativeTypes[1]) != -1) { types.push("'AllocEvent'"); } - if(val.nativeMemory.indexOf(this.defaultNativeTypes[2]) != -1){ + if (val.nativeMemory.indexOf(this.defaultNativeTypes[2]) != -1) { types.push("'MmapEvent'"); } } @@ -60,97 +65,99 @@ export class TabPaneNMemory extends BaseElement { // @ts-ignore this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20 - 31) + "px" // @ts-ignore - this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight -20)+"px" + this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 20) + "px" // @ts-ignore this.tblData?.recycleDataSource = []; // @ts-ignore this.tbl?.recycleDataSource = []; - queryNativeHookEventId(val.leftNs,val.rightNs,types).then((result)=>{ - if(result.length > 0){ + queryNativeHookEventId(val.leftNs, val.rightNs, types).then((result) => { + if (result.length > 0) { this.queryResult = result this.source = this.handleQueryResult(result); - }else{ + } else { this.source = []; } this.filterQueryData() }) } - fromStastics(val: SelectionParam | any){ + fromStastics(val: SelectionParam | any) { let filter = this.shadowRoot?.querySelector("#filter") + if (this.currentSelection != val) { + this.initFilterTypes() + } let typeIndexOf = this.native_type.indexOf(val.statisticsSelectData.memoryTap); - if(this.statsticsSelection.indexOf(val.statisticsSelectData) == -1&&typeIndexOf == -1){ + if (this.statsticsSelection.indexOf(val.statisticsSelectData) == -1 && typeIndexOf == -1) { this.statsticsSelection.push(val.statisticsSelectData) this.native_type.push(val.statisticsSelectData.memoryTap) typeIndexOf = this.native_type.length - 1 } - if(this.currentSelection != val){ - //设置选项后刷新当前的数据 - this.data = val - //todo 设置filter当前的选项和选中项 - filter!.setSelectList(null,this.native_type) - filter!.secondSelect = typeIndexOf+"" - this.filterNativeType = typeIndexOf+"" - }else{ + if (this.currentSelection != val) { + this.currentSelection = val + filter!.setSelectList(null, this.native_type) + filter!.secondSelect = typeIndexOf + "" + this.filterNativeType = typeIndexOf + "" + this.queryData(val) + } else { this.tblData!.recycleDataSource = []; this.rowSelectData = undefined - filter!.setSelectList(null,this.native_type) - filter!.secondSelect = typeIndexOf+"" - this.filterNativeType = typeIndexOf+"" + filter!.setSelectList(null, this.native_type) + filter!.secondSelect = typeIndexOf + "" + this.filterNativeType = typeIndexOf + "" //直接将当前数据过滤即可 this.filterQueryData() } } - getTypeFromIndex(indexOf:number,item:NativeHookStatistics):boolean{ - if(indexOf == -1){ + getTypeFromIndex(indexOf: number, item: NativeHookStatistics): boolean { + if (indexOf == -1) { return false; } - if(indexOf < 3){ - if(indexOf == 0){ + if (indexOf < 3) { + if (indexOf == 0) { return true - }else if(indexOf == 1){ + } else if (indexOf == 1) { return item.eventType == "AllocEvent" - }else if(indexOf == 2){ + } else if (indexOf == 2) { return item.eventType == "MmapEvent" } - }else if(indexOf-3 < this.statsticsSelection.length){ + } else if (indexOf - 3 < this.statsticsSelection.length) { let selectionElement = this.statsticsSelection[indexOf - 3]; - if(selectionElement.memoryTap!=undefined&&selectionElement.max!=undefined){ + if (selectionElement.memoryTap != undefined && selectionElement.max != undefined) { if (selectionElement.memoryTap.indexOf("Malloc") != -1) { - return item.eventType == "AllocEvent"&&item.heapSize == selectionElement.max - }else { - return item.subType == selectionElement.memoryTap&&item.heapSize == selectionElement.max + return item.eventType == "AllocEvent" && item.heapSize == selectionElement.max + } else { + return item.subType == selectionElement.memoryTap && item.heapSize == selectionElement.max } } } return false; } - handleQueryResult(result:Array):Array{ - let resultMap = new Map(); - result.map((r)=>{ - resultMap.set(r.eventId,r); + handleQueryResult(result: Array): Array { + let resultMap = new Map(); + result.map((r) => { + resultMap.set(r.eventId, r); }) - let data :Array = []; + let data: Array = []; let frameArr: Array = []; SpSystemTrace.HEAP_FRAME_DATA.map((frame) => { let frameEventId = parseInt(frame.eventId); - if(frameEventId >= result[0].eventId && frameEventId <= result[result.length - 1].eventId){ - if(resultMap.has(frameEventId) && frame.depth == 0){ + if (frameEventId >= result[0].eventId && frameEventId <= result[result.length - 1].eventId) { + if (resultMap.has(frameEventId) && frame.depth == 0) { frameArr.push(frame); } } - if(frameEventId > result[result.length -1].eventId){ + if (frameEventId > result[result.length - 1].eventId) { return false; } }); - let frameMap = new Map(); - frameArr.map((frame)=>{ - frameMap.set(parseInt(frame.eventId),frame); + let frameMap = new Map(); + frameArr.map((frame) => { + frameMap.set(parseInt(frame.eventId), frame); }) - for (let i = 0,len = result.length; i < len; i++) { + for (let i = 0, len = result.length; i < len; i++) { let hook = result[i]; let memory = new NativeMemory(); memory.index = i; @@ -159,12 +166,12 @@ export class TabPaneNMemory extends BaseElement { memory.subType = hook.subType; memory.heapSize = hook.heapSize; memory.heapSizeUnit = Utils.getByteWithUnit(hook.heapSize); - memory.addr = "0x"+hook.addr; + memory.addr = "0x" + hook.addr; memory.startTs = hook.startTs; memory.timestamp = Utils.getTimeString(hook.startTs); (memory as any).isSelected = hook.isSelected; let frame = frameMap.get(hook.eventId); - if(frame != null && frame != undefined){ + if (frame != null && frame != undefined) { let sym_arr = frame.AllocationFunction?.split("/"); let lib_arr = frame.MoudleName?.split("/"); memory.symbol = sym_arr![sym_arr!.length - 1]; @@ -175,10 +182,12 @@ export class TabPaneNMemory extends BaseElement { return data } - initFilterTypes(){ + initFilterTypes() { let filter = this.shadowRoot?.querySelector("#filter") this.queryResult = [] - filter!.setSelectList(null,this.defaultNativeTypes) + this.native_type = [...this.defaultNativeTypes] + this.statsticsSelection = [] + filter!.setSelectList(null, [...this.defaultNativeTypes]) filter!.firstSelect = "0" filter!.secondSelect = "0" this.filterAllocationType = "0" @@ -191,73 +200,93 @@ export class TabPaneNMemory extends BaseElement { this.tblData = this.shadowRoot?.querySelector('#tb-native-data'); this.tbl!.addEventListener("row-click", (e) => { // @ts-ignore - let data = (e.detail as NativeMemory); + let data = (e.detail.data as NativeMemory); this.rowSelectData = data this.setRightTableData(data); - document.dispatchEvent(new CustomEvent('triangle-flag', {detail: {time:data.startTs,type:"triangle"}})); + document.dispatchEvent(new CustomEvent('triangle-flag', {detail: {time: data.startTs, type: "triangle"}})); }) new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight)-10-31+"px"; + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) - 10 - 31 + "px"; this.tbl?.reMeauseHeight(); // @ts-ignore - this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight)-10+"px" + this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight) - 10 + "px" this.tblData?.reMeauseHeight() } }).observe(this.parentElement!) let filter = this.shadowRoot?.querySelector("#filter") - this.shadowRoot?.querySelector("#filter")!.getFilterData((data:FilterData)=>{ + this.shadowRoot?.querySelector("#filter")!.getFilterData((data: FilterData) => { if (data.mark) { - if(this.rowSelectData!=undefined){ - let filterTemp = this.queryResult.filter((tempItem)=>{ - return tempItem.eventId == this.rowSelectData.eventId - }) - if(filterTemp.length>0){ - filterTemp[0].isSelected = true - } - TabPaneNMSampleList.addSampleData(this.rowSelectData) - if(this.rowSelectData.selectedCallback){ - this.rowSelectData.isSelected = true - this.rowSelectData.selectedCallback() + document.dispatchEvent(new CustomEvent('triangle-flag', { + detail: { + time: "", type: "square", timeCallback: (t: any) => { + let minTs = 0 + let minItem: any = undefined + let filterTemp = this.source.filter((tempItem) => { + if (minTs == 0 || (tempItem.startTs - t != 0 && Math.abs(tempItem.startTs - t) < minTs)) { + minTs = Math.abs(tempItem.startTs - t) + minItem = tempItem + } + return tempItem.startTs == t + }) + if (filterTemp.length > 0) { + filterTemp[0].isSelected = true + } else { + if (minItem) { + filterTemp.push(minItem) + minItem.isSelected = true + } + } + if (filterTemp.length > 0) { + this.rowSelectData = filterTemp[0] + let currentSelection = this.queryResult.filter((item) => { + return item.startTs == this.rowSelectData.startTs + }) + if (currentSelection.length > 0) { + currentSelection[0].isSelected = true + } + TabPaneNMSampleList.addSampleData(this.rowSelectData) + this.tbl!.scrollToData(this.rowSelectData) + } + } } - document.dispatchEvent(new CustomEvent('triangle-flag', {detail: {time:this.rowSelectData.startTs,type:"square"}})); - } - }else { - this.filterAllocationType = data.firstSelect||"0" - this.filterNativeType = data.secondSelect||"0" + })); + } else { + this.filterAllocationType = data.firstSelect || "0" + this.filterNativeType = data.secondSelect || "0" this.filterQueryData() } }) filter!.firstSelect = "1" } - filterQueryData(){ - if (this.queryResult.length > 0&&this.currentSelection) { - let filter = this.queryResult.filter((item)=>{ + filterQueryData() { + if (this.queryResult.length > 0 && this.currentSelection) { + let filter = this.queryResult.filter((item) => { let filterAllocation = true - if(this.filterAllocationType=="1"){ - filterAllocation = item.startTs>=this.currentSelection!.leftNs&&item.startTs<=this.currentSelection!.rightNs&&item.endTs>this.currentSelection!.rightNs - }else if(this.filterAllocationType=="2"){ - filterAllocation = item.startTs>=this.currentSelection!.leftNs&&item.startTs<=this.currentSelection!.rightNs&&item.endTs<=this.currentSelection!.rightNs + if (this.filterAllocationType == "1") { + filterAllocation = item.startTs >= this.currentSelection!.leftNs && item.startTs <= this.currentSelection!.rightNs && item.endTs > this.currentSelection!.rightNs + } else if (this.filterAllocationType == "2") { + filterAllocation = item.startTs >= this.currentSelection!.leftNs && item.startTs <= this.currentSelection!.rightNs && item.endTs <= this.currentSelection!.rightNs } - let filterNative = this.getTypeFromIndex(parseInt(this.filterNativeType),item) - return filterAllocation&&filterNative + let filterNative = this.getTypeFromIndex(parseInt(this.filterNativeType), item) + return filterAllocation && filterNative }) - if(filter.length>0){ + if (filter.length > 0) { this.source = this.handleQueryResult(filter); this.tbl!.recycleDataSource = this.source; - }else { + } else { this.source = [] this.tbl!.recycleDataSource = []; } } } - setRightTableData(hook:NativeMemory){ - let arr:Array = []; + setRightTableData(hook: NativeMemory) { + let arr: Array = []; let frameArr = SpSystemTrace.HEAP_FRAME_DATA.filter((frame) => parseInt(frame.eventId) == hook.eventId); - frameArr.map((frame)=>{ + frameArr.map((frame) => { let target = new NativeHookCallInfo(); target.eventId = parseInt(frame.eventId); target.depth = frame.depth; @@ -275,38 +304,46 @@ export class TabPaneNMemory extends BaseElement { initHtml(): string { return ` - -
      -
      - - - - - - - - - - -
      -
      - - - - - - -
      -
      + +
      +
      + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      `; } -} \ No newline at end of file +} diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneNetworkAbility.ts b/host/ide/src/trace/component/trace/sheet/TabPaneNetworkAbility.ts new file mode 100644 index 0000000..34df806 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPaneNetworkAbility.ts @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {getTabNetworkAbilityData} from "../../../database/SqlLite.js"; +import {SystemNetworkSummary} from "../../../bean/AbilityMonitor.js"; +import {Utils} from "../base/Utils.js"; +import "../../../component/SpFilter.js"; +import {ColorUtils} from "../base/ColorUtils.js"; + +@element('tabpane-network-ability') +export class TabPaneNetworkAbility extends BaseElement { + private tbl: LitTable | null | undefined; + private source: Array = []; + private float: HTMLDivElement | null | undefined; + private queryResult: Array = [] + private search: HTMLInputElement | undefined | null + + set data(val: SelectionParam | any) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.queryDataByDB(val) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-network-ability'); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" + this.tbl?.reMeauseHeight() + } + }).observe(this.parentElement!) + this.tbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail) + }); + } + + filterData() { + if (this.queryResult.length > 0) { + let filter = this.queryResult.filter((item) => { + let array = this.toNetWorkAbilityArray(item) + let isInclude = array.filter(value => value.indexOf(this.search!.value) > -1); + return isInclude.length > 0 + }); + if (filter.length > 0) { + this.source = filter; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.tbl!.recycleDataSource = []; + } + } + } + + toNetWorkAbilityArray(systemNetworkSummary: SystemNetworkSummary): any[] { + let array: Array = [] + array.push(systemNetworkSummary.startTimeStr) + array.push(systemNetworkSummary.durationStr) + array.push(systemNetworkSummary.dataReceivedStr) + array.push(systemNetworkSummary.dataReceivedSecStr) + array.push(systemNetworkSummary.dataSendSecStr) + array.push(systemNetworkSummary.dataSendStr) + array.push(systemNetworkSummary.packetsIn.toString()) + array.push(systemNetworkSummary.packetsOut.toString()) + array.push(systemNetworkSummary.packetsOutSec.toString()) + return array + } + + queryDataByDB(val: SelectionParam | any) { + getTabNetworkAbilityData(val.leftNs, val.rightNs).then(item => { + if (item.length != null && item.length > 0) { + for (const systemNetworkSummary of item) { + if (systemNetworkSummary.startTime == 0) { + systemNetworkSummary.startTimeStr = '0:000.000.000'; + } else { + systemNetworkSummary.startTimeStr = Utils.getTimeStampHMS(systemNetworkSummary.startTime); + } + systemNetworkSummary.durationStr = Utils.getDurString(systemNetworkSummary.duration); + systemNetworkSummary.dataReceivedStr = Utils.getBinaryByteWithUnit(systemNetworkSummary.dataReceived); + systemNetworkSummary.dataReceivedSecStr = Utils.getBinaryByteWithUnit(systemNetworkSummary.dataReceivedSec); + systemNetworkSummary.dataSendStr = Utils.getBinaryByteWithUnit(systemNetworkSummary.dataSend); + systemNetworkSummary.dataSendSecStr = Utils.getBinaryByteWithUnit(systemNetworkSummary.dataSendSec); + systemNetworkSummary.packetsInStr = ColorUtils.formatNumberComma(systemNetworkSummary.packetsIn); + systemNetworkSummary.packetsInSecStr = systemNetworkSummary.packetsInSec.toFixed(2); + systemNetworkSummary.packetsOutStr = ColorUtils.formatNumberComma(systemNetworkSummary.packetsOut); + systemNetworkSummary.packetsOutSecStr = systemNetworkSummary.packetsOutSec.toFixed(2); + } + this.source = item + this.queryResult = item; + this.tbl!.recycleDataSource = this.source; + } else { + this.source = [] + this.queryResult = [] + this.tbl!.recycleDataSource = []; + } + }) + } + + initHtml(): string { + return ` + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: any) { + // @ts-ignore + function compare(property, sort, type) { + return function (a: SystemNetworkSummary, b: SystemNetworkSummary) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(b[property]) - parseFloat(a[property]) : parseFloat(a[property]) - parseFloat(b[property]); + } else { + // @ts-ignore + if (b[property] > a[property]) { + return sort === 2 ? 1 : -1; + } else { // @ts-ignore + if (b[property] == a[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + } + } + + if (detail.key === 'startTime') { + this.source.sort(compare(detail.key, detail.sort, 'string')) + } else { + this.source.sort(compare(detail.key, detail.sort, 'number')) + } + this.tbl!.dataSource = this.source; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPanePTS.ts b/host/ide/src/trace/component/trace/sheet/TabPanePTS.ts index 9b3bf4c..719a8db 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPanePTS.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPanePTS.ts @@ -50,7 +50,7 @@ export class TabPanePTS extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45)+"px" + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!) @@ -61,8 +61,8 @@ export class TabPanePTS extends BaseElement { let pMap: Map = new Map(); let ptMap: Map = new Map(); let ptsMap: Map = new Map(); - SpSystemTrace.SPT_DATA.map((d)=>{ - if(!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)){ + SpSystemTrace.SPT_DATA.map((d) => { + if (!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)) { if (pMap.has(d.processId + "")) { let obj1 = pMap.get(d.processId + ""); obj1!.count++; @@ -244,24 +244,28 @@ export class TabPanePTS extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - + + + + + + + + + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneSPT.ts b/host/ide/src/trace/component/trace/sheet/TabPaneSPT.ts index 2c068cd..a797889 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneSPT.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneSPT.ts @@ -33,7 +33,7 @@ export class TabPaneSPT extends BaseElement { set data(val: SelectionParam | any) { // @ts-ignore - this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45)+"px" + this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45) + "px" this.range!.textContent = "Selected range: " + parseFloat(((val.rightNs - val.leftNs) / 1000000.0).toFixed(5)) + " ms" if (this.loadDataInCache) { this.queryDataByCacheData(val).then((result) => { @@ -50,7 +50,7 @@ export class TabPaneSPT extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45)+"px" + this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!) @@ -64,7 +64,7 @@ export class TabPaneSPT extends BaseElement { let sptMap: Map = new Map(); // @ts-ignore SpSystemTrace.SPT_DATA.map((d) => { - if(!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)){ + if (!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)) { if (statesMap.has(d.state)) { let obj1 = statesMap.get(d.state); obj1!.count++; @@ -242,24 +242,28 @@ export class TabPaneSPT extends BaseElement { initHtml(): string { return ` - - - - - - - - - - - + + + + + + + + + + + + + + + + `; } - } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneSlices.ts b/host/ide/src/trace/component/trace/sheet/TabPaneSlices.ts index 705749b..c596065 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneSlices.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneSlices.ts @@ -62,20 +62,24 @@ export class TabPaneSlices extends BaseElement { initHtml(): string { return ` - - - - - - - - + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneThreadStates.ts b/host/ide/src/trace/component/trace/sheet/TabPaneThreadStates.ts index a9ab4a4..196cb91 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneThreadStates.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneThreadStates.ts @@ -73,27 +73,35 @@ export class TabPaneThreadStates extends BaseElement { initHtml(): string { return ` - -
      - - -
      - - - - - - - - - - + +
      + + +
      + + + + + + + + + + + + + + + + + + `; } diff --git a/host/ide/src/trace/component/trace/sheet/TabPaneThreadSwitch.ts b/host/ide/src/trace/component/trace/sheet/TabPaneThreadSwitch.ts index 9af0690..d833eac 100644 --- a/host/ide/src/trace/component/trace/sheet/TabPaneThreadSwitch.ts +++ b/host/ide/src/trace/component/trace/sheet/TabPaneThreadSwitch.ts @@ -33,7 +33,7 @@ export class TabPaneThreadSwitch extends BaseElement { set data(val: SelectionParam | any) { //@ts-ignore - this.tbl?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 45)+"px"; + this.tbl?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 45) + "px"; this.range!.textContent = "Selected range: " + parseFloat(((val.rightNs - val.leftNs) / 1000000.0).toFixed(5)) + " ms"; if (this.loadDataInCache) { this.queryDataByCacheData(val).then((arr) => { @@ -50,7 +50,7 @@ export class TabPaneThreadSwitch extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45)+"px" + this.tbl?.shadowRoot?.querySelector(".table").style.height = (this.parentElement!.clientHeight - 45) + "px" this.tbl?.reMeauseHeight() } }).observe(this.parentElement!); @@ -63,7 +63,7 @@ export class TabPaneThreadSwitch extends BaseElement { let spMap: Map = new Map(); let sptMap: Map = new Map(); SpSystemTrace.SPT_DATA.map((d) => { - if(!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)){ + if (!(d.end_ts < val.leftNs || d.start_ts > val.rightNs)) { if (statesMap.has(d.state)) { let obj1 = statesMap.get(d.state); obj1!.count++; @@ -241,18 +241,20 @@ export class TabPaneThreadSwitch extends BaseElement { initHtml(): string { return ` - - - - - - + + + + + + + + `; } } \ No newline at end of file diff --git a/host/ide/src/trace/component/trace/sheet/TabPerfProfile.ts b/host/ide/src/trace/component/trace/sheet/TabPerfProfile.ts new file mode 100644 index 0000000..a8b9616 --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPerfProfile.ts @@ -0,0 +1,463 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import "./TabPaneFilter.js"; +import {FilterData, TabPaneFilter} from "./TabPaneFilter.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {perfDataQuery} from "../../hiperf/PerfDataQuery.js"; +import {PerfCallChainMerageData} from "../../../bean/PerfProfile.js"; +import "../../FrameChart.js"; +import { FrameChart } from "../../FrameChart.js"; +import { ChartMode } from "../../../database/ProcedureWorkerCommon.js"; +import '../../DisassemblingWindow.js' +import {DisassemblingWindow} from "../../DisassemblingWindow.js"; +import {Cmd} from "../../../../command/cmd.js"; +import {SpApplication} from "../../../SpApplication.js"; + +@element('tabpane-perf-profile') +export class TabpanePerfProfile extends BaseElement { + private tbl: LitTable | null | undefined; + private tbr: LitTable | null | undefined; + private rightSource: Array = []; + private filter: any + private sampleIds:string[] = [] + private dataSource:any[] = [] + private currentSelectedData:any = undefined + private frameChart: FrameChart | null | undefined; + private isChartShow: boolean = false; + private systmeRuleName = "/system/" + private numRuleName = "/max/min/" + private modal: DisassemblingWindow | null | undefined; + + set data(val: SelectionParam | any) { + this.modal!.style.display = 'none'; + (this.shadowRoot?.querySelector('#show_table > #left_table') as HTMLElement)!.style.visibility = "visible"; + if (this.parentElement!.clientHeight > this.filter!.clientHeight) { + this.filter!.style.display = "flex"; + } else { + this.filter!.style.display = "none"; + } + this.filter!.initializeFilterTree(true,true,true) + this.filter!.filterValue = "" + perfDataQuery.searchValue = "" + this.sampleIds = val.perfSampleIds + this.dataSource = perfDataQuery.getCallChainsBySampleIds(val.perfSampleIds,true) + this.frameChart!.mode = ChartMode.Count; + this.frameChart!.data = this.dataSource; + this.frameChart?.updateCanvas(true); + this.frameChart?.calculateChartData(); + this.tbl!.recycleDataSource = this.dataSource; + this.tbr!.recycleDataSource = [] + } + + getParentTree(src: Array, target: PerfCallChainMerageData, parents: Array): boolean { + for (let call of src) { + if (call.id == target.id) { + parents.push(call) + return true + } else { + if (this.getParentTree(call.children as Array, target, parents)) { + parents.push(call); + return true; + } + } + } + return false; + } + + getChildTree(src: Array, id: string, children: Array): boolean { + for (let call of src) { + if (call.id == id && call.children.length == 0) { + children.push(call) + return true + } else { + if (this.getChildTree(call.children as Array, id, children)) { + children.push(call); + return true; + } + } + } + return false; + } + + setRightTableData(call: PerfCallChainMerageData) { + let parents: Array = []; + let children: Array = []; + this.getParentTree(this.dataSource, call, parents); + let maxId = call.id; + let maxDur = 0; + + function findMaxStack(call: PerfCallChainMerageData) { + if (call.children.length == 0) { + if (call.dur > maxDur) { + maxDur = call.dur; + maxId = call.id; + } + } else { + call.children.map((callChild) => { + findMaxStack(callChild); + }) + } + } + findMaxStack(call); + this.getChildTree(call.children as Array, maxId, children); + let arr = parents.reverse().concat(children.reverse()); + for (let data of arr) { + data.type = (data.libName.endsWith(".so.1") || data.libName.endsWith(".dll") || data.libName.endsWith(".so")) ? 0 : 1; + } + let len = arr.length; + this.rightSource = arr; + this.tbr!.recycleDataSource = len == 0 ? [] : this.rightSource.slice(3,len); + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-perf-profile'); + this.frameChart = this.shadowRoot?.querySelector('#framechart'); + let pageTab = this.shadowRoot?.querySelector('#show_table'); + let pageChart = this.shadowRoot?.querySelector('#show_chart'); + this.modal = this.shadowRoot?.querySelector('tab-native-data-modal'); + this.parentElement!.onscroll = () => { + this.frameChart!.tabPaneScrollTop = this.parentElement!.scrollTop; + }; + this.tbl!.rememberScrollTop = true; + this.filter = this.shadowRoot?.querySelector("#filter") + this.tbl!.addEventListener('row-click', (evt:any) => { + // @ts-ignore + let data = (evt.detail.data as PerfCallChainMerageData); + this.setRightTableData(data); + data.isSelected = true; + this.currentSelectedData = data; + this.tbr?.clearAllSelection(data); + this.tbr?.setCurrentSelection(data); + // @ts-ignore + if((evt.detail as any).callBack){ + // @ts-ignore + (evt.detail as any).callBack(true) + } + }) + this.tbr = this.shadowRoot?.querySelector('#tb-perf-list'); + let lastClikTime = 0; + this.tbr!.addEventListener('row-click', (evt:any) => { + // @ts-ignore + let data = (evt.detail.data as PerfCallChainMerageData); + this.tbl?.clearAllSelection(data); + (data as any).isSelected = true + this.tbl!.scrollToData(data) + // @ts-ignore + if ((evt.detail as any).callBack) { + // @ts-ignore + (evt.detail as any).callBack(true) + } + let spApplication = document.getElementsByTagName("sp-application")[0]; + if (Date.now() - lastClikTime < 200 && spApplication.vs){ + (this.shadowRoot?.querySelector('#show_table > #left_table') as HTMLElement)!.style.visibility = "hidden"; + this.filter.style.display = "none"; + this.modal!.showLoading(); + // @ts-ignore + let data = (evt.detail.data as PerfCallChainMerageData); + let path = data.path; + let addr = data.vaddrInFile; + let addrHex = addr.toString(16); + if (path.trim() === '[kernel.kallsyms]'){ + this.modal?.showContent(`error : Symbol ${data.symbol} lib is [kernel.kallsyms] ,not support `,addrHex); + } else if (path.trim() ===''){ + this.modal?.showContent(`error : Symbol ${data.symbol} lib is null `,addrHex); + }else if (addr < 0){ + this.modal?.showContent(`error : Symbol ${data.symbol} current addr is error ` + addrHex,addrHex); + } else { + const binDir = 'C:/binary_cache'; + let binPath = binDir + path; + let cmd = 'C:/binary_cache/llvm-objdump.exe -S ' + binPath; + Cmd.execObjDump(cmd,addrHex,(result : any) => { + this.modal?.showContent(result,addrHex); + }) + } + } + lastClikTime = Date.now(); + }) + this.tbr = this.shadowRoot?.querySelector('#tb-perf-list'); + let filterHeight = 0; + new ResizeObserver((entries) => { + if(this.parentElement!.scrollTop != 0){ + this.parentElement!.scrollTo(0,0); + } + let tabPaneFilter = this.shadowRoot!.querySelector("#filter") as HTMLElement; + if (tabPaneFilter.clientHeight > 0) filterHeight = tabPaneFilter.clientHeight; + if (this.parentElement!.clientHeight > filterHeight) { + tabPaneFilter.style.display = "flex"; + } else { + tabPaneFilter.style.display = "none"; + } + this.modal!.style.height = (this.shadowRoot?.querySelector('#show_table > #right_table') as HTMLElement)!.clientHeight - 2 + 'px'; //2 is borderWidth + if ((this.shadowRoot?.querySelector('#show_table > #left_table') as HTMLElement)!.style.visibility == "hidden") { + tabPaneFilter.style.display = "none"; + } + if (this.parentElement?.clientHeight != 0) { + if (!this.isChartShow) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 10 - 35)+"px" + this.tbl?.reMeauseHeight() + } else { + this.frameChart?.updateCanvas(false,entries[0].contentRect.width); + this.frameChart?.calculateChartData(); + } + // @ts-ignore + this.tbr?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 45 - 21) + "px" + this.tbr?.reMeauseHeight() + } + }).observe(this.parentElement!) + let filterFunc = (data:any)=>{ + if (data.type == "check") { + if(data.item.checked) { + perfDataQuery.splitTree(this.dataSource,data.item.name,data.item.select == "0",data.item.type=="symbol") + }else { + perfDataQuery.resotreAllNode([data.item.name]) + perfDataQuery.resetAllNode(this.dataSource) + perfDataQuery.clearSplitMapData(data.item.name) + } + }else if (data.type == "select") { + perfDataQuery.resotreAllNode([data.item.name]) + perfDataQuery.clearSplitMapData(data.item.name) + perfDataQuery.splitTree(this.dataSource,data.item.name,data.item.select == "0",data.item.type=="symbol") + }else if (data.type=="button") { + if (data.item == "symbol") { + if(this.currentSelectedData&&this.currentSelectedData.symbolName == perfDataQuery.threadData[this.currentSelectedData.tid]?.processName){ + return + } + if (this.currentSelectedData != undefined) { + this.filter!.addDataMining({name:this.currentSelectedData.symbolName},data.item) + perfDataQuery.splitTree(this.dataSource,this.currentSelectedData.symbolName,false,true) + }else { + return + } + }else if (data.item == "library") { + if(this.currentSelectedData&&this.currentSelectedData.symbolName == perfDataQuery.threadData[this.currentSelectedData.tid]?.processName){ + return + } + if (this.currentSelectedData != undefined) { + this.filter!.addDataMining({name:this.currentSelectedData.libName},data.item) + perfDataQuery.splitTree(this.dataSource,this.currentSelectedData.libName,false,false) + }else { + return + } + }else if (data.item == "restore") { + if (data.remove != undefined&&data.remove.length > 0) { + let list = data.remove.map((item:any)=>{ + return item.name + }) + perfDataQuery.resotreAllNode(list) + perfDataQuery.resetAllNode(this.dataSource) + list.forEach((symbolName:string)=>{ + perfDataQuery.clearSplitMapData(symbolName) + }) + } + } + } + this.tbl!.recycleDataSource = this.dataSource + this.frameChart!.data = this.dataSource; + if (this.isChartShow) this.frameChart?.calculateChartData(); + this.tbl!.move1px() + if(this.currentSelectedData){ + this.currentSelectedData.isSelected = false; + this.tbl?.clearAllSelection(this.currentSelectedData) + this.tbr!.recycleDataSource = [] + this.currentSelectedData = undefined + } + } + this.filter!.getDataLibrary(filterFunc) + this.filter!.getDataMining(filterFunc) + this.filter!.getCallTreeData((data:any)=>{ + if(data.value == 0){ + this.refreshAllNode({...this.filter!.getFilterTreeData(),callTree:data.checks}) + }else { + if(data.checks[1]){ + this.hideSystemLibrary() + perfDataQuery.resetAllNode(this.dataSource) + }else { + perfDataQuery.resotreAllNode([this.systmeRuleName]) + perfDataQuery.resetAllNode(this.dataSource) + perfDataQuery.clearSplitMapData(this.systmeRuleName) + } + this.tbl!.recycleDataSource = this.dataSource + this.frameChart!.data = this.dataSource; + if (this.isChartShow) this.frameChart?.calculateChartData(); + } + }) + this.filter!.getCallTreeConstraintsData((data:any)=>{ + perfDataQuery.resotreAllNode([this.numRuleName]) + perfDataQuery.clearSplitMapData(this.numRuleName) + if(data.checked){ + this.hideNumMaxAndMin(parseInt(data.min),data.max) + } + perfDataQuery.resetAllNode(this.dataSource) + this.tbl!.recycleDataSource = this.dataSource + this.frameChart!.data = this.dataSource; + if (this.isChartShow) this.frameChart?.calculateChartData(); + }) + this.filter!.getFilterData((data:FilterData)=>{ + if(perfDataQuery.searchValue != this.filter!.filterValue){ + perfDataQuery.searchValue = this.filter!.filterValue + perfDataQuery.resetAllNode(this.dataSource) + this.tbl!.recycleDataSource = this.dataSource + } + if (data.icon == 'block'){ + pageChart?.setAttribute('class', 'show'); + pageTab?.setAttribute('class', ''); + this.isChartShow = true; + this.filter!.disabledMining = true; + this.frameChart?.calculateChartData(); + } else if (data.icon == 'tree') { + pageChart?.setAttribute('class', ''); + pageTab?.setAttribute('class', 'show'); + this.isChartShow = false; + this.filter!.disabledMining = false; + this.frameChart!.clearCanvas(); + } + }) + } + + filterSampleIds(checked:boolean,min:string,max:string):Array{ + let ids:Array = []; + if(checked){ + let minId = parseInt(min); + let maxId = max == "∞" ? -999 : parseInt(max); + if(minId != NaN && maxId != NaN){ + for (let sampleId of this.sampleIds) { + let id = parseInt(sampleId); + if(id != NaN){ + if(id >= minId) { + if (maxId == -999) { + ids.push(sampleId); + } else if (id <= maxId) { + ids.push(sampleId); + }else{ + continue; + } + } + } + } + } + }else{ + ids.push(...this.sampleIds) + } + return ids; + } + + hideSystemLibrary(){ + this.dataSource.forEach((item)=>{ + item.children = [] + perfDataQuery.recursionChargeByRule(item,this.systmeRuleName,(node)=>{ + return node.path.startsWith(this.systmeRuleName) + }) + }) + } + + hideNumMaxAndMin(startNum:number,endNum:string){ + let max = endNum == "∞"?Number.POSITIVE_INFINITY :parseInt(endNum) + this.dataSource.forEach((item)=>{ + item.children = [] + perfDataQuery.recursionChargeByRule(item,this.numRuleName,(node)=>{ + return node.dur < startNum || node.dur > max + }) + }) + } + + refreshAllNode(filterData:any){ + let isTopDown:boolean = !filterData.callTree[0]; + let isHideSystemLibrary = filterData.callTree[1]; + let list = filterData.dataMining.concat(filterData.dataLibrary); + this.dataSource = perfDataQuery.getCallChainsBySampleIds(this.sampleIds,isTopDown); + this.tbr!.recycleDataSource = [] + if(isHideSystemLibrary){ + this.hideSystemLibrary() + } + if(filterData.callTreeConstraints.checked){ + this.hideNumMaxAndMin(parseInt(filterData.callTreeConstraints.inputs[0]),filterData.callTreeConstraints.inputs[1]) + } + list.forEach((item:any)=>{ + this.dataSource.forEach((process)=>{ + if(item.select == "0"){ + perfDataQuery.recursionChargeInitTree(process, item.name, item.type == "symbol") + }else { + perfDataQuery.recursionPruneInitTree(process, item.name, item.type == "symbol") + } + }) + if(!item.checked){ + perfDataQuery.resotreAllNode([item.name]) + } + }) + perfDataQuery.resetAllNode(this.dataSource) + this.tbl!.recycleDataSource = this.dataSource + this.frameChart!.data = this.dataSource; + if (this.isChartShow) this.frameChart?.calculateChartData(); + } + + initHtml(): string { + return ` + +
      + + +
      + + + + + +
      +
      +
      Heaviest Stack Trace
      + + + + + + +
      +
      + + + + + +
      `; + } +} diff --git a/host/ide/src/trace/component/trace/sheet/TabPerfSampleList.ts b/host/ide/src/trace/component/trace/sheet/TabPerfSampleList.ts new file mode 100644 index 0000000..3befd1c --- /dev/null +++ b/host/ide/src/trace/component/trace/sheet/TabPerfSampleList.ts @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseElement, element} from "../../../../base-ui/BaseElement.js"; +import {LitTable} from "../../../../base-ui/table/lit-table.js"; +import {SelectionParam} from "../../../bean/BoxSelection.js"; +import {perfDataQuery} from "../../hiperf/PerfDataQuery.js"; +import {queryPerfProcess, queryPerfSampleCallChain, queryPerfSampleListByTimeRange} from "../../../database/SqlLite.js"; +import {PerfCallChain, PerfFile, PerfSample, PerfStack, PerfThread} from "../../../bean/PerfProfile.js"; +import {Utils} from "../base/Utils.js"; +import '../../DisassemblingWindow.js' +import {DisassemblingWindow} from "../../DisassemblingWindow.js"; +import {Cmd} from "../../../../command/cmd.js"; +import {SpApplication} from "../../../SpApplication.js"; + +@element('tabpane-perf-sample') +export class TabPanePerfSample extends BaseElement { + private tbl: LitTable | null | undefined; + private tblData: LitTable | null | undefined; + private source: Array = []; + private processMap: Map = new Map(); + private modal: DisassemblingWindow | null | undefined; + + set data(val: SelectionParam | null | undefined) { + this.modal!.style.display = 'none'; + (this.shadowRoot?.querySelector('div > #left_table') as HTMLElement)!.style.visibility = "visible"; + // @ts-ignore + this.tbl?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 40) + "px"; + this.tbl!.recycleDataSource = []; + // @ts-ignore + this.tblData?.shadowRoot?.querySelector(".table")?.style?.height = (this.parentElement!.clientHeight - 25) + "px"; + this.tblData!.recycleDataSource = []; + if (val) { + Promise.all([queryPerfProcess(), + queryPerfSampleListByTimeRange(val.leftNs, val.rightNs, val.perfAll ? [] : val.perfCpus, val.perfAll ? [] : val.perfProcess, val.perfAll ? [] : val.perfThread) + ]).then((results) => { + let processes = results[0] as Array; + let samples = results[1] as Array; + this.processMap.clear(); + for (let process of processes) { + this.processMap.set(process.pid, process) + } + for (let sample of samples) { + let process = this.processMap.get(sample.pid); + sample.processName = process == null || process == undefined ? `Process(${sample.pid})` : `${process!.processName}(${sample.pid})`; + sample.threadName = sample.threadName == null || sample.threadName == undefined ? `Thread(${sample.tid})` : `${sample.threadName}(${sample.tid})`; + sample.coreName = `CPU ${sample.core}`; + sample.timeString = Utils.getTimeString(sample.time); + let arr = (perfDataQuery.callChainData[sample.sampleId] ?? []) as Array; + let calls = arr.slice(0, arr.length - 2) + let last = calls[calls.length - 1]; + sample.depth = calls.length; + sample.fileId = last.fileId; + sample.symbolId = last.symbolId; + sample.addr = last.vaddrInFile.toString(); + let files = (perfDataQuery.filesData[sample.fileId] ?? []) as Array; + sample.backtrace = []; + if (sample.symbolId == -1 || sample.symbolId > files.length - 1) { + sample.backtrace.push(`0x${sample.addr}`) + } else { + sample.backtrace.push(files[sample.symbolId].symbol) + } + sample.backtrace.push(`(${sample.depth} other frames)`); + } + this.source = samples; + this.tbl!.recycleDataSource = this.source; + }) + + } + + } + + setRightTableData(sample: PerfSample) { + queryPerfSampleCallChain(sample.sampleId).then((result) => { + let stackArr: Array = []; + for (let perfCallChain of result) { + let stack = new PerfStack(); + stack.fileId = perfCallChain.fileId; + let files = (perfDataQuery.filesData[stack.fileId] ?? []) as Array; + if (perfCallChain.symbolId == -1 || perfCallChain.symbolId > files.length - 1) { + stack.symbol = `0x${perfCallChain.vaddrInFile}` + stack.path = ""; + } else { + stack.symbol = files[perfCallChain.symbolId].symbol + stack.path = files[perfCallChain.symbolId].path + } + stack.vaddrInFile = perfCallChain.vaddrInFile; + stack.type = (stack.path.endsWith(".so.1") || stack.path.endsWith(".dll") || stack.path.endsWith(".so")) ? 0 : 1; + stackArr.push(stack) + } + this.tblData!.recycleDataSource = stackArr + }) + } + + initElements(): void { + this.tbl = this.shadowRoot?.querySelector('#tb-perf-sample'); + this.tblData = this.shadowRoot?.querySelector('#tb-stack-data'); + this.modal = this.shadowRoot?.querySelector('tab-native-data-modal'); + this.tbl!.addEventListener('row-click', (e) => { + // @ts-ignore + let data = (e.detail.data as PerfSample); + this.setRightTableData(data); + }); + let lastClikTime = 0; + let spApplication = document.getElementsByTagName("sp-application")[0]; + this.tblData!.addEventListener("row-click", (e) => { + if (Date.now() - lastClikTime < 200 && spApplication.vs){ + (this.shadowRoot?.querySelector('div > #left_table') as HTMLElement)!.style.visibility = "hidden"; + this.modal!.showLoading(); + // @ts-ignore + let data = (e.detail.data as PerfStack); + let path = data.path; + let addr = data.vaddrInFile; + let addrHex = addr.toString(16); + if (path.trim() === '[kernel.kallsyms]'){ + this.modal?.showContent(`error : Symbol ${data.symbol} lib is [kernel.kallsyms] ,not support `,addrHex); + } else if (path.trim() ===''){ + this.modal?.showContent(`error : Symbol ${data.symbol} lib is null `,addrHex); + }else if (addr < 0){ + this.modal?.showContent(`error : Symbol ${data.symbol} current addr is error ` + addrHex,addrHex); + } else { + const binDir = 'C:/binary_cache'; + let binPath = binDir + path; + let cmd = 'C:/binary_cache/llvm-objdump.exe -S ' + binPath; + Cmd.execObjDump(cmd,addrHex,(result : any) => { + this.modal?.showContent(result,addrHex); + }) + } + } + lastClikTime = Date.now(); + }); + new ResizeObserver((entries) => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tbl?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 40) + "px" + // @ts-ignore + this.tblData?.shadowRoot.querySelector(".table").style.height = (this.parentElement.clientHeight - 25) + "px" + this.tbl?.reMeauseHeight() + this.tblData?.reMeauseHeight(); + } + this.modal!.style.height = (this.shadowRoot?.querySelector('div > #right_table') as HTMLElement)!.clientHeight - 2 + 'px'; //2 is borderWidth + }).observe(this.parentElement!) + } + + initHtml(): string { + return ` + +
      + +
      + + + + + + + + + + + +
      +
      + + + + + + +
      +
      `; + } +} diff --git a/host/ide/src/trace/component/trace/sheet/TabProgressBar.ts b/host/ide/src/trace/component/trace/sheet/TabProgressBar.ts index 74640f8..2d55de7 100644 --- a/host/ide/src/trace/component/trace/sheet/TabProgressBar.ts +++ b/host/ide/src/trace/component/trace/sheet/TabProgressBar.ts @@ -19,38 +19,38 @@ import {BaseElement, element} from "../../../../base-ui/BaseElement.js"; @element('tab-progress-bar') export class TabProgressBar extends BaseElement { - initElements(): void { - let data:Array = this.getAttribute("data")!.split(",") - let first: HTMLDivElement | undefined | null =this.shadowRoot?.querySelector("#first") - let second: HTMLDivElement | undefined | null =this.shadowRoot?.querySelector("#second") - if (data!.length > 0 && data && data![2]!="0") { - if (parseInt(data[0])< 0) { - first!.style.width = (Number((Math.abs(parseInt(data[0]))/parseInt(data[2]))*100)).toFixed(2) + "%" - first!.style.background = "#FC74FF" - }else { - first!.style.width = (Number((parseInt(data[0])/parseInt(data[2]))*100)).toFixed(2) + "%" - } - if (parseInt(data[1])< 0) { - second!.style.width = (Number((Math.abs(parseInt(data[1])) / parseInt(data[2])) * 100)).toFixed(2) + "%" - first!.style.background = "#CC34CF" - }else { - second!.style.width = (Number((parseInt(data[1]) / parseInt(data[2])) * 100)).toFixed(2) + "%" - } - } - - } - - - - initHtml(): string { - return ` - -
      -
      + initElements(): void { + let data: Array = this.getAttribute("data")!.split(",") + let first: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector("#first") + let second: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector("#second") + if (data!.length > 0 && data && data![2] != "0") { + if (parseInt(data[0]) < 0) { + first!.style.width = (Number((Math.abs(parseInt(data[0])) / parseInt(data[2])) * 100)).toFixed(2) + "%" + first!.style.background = "#FC74FF" + } else { + first!.style.width = (Number((parseInt(data[0]) / parseInt(data[2])) * 100)).toFixed(2) + "%" + } + if (parseInt(data[1]) < 0) { + second!.style.width = (Number((Math.abs(parseInt(data[1])) / parseInt(data[2])) * 100)).toFixed(2) + "%" + first!.style.background = "#CC34CF" + } else { + second!.style.width = (Number((parseInt(data[1]) / parseInt(data[2])) * 100)).toFixed(2) + "%" + } + } + + } + + initHtml(): string { + return ` + +
      +
      +
      +
      `; - } + } } diff --git a/host/ide/src/trace/component/trace/timer-shaft/Flag.ts b/host/ide/src/trace/component/trace/timer-shaft/Flag.ts index aaf2f29..36762b5 100644 --- a/host/ide/src/trace/component/trace/timer-shaft/Flag.ts +++ b/host/ide/src/trace/component/trace/timer-shaft/Flag.ts @@ -23,8 +23,9 @@ export class Flag { selected: boolean = false text: string = "" hidden: boolean = false; - type:string = ""; - constructor(x: number, y: number, width: number, height: number, time: number, color: string = "#999999", selected = false, type:string="") { + type: string = ""; + + constructor(x: number, y: number, width: number, height: number, time: number, color: string = "#999999", selected = false, type: string = "") { this.x = x; this.y = y; this.width = width; diff --git a/host/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts b/host/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts index 3836cbf..a8bed7c 100644 --- a/host/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts +++ b/host/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts @@ -62,6 +62,12 @@ export class Mark extends Graph { } export interface TimeRange { + slicesTime: { + color: string|null|undefined; + startTime: number | null | undefined; + endTime: number | null | undefined; + }; + scale: number; totalNS: number startX: number endX: number @@ -89,8 +95,8 @@ export class RangeRuler extends Graph { currentDuration: number = 0 centerXPercentage: number = 0; animaStartTime: number | undefined - animTime: number = 100; - p: number = 800; + animTime: number = 250; + p: number = 2000; private readonly notifyHandler: (r: TimeRange) => void; private scale: number = 0; //缩放级别 @@ -100,7 +106,7 @@ export class RangeRuler extends Graph { 100_000_000_000, 200_000_000_000, 500_000_000_000]; private _cpuUsage: Array<{ cpu: number, ro: number, rate: number }> = [] - constructor(timerShaftEL:TimerShaftElement, frame: Rect, range: TimeRange, notifyHandler: (r: TimeRange) => void) { + constructor(timerShaftEL: TimerShaftElement, frame: Rect, range: TimeRange, notifyHandler: (r: TimeRange) => void) { super(timerShaftEL.canvas, timerShaftEL.ctx!, frame) this.range = range; this.notifyHandler = notifyHandler; @@ -192,6 +198,7 @@ export class RangeRuler extends Graph { } else { this.range.xsTxt = [] } + this.range.scale = this.scale; if (yu != 0) { let firstNodeWidth = ((this.scale - yu) / this.scale * realW); startX += firstNodeWidth; @@ -329,13 +336,14 @@ export class RangeRuler extends Graph { this.markB.inspectionFrame.x = this.markB.frame.x - markPadding } - setRangeNS(startNS:number,endNS:number) { + setRangeNS(startNS: number, endNS: number) { this.range.startNS = startNS this.range.endNS = endNS this.fillX() this.draw(); } - getRange():TimeRange{ + + getRange(): TimeRange { return this.range; } @@ -345,7 +353,7 @@ export class RangeRuler extends Graph { } let startTime = new Date().getTime(); let duration = (startTime - this.animaStartTime); - if (duration < this.animTime) duration = this.animTime + if (duration < this.animTime * 2) duration = duration + this.animTime this.currentDuration = duration if (this.isPress) return this.isPress = true diff --git a/host/ide/src/trace/component/trace/timer-shaft/SportRuler.ts b/host/ide/src/trace/component/trace/timer-shaft/SportRuler.ts index ac43c90..7dc6cd1 100644 --- a/host/ide/src/trace/component/trace/timer-shaft/SportRuler.ts +++ b/host/ide/src/trace/component/trace/timer-shaft/SportRuler.ts @@ -22,7 +22,9 @@ import {TraceRow} from "../base/TraceRow.js"; import {SpApplication} from "../../../SpApplication.js"; export class SportRuler extends Graph { + static isMouseInSportRuler = false; public flagList: Array = []; + isRangeSelect: boolean = false;//region selection private hoverFlag: Flag = new Flag(0, 0, 0, 0, 0); private lineColor: string | null = null; private rulerW = 0; @@ -30,11 +32,17 @@ export class SportRuler extends Graph { private readonly notifyHandler: ((hoverFlag: Flag | undefined | null, selectFlag: Flag | undefined | null) => void) | undefined; private readonly flagClickHandler: ((flag: Flag | undefined | null) => void) | undefined; private invertedTriangleTime: number | null | undefined = null; - isRangeSelect: boolean = false;//region selection + private slicesTime: { startTime: number | null | undefined, endTime: number | null | undefined, color: string | null } | null = { + startTime: null, + endTime: null, + color: null + }; + private timerShaftEL: TimerShaftElement|undefined|null; constructor(timerShaftEL: TimerShaftElement, frame: Rect, notifyHandler: (hoverFlag: Flag | undefined | null, selectFlag: Flag | undefined | null) => void, flagClickHandler: (flag: Flag | undefined | null) => void) { super(timerShaftEL.canvas, timerShaftEL.ctx!, frame) this.notifyHandler = notifyHandler; this.flagClickHandler = flagClickHandler; + this.timerShaftEL = timerShaftEL; } get range(): TimeRange { @@ -63,7 +71,7 @@ export class SportRuler extends Graph { draw(): void { this.rulerW = this.canvas!.offsetWidth - this.c.clearRect(this.frame.x, this.frame.y, this.frame.width, this.frame.height+1) + this.c.clearRect(this.frame.x, this.frame.y, this.frame.width, this.frame.height + 1) this.c.beginPath(); this.lineColor = window.getComputedStyle(this.canvas!, null).getPropertyValue("color"); this.c.strokeStyle = this.lineColor //"#dadada" @@ -134,8 +142,9 @@ export class SportRuler extends Graph { this.c.closePath(); } if (this.invertedTriangleTime != null && typeof (this.invertedTriangleTime) != undefined) { - this.drawInvertedTriangle(this.invertedTriangleTime,document.querySelector("sp-application")!.dark?"#FFFFFF":"#000000") + this.drawInvertedTriangle(this.invertedTriangleTime, document.querySelector("sp-application")!.dark ? "#FFFFFF" : "#000000") } + this.drawSlicesMark(this.slicesTime?.startTime, this.slicesTime?.endTime) } drawTriangle(time: number, type: string) { @@ -163,6 +172,17 @@ export class SportRuler extends Graph { } else if (type == "square") { if (i != -1) { this.flagList[i].type = ""; + } else { + let triangle = this.flagList.findIndex(it => it.type == "triangle"); + if (triangle !== -1) { + this.flagList[triangle].type = ""; + this.draw(); + this.notifyHandler && this.notifyHandler( + !this.hoverFlag.hidden ? this.hoverFlag : null, + this.flagList.find(it => it.selected) || null + ) + return this.flagList[triangle].time; + } } } else if (type == "inverted") { this.invertedTriangleTime = time @@ -175,10 +195,10 @@ export class SportRuler extends Graph { } } - removeTriangle(type:string){ + removeTriangle(type: string) { if (type == "inverted") { this.invertedTriangleTime = null; - }else { + } else { let i = this.flagList.findIndex(it => it.type == type) if (i !== -1) { this.flagList.splice(i, 1) @@ -189,16 +209,16 @@ export class SportRuler extends Graph { !this.hoverFlag.hidden ? this.hoverFlag : null, this.flagList.find(it => it.selected) || null ) - } + } - drawInvertedTriangle(time: number, color: string = "#000000"){ + drawInvertedTriangle(time: number, color: string = "#000000") { if (time != null && typeof (time) != undefined) { let x = Math.round(this.rulerW * (time - this.range.startNS) / (this.range.endNS - this.range.startNS)); this.c.beginPath(); this.c.fillStyle = color; this.c.strokeStyle = color; - this.c.moveTo(x-2, 142); - this.c.lineTo(x+2, 142); + this.c.moveTo(x - 2, 142); + this.c.lineTo(x + 2, 142); this.c.lineTo(x, 145); this.c.fill() this.c.closePath() @@ -206,6 +226,80 @@ export class SportRuler extends Graph { } } + setSlicesMark(startTime: number | null = null, endTime: number | null = null) { + if (startTime != null && typeof (startTime) != undefined && endTime != null && typeof (endTime) != undefined) { + this.slicesTime = { + startTime: startTime <= endTime ? startTime : endTime, + endTime: startTime <= endTime ? endTime : startTime, + color: null + }; + } else { + this.slicesTime = {startTime: null, endTime: null, color: null}; + } + this.range.slicesTime = this.slicesTime; + this.draw(); + this.timerShaftEL?.render(); + } + + drawSlicesMark(startTime: number | null = null, endTime: number | null = null) { + if (startTime != null && typeof (startTime) != undefined && endTime != null && typeof (endTime) != undefined) { + let startX = Math.round(this.rulerW * (startTime - this.range.startNS) / (this.range.endNS - this.range.startNS)); + let endX = Math.round(this.rulerW * (endTime - this.range.startNS) / (this.range.endNS - this.range.startNS)); + this.c.beginPath(); + if (document.querySelector("sp-application")!.dark) { + this.c.strokeStyle = "#FFF" + this.c.fillStyle = "#FFF" + this.range.slicesTime.color = "#FFF" + } else { + this.c.strokeStyle = "#344596" + this.c.fillStyle = "#344596" + this.range.slicesTime.color = "#344596" + } + this.c.moveTo(startX + 9, 132); + this.c.lineTo(startX, 141); + this.c.lineTo(startX, 132); + this.c.lineTo(startX + 9, 132); + + this.c.lineTo(endX - 9, 132); + this.c.lineTo(endX, 132); + this.c.lineTo(endX, 141); + this.c.lineTo(endX - 9, 132); + // this.c.fill() + this.c.closePath() + this.c.stroke(); + + + this.c.beginPath(); + if (document.querySelector("sp-application")!.dark) { + this.c.strokeStyle = "#FFF" + this.c.fillStyle = "#FFF" + } else { + this.c.strokeStyle = "#000" + this.c.fillStyle = "#000" + } + let lineWidth = endX - startX; + let txt = ns2s((endTime || 0) - (startTime || 0)); + this.c.moveTo(startX, this.frame.y + 22); + this.c.lineTo(endX, this.frame.y + 22); + this.c.moveTo(startX, this.frame.y + 22 - 5); + this.c.lineTo(startX, this.frame.y + 22 + 5); + this.c.moveTo(endX, this.frame.y + 22 - 5); + this.c.lineTo(endX, this.frame.y + 22 + 5); + let txtWidth = this.c.measureText(txt).width; + if (lineWidth > txtWidth) { + this.c.fillText(`${txt}`, startX + (lineWidth - txtWidth) / 2, this.frame.y + 20) + } else { + if (endX + txtWidth >= this.frame.width) { + this.c.fillText(`${txt}`, startX - 5 - txtWidth, this.frame.y + 20) + } else { + this.c.fillText(`${txt}`, endX + 5, this.frame.y + 20) + } + } + this.c.stroke(); + this.c.closePath(); + } + } + //绘制旗子 drawFlag(x: number, color: string = "#999999", isFill: boolean = false, text: string = "", type: string = "") { this.c.beginPath(); @@ -277,7 +371,6 @@ export class SportRuler extends Graph { ) } - static isMouseInSportRuler = false; edgeDetection(ev: MouseEvent): boolean { let x = ev.offsetX - (this.canvas?.offsetLeft || 0) diff --git a/host/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts b/host/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts index e397fbe..037cabe 100644 --- a/host/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts +++ b/host/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts @@ -54,50 +54,50 @@ export class TabPaneFlag extends BaseElement { initHtml(): string { return ` - -
      -
      Annotation at
      - - Change color: - -
      + +
      +
      Annotation at
      + + Change color: + +
      `; } diff --git a/host/ide/src/trace/database/Procedure.ts b/host/ide/src/trace/database/Procedure.ts index 8793eaf..fcc4baf 100644 --- a/host/ide/src/trace/database/Procedure.ts +++ b/host/ide/src/trace/database/Procedure.ts @@ -36,7 +36,15 @@ class ProcedureThread extends Worker { } if (transfer) { try { + if (Array.isArray(transfer) ) { + if(transfer.length > 0){ + this.postMessage(pam, [...transfer]); + }else{ + this.postMessage(pam); + } + } else { this.postMessage(pam, [transfer]); + } } catch (e: any) { } } else { @@ -59,8 +67,10 @@ class ProcedurePool { cpusLen = ProcedurePool.build('cpu', 8); freqLen = ProcedurePool.build('freq', 2); processLen = ProcedurePool.build('process', 8); + ability = ProcedurePool.build('ability', 4); // names = [...this.cpusLen, ...this.freqLen, ...this.processLen, ...this.memLen, ...this.threadLen, ...this.funcLen]; - names = [...this.cpusLen, ...this.processLen, ...this.freqLen]; + names = [...this.cpusLen, ...this.processLen, ...this.freqLen, ...this.ability]; + onComplete: Function | undefined;//任务完成回调 constructor(threadBuild: (() => ProcedureThread) | undefined = undefined) { diff --git a/host/ide/src/trace/database/ProcedureWorker.ts b/host/ide/src/trace/database/ProcedureWorker.ts index 0adeae3..dbcb1e6 100644 --- a/host/ide/src/trace/database/ProcedureWorker.ts +++ b/host/ide/src/trace/database/ProcedureWorker.ts @@ -13,8 +13,8 @@ * limitations under the License. */ -import {cpu, CpuStruct, WakeupBean} from "./ProcedureWorkerCPU.js"; -import {drawFlagLine, drawLines, ns2s, ns2x, Rect} from "./ProcedureWorkerCommon.js"; +import {cpu, CpuStruct, rtCpu, WakeupBean} from "./ProcedureWorkerCPU.js"; +import {ColorUtils, drawFlagLine, drawLines, ns2s, ns2x, Rect} from "./ProcedureWorkerCommon.js"; import {CpuFreqStruct, freq} from "./ProcedureWorkerFreq.js"; import {proc, ProcessStruct} from "./ProcedureWorkerProcess.js"; import {mem, ProcessMemStruct} from "./ProcedureWorkerMem.js"; @@ -23,14 +23,23 @@ import {func, FuncStruct} from "./ProcedureWorkerFunc.js"; import {fps, FpsStruct} from "./ProcedureWorkerFPS.js"; import {heap, HeapStruct} from "./ProcedureWorkerHeap.js"; import {timeline} from "./ProcedureWorkerTimeline.js"; +import {cpuAbility, CpuAbilityMonitorStruct} from "./ProcedureWorkerCpuAbility.js"; +import {memoryAbility, MemoryAbilityMonitorStruct} from "./ProcedureWorkerMemoryAbility.js"; +import {DiskAbilityMonitorStruct, diskIoAbility} from "./ProcedureWorkerDiskIoAbility.js"; +import {networkAbility, NetworkAbilityMonitorStruct} from "./ProcedureWorkerNetworkAbility.js"; +import {hiPerfCpu, HiPerfCpuStruct} from "./ProcedureWorkerHiPerfCPU.js"; +import {hiPerfProcess, HiPerfProcessStruct} from "./ProcedureWorkerHiPerfProcess.js"; +import {hiPerfThread, HiPerfThreadStruct} from "./ProcedureWorkerHiPerfThread.js"; + let dataList: any = {} +let dataList2: any = {} let dataFilter: any = {} let canvasList: any = {} let contextList: any = {} function drawSelection(context: any, params: any) { - if (params.isRangeSelect) { + if (params.isRangeSelect && params.rangeSelectObject) { params.rangeSelectObject!.startX = Math.floor(ns2x(params.rangeSelectObject!.startNS!, params.startNS, params.endNS, params.totalNS, params.frame)); params.rangeSelectObject!.endX = Math.floor(ns2x(params.rangeSelectObject!.endNS!, params.startNS, params.endNS, params.totalNS, params.frame)); if (context) { @@ -101,6 +110,7 @@ function drawWakeUp(context: CanvasRenderingContext2D | any, wake: WakeupBean | self.onmessage = function (e: any) { if ((e.data.type as string).startsWith("clear")) { dataList = {}; + dataList2 = {}; dataFilter = {}; canvasList = {}; contextList = {}; @@ -122,13 +132,15 @@ self.onmessage = function (e: any) { contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr); } } - if(!dataFilter[e.data.type]){ + if (!dataFilter[e.data.type]) { dataFilter[e.data.type] = new Set(); } let canvas = canvasList[e.data.type]; let context = contextList[e.data.type]; let type = e.data.type as string; let params = e.data.params; + let online = e.data.params.online; + let buf = e.data.params.buf; let isRangeSelect = e.data.params.isRangeSelect; let isHover = e.data.params.isHover; let xs = e.data.params.xs; @@ -140,11 +152,14 @@ self.onmessage = function (e: any) { let startNS = e.data.params.startNS; let endNS = e.data.params.endNS; let totalNS = e.data.params.totalNS; + let slicesTime: { startTime: number | null, endTime: number | null, color: string | null } = e.data.params.slicesTime; + let scale = e.data.params.scale; let canvasWidth = e.data.params.canvasWidth; let canvasHeight = e.data.params.canvasHeight; let useCache = e.data.params.useCache; let lineColor = e.data.params.lineColor; let wakeupBean: WakeupBean | null = e.data.params.wakeupBean; + let intervalPerf: number = e.data.params.intervalPerf; if (canvas) { if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) { canvas.width = canvasWidth; @@ -175,7 +190,15 @@ self.onmessage = function (e: any) { }); } else if (type.startsWith("cpu")) { if (!useCache) { - cpu(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame); + if (online) { + rtCpu(buf, dataFilter[type], startNS, endNS, totalNS, frame); + } else { + cpu(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame); + } + }else{ + if (online) { + rtCpu(null, dataFilter[type], startNS, endNS, totalNS, frame); + } } if (canvas) { context.clearRect(0, 0, canvas.width, canvas.height); @@ -198,7 +221,7 @@ self.onmessage = function (e: any) { } drawSelection(context, params); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); let currentCpu = parseInt(type.replace("cpu", "")); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame, type == `cpu${CpuStruct.selectCpuStruct?.cpu || 0}` ? CpuStruct.selectCpuStruct : undefined, currentCpu); } @@ -232,7 +255,7 @@ self.onmessage = function (e: any) { context.textBaseline = "middle" context.fillText(maxFps, 4, 5 + 9); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({id: e.data.id, type: type, results: canvas ? undefined : dataFilter[type], hover: undefined}); @@ -273,7 +296,7 @@ self.onmessage = function (e: any) { context.textBaseline = "middle" context.fillText(s, 4, 5 + 9) drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({ @@ -291,13 +314,20 @@ self.onmessage = function (e: any) { context.beginPath(); CpuStruct.cpuCount = e.data.params.cpuCount; drawLines(context, xs, frame.height, lineColor) + let path = new Path2D(); + let miniHeight: number = 0; + miniHeight = Math.round(frame.height / CpuStruct.cpuCount) + if (dataFilter[type].size > 0) { + context.fillStyle = ColorUtils.colorForTid(dataFilter[type].values().next().value.pid || 0) + } for (let re of dataFilter[type]) { - ProcessStruct.draw(context, re) + ProcessStruct.draw(context, path, re, miniHeight); } + context.fill(path); drawSelection(context, params); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({id: e.data.id, type: type, results: canvas ? undefined : dataFilter[type], hover: undefined}); @@ -327,7 +357,7 @@ self.onmessage = function (e: any) { drawSelection(context, params); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({ @@ -350,7 +380,7 @@ self.onmessage = function (e: any) { drawSelection(context, params); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({id: e.data.id, type: type, results: canvas ? undefined : dataFilter[type], hover: undefined}); @@ -380,7 +410,7 @@ self.onmessage = function (e: any) { drawSelection(context, params); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({ @@ -422,7 +452,7 @@ self.onmessage = function (e: any) { drawSelection(context, params); drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({ @@ -438,7 +468,23 @@ self.onmessage = function (e: any) { drawLines(context, xs, frame.height, lineColor) drawSelection(context, params); context.closePath(); - drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: ThreadStruct.hoverThreadStruct + }); + } else if (type.startsWith("HiPerf-Group") || type.startsWith("monitorGroup")) { + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + drawLines(context, xs, frame.height, lineColor) + drawSelection(context, params); + context.closePath(); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); } // @ts-ignore self.postMessage({ @@ -447,6 +493,310 @@ self.onmessage = function (e: any) { results: canvas ? undefined : dataFilter[type], hover: ThreadStruct.hoverThreadStruct }); + } else if (type.startsWith("HiPerf-Cpu")) { + let groupBy10MS = scale > 100_000_000; + if (!useCache) { + hiPerfCpu(dataList[type],dataList2,type, dataFilter[type], startNS, endNS, totalNS, frame, groupBy10MS, e.data.params.maxCpu, intervalPerf); + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + drawLines(context, xs, frame.height, lineColor) + context.stroke(); + context.beginPath(); + HiPerfCpuStruct.hoverStruct = undefined; + if (isHover) { + let offset = groupBy10MS ? 0 : 3; + for (let re of dataFilter[e.data.type]) { + if (hoverX >= re.frame.x - offset && hoverX <= re.frame.x + re.frame.width + offset) {//&& hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height + HiPerfCpuStruct.hoverStruct = re; + break; + } + } + } else { + HiPerfCpuStruct.hoverStruct = e.data.params.hoverStruct; + } + HiPerfCpuStruct.selectStruct = e.data.params.selectStruct; + context.fillStyle = ColorUtils.FUNC_COLOR[0]; + context.strokeStyle = ColorUtils.FUNC_COLOR[0]; + let path = new Path2D(); + for (let re of dataFilter[type]) { + HiPerfCpuStruct.draw(context, path, re, groupBy10MS); + } + if (groupBy10MS) { + context.fill(path); + } else { + context.stroke(path); + } + drawSelection(context, params); + context.closePath(); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: HiPerfCpuStruct.hoverStruct + }); + } else if (type.startsWith("HiPerf-Process")) { + let groupBy10MS = scale > 100_000_000; + if (!useCache) { + hiPerfProcess(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame, groupBy10MS, intervalPerf); + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + drawLines(context, xs, frame.height, lineColor) + context.stroke(); + context.beginPath(); + HiPerfProcessStruct.hoverStruct = undefined; + context.fillStyle = ColorUtils.FUNC_COLOR[0]; + context.strokeStyle = ColorUtils.FUNC_COLOR[0]; + if (isHover) { + let offset = groupBy10MS ? 0 : 3; + for (let re of dataFilter[e.data.type]) { + if (hoverX >= re.frame.x - offset && hoverX <= re.frame.x + re.frame.width + offset) {//&& hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height + HiPerfProcessStruct.hoverStruct = re; + break; + } + } + } else { + HiPerfProcessStruct.hoverStruct = e.data.params.hoverStruct; + } + HiPerfProcessStruct.selectStruct = e.data.params.selectStruct; + let path = new Path2D(); + for (let re of dataFilter[type]) { + HiPerfProcessStruct.draw(context, path, re, groupBy10MS); + } + drawSelection(context, params); + groupBy10MS ? context.fill(path) : context.stroke(path); + context.closePath(); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: HiPerfProcessStruct.hoverStruct + }); + } else if (type.startsWith("HiPerf-Thread")) { + let groupBy10MS = scale > 100_000_000; + if (!useCache) { + hiPerfThread(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame, groupBy10MS,intervalPerf); + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + drawLines(context, xs, frame.height, lineColor) + context.stroke(); + context.beginPath(); + HiPerfThreadStruct.hoverStruct = undefined; + context.fillStyle = ColorUtils.FUNC_COLOR[0]; + context.strokeStyle = ColorUtils.FUNC_COLOR[0]; + if (isHover) { + let offset = groupBy10MS ? 0 : 3; + for (let re of dataFilter[e.data.type]) { + if (hoverX >= re.frame.x - offset && hoverX <= re.frame.x + re.frame.width + offset) {//&& hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height + HiPerfThreadStruct.hoverStruct = re; + break; + } + } + } else { + HiPerfThreadStruct.hoverStruct = e.data.params.hoverStruct; + } + HiPerfThreadStruct.selectStruct = e.data.params.selectStruct; + let path = new Path2D(); + for (let re of dataFilter[type]) { + HiPerfThreadStruct.draw(context, path, re, groupBy10MS); + } + groupBy10MS ? context.fill(path) : context.stroke(path); + drawSelection(context, params); + context.stroke(); + context.closePath(); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: HiPerfThreadStruct.hoverStruct + }); + } else if (type.startsWith("monitorCpu")) { + if (!useCache) { + cpuAbility(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame) + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + CpuAbilityMonitorStruct.maxCpuUtilization = e.data.params.maxCpuUtilization; + CpuAbilityMonitorStruct.maxCpuUtilizationName = e.data.params.maxCpuUtilizationName; + drawLines(context, xs, frame.height, lineColor) + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = undefined; + if (isHover) { + for (let re of dataFilter[type]) { + if (hoverX >= re.frame.x && hoverX <= re.frame.x + re.frame.width && hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height) { + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = re; + break; + } + } + } + CpuAbilityMonitorStruct.selectCpuAbilityStruct = e.data.params.selectCpuAbilityStruct; + for (let re of dataFilter[type]) { + CpuAbilityMonitorStruct.draw(context, re) + } + drawSelection(context, params); + context.closePath(); + let s = CpuAbilityMonitorStruct.maxCpuUtilizationName + let textMetrics = context.measureText(s); + context.globalAlpha = 0.8 + context.fillStyle = "#f0f0f0" + context.fillRect(0, 5, textMetrics.width + 8, 18) + context.globalAlpha = 1 + context.fillStyle = "#333" + context.textBaseline = "middle" + context.fillText(s, 4, 5 + 9) + drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: CpuAbilityMonitorStruct.hoverCpuAbilityStruct + }); + } else if (type.startsWith("monitorMemory")) { + if (!useCache) { + memoryAbility(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame) + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + MemoryAbilityMonitorStruct.maxMemoryByte = e.data.params.maxMemoryByte; + MemoryAbilityMonitorStruct.maxMemoryByteName = e.data.params.maxMemoryByteName; + drawLines(context, xs, frame.height, lineColor) + MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = undefined; + if (isHover) { + for (let re of dataFilter[type]) { + if (hoverX >= re.frame.x && hoverX <= re.frame.x + re.frame.width && hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height) { + MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = re; + break; + } + } + } + MemoryAbilityMonitorStruct.selectMemoryAbilityStruct = e.data.params.selectMemoryAbilityStruct; + for (let re of dataFilter[type]) { + MemoryAbilityMonitorStruct.draw(context, re) + } + drawSelection(context, params); + context.closePath(); + let s = MemoryAbilityMonitorStruct.maxMemoryByteName + let textMetrics = context.measureText(s); + context.globalAlpha = 0.8 + context.fillStyle = "#f0f0f0" + context.fillRect(0, 5, textMetrics.width + 8, 18) + context.globalAlpha = 1 + context.fillStyle = "#333" + context.textBaseline = "middle" + context.fillText(s, 4, 5 + 9) + drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct + }); + + } else if (type.startsWith("monitorDiskIo")) { + if (!useCache) { + diskIoAbility(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame) + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + let maxDiskRate = e.data.params.maxDiskRate; + let maxDiskRateName = e.data.params.maxDiskRateName; + drawLines(context, xs, frame.height, lineColor) + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = undefined; + if (isHover) { + for (let re of dataFilter[type]) { + if (hoverX >= re.frame.x && hoverX <= re.frame.x + re.frame.width && hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height) { + DiskAbilityMonitorStruct.hoverDiskAbilityStruct = re; + break; + } + } + } + DiskAbilityMonitorStruct.selectDiskAbilityStruct = e.data.params.selectDiskAbilityStruct; + for (let re of dataFilter[type]) { + DiskAbilityMonitorStruct.draw(context, re, maxDiskRate) + } + drawSelection(context, params); + context.closePath(); + let textMetrics = context.measureText(maxDiskRateName); + context.globalAlpha = 0.8 + context.fillStyle = "#f0f0f0" + context.fillRect(0, 5, textMetrics.width + 8, 18) + context.globalAlpha = 1 + context.fillStyle = "#333" + context.textBaseline = "middle" + context.fillText(maxDiskRateName, 4, 5 + 9) + drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: DiskAbilityMonitorStruct.hoverDiskAbilityStruct + }); + } else if (type.startsWith("monitorNetwork")) { + if (!useCache) { + networkAbility(dataList[type], dataFilter[type], startNS, endNS, totalNS, frame) + } + if (canvas) { + context.clearRect(0, 0, canvas.width, canvas.height); + context.beginPath(); + let maxNetworkRate = e.data.params.maxNetworkRate; + let maxNetworkRateName = e.data.params.maxNetworkRateName; + drawLines(context, xs, frame.height, lineColor) + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = undefined; + if (isHover) { + for (let re of dataFilter[type]) { + if (hoverX >= re.frame.x && hoverX <= re.frame.x + re.frame.width && hoverY >= re.frame.y && hoverY <= re.frame.y + re.frame.height) { + NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = re; + break; + } + } + } + NetworkAbilityMonitorStruct.selectNetworkAbilityStruct = e.data.params.selectNetworkAbilityStruct; + for (let re of dataFilter[type]) { + NetworkAbilityMonitorStruct.draw(context, re, maxNetworkRate) + } + drawSelection(context, params); + context.closePath(); + let textMetrics = context.measureText(maxNetworkRateName); + context.globalAlpha = 0.8 + context.fillStyle = "#f0f0f0" + context.fillRect(0, 5, textMetrics.width + 8, 18) + context.globalAlpha = 1 + context.fillStyle = "#333" + context.textBaseline = "middle" + context.fillText(maxNetworkRateName, 4, 5 + 9) + drawWakeUp(context, wakeupBean, startNS, endNS, totalNS, frame); + drawFlagLine(context, flagMoveInfo, flagSelectedInfo, startNS, endNS, totalNS, frame, slicesTime); + } + // @ts-ignore + self.postMessage({ + id: e.data.id, + type: type, + results: canvas ? undefined : dataFilter[type], + hover: NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct + }); + } }; self.onmessageerror = function (e: any) { diff --git a/host/ide/src/trace/database/ProcedureWorkerCPU.ts b/host/ide/src/trace/database/ProcedureWorkerCPU.ts index a0f22b2..8f616a5 100644 --- a/host/ide/src/trace/database/ProcedureWorkerCPU.ts +++ b/host/ide/src/trace/database/ProcedureWorkerCPU.ts @@ -15,6 +15,41 @@ import {BaseStruct, ColorUtils} from "./ProcedureWorkerCommon.js"; +let dec = new TextDecoder(); +export function rtCpu(buf: ArrayBuffer | null | undefined, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { + if (buf) { + res.clear(); + let pns = (endNS - startNS) / frame.width; + let y = frame.y + 5; + let height = frame.height - 10; + + let str = dec.decode(buf); + str = str.substring(str.indexOf("\n") + 1); + let parse = JSON.parse(str); + let columns = parse.columns; + let values = parse.values; + for (let i = 0; i < values.length; i++) { + let obj: any = {} + for (let j = 0; j < columns.length; j++) { + obj[columns[j]] = values[i][j] + } + obj.frame = { + // x: obj.x1, + y: frame.y + 5, + // width: obj.x2 - obj.x1 > 0 ? obj.x2 - obj.x1 : 1, + height: frame.height - 10, + } + CpuStruct.setCpuFrame(obj, pns, startNS, endNS, frame) + res.add(obj); + } + }else{ + let pns = (endNS - startNS) / frame.width; + res.forEach(it=>{ + CpuStruct.setCpuFrame(it, pns, startNS, endNS, frame) + }) + } +} + export function cpu(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { res.clear(); if (list) { @@ -59,25 +94,6 @@ export class CpuStruct extends BaseStruct { tid: number | undefined type: string | undefined - // static setFrame(node: CpuStruct, padding: number, startNS: number, endNS: number, totalNS: number, frame: Rect) { - // let x1: number; - // let x2: number; - // if ((node.startTime || 0) < startNS) { - // x1 = 0; - // } else { - // x1 = ns2x((node.startTime || 0), startNS, endNS, totalNS, frame); - // } - // if ((node.startTime || 0) + (node.dur || 0) > endNS) { - // x2 = frame.width; - // } else { - // x2 = ns2x((node.startTime || 0) + (node.dur || 0), startNS, endNS, totalNS, frame); - // } - // let getV: number = x2 - x1 <= 1 ? 1 : x2 - x1; - // let rectangle: Rect = new Rect(Math.floor(x1), frame.y + padding, Math.ceil(getV), frame.height - padding * 2); - // node.frame = rectangle; - // node.isHover = false; - // } - static draw(ctx: CanvasRenderingContext2D, data: CpuStruct) { if (data.frame) { let width = data.frame.width || 0; @@ -95,6 +111,7 @@ export class CpuStruct extends BaseStruct { let processCharWidth = Math.round(processMeasure.width / process.length) let threadCharWidth = Math.round(threadMeasure.width / thread.length) ctx.fillStyle = "#ffffff" + ctx.font = "11px sans-serif"; let y = data.frame.height / 2 + data.frame.y; if (processMeasure.width < width - textPadding * 2) { let x1 = Math.floor(width / 2 - processMeasure.width / 2 + data.frame.x + textPadding) @@ -106,6 +123,8 @@ export class CpuStruct extends BaseStruct { ctx.textBaseline = "bottom"; ctx.fillText(process.substring(0, chatNum - 4) + '...', x1, y, width - textPadding * 2) } + ctx.fillStyle = "#ffffff" + ctx.font = "9px sans-serif"; if (threadMeasure.width < width - textPadding * 2) { ctx.textBaseline = "top"; let x2 = Math.floor(width / 2 - threadMeasure.width / 2 + data.frame.x + textPadding) diff --git a/host/ide/src/trace/database/ProcedureWorkerCommon.ts b/host/ide/src/trace/database/ProcedureWorkerCommon.ts index 2672f45..afff676 100644 --- a/host/ide/src/trace/database/ProcedureWorkerCommon.ts +++ b/host/ide/src/trace/database/ProcedureWorkerCommon.ts @@ -13,6 +13,8 @@ * limitations under the License. */ +import {SpApplication} from "../SpApplication"; + export function ns2s(ns: number): string { let second1 = 1_000_000_000; // 1 second let millisecond1 = 1_000_000; // 1 millisecond @@ -176,7 +178,26 @@ export class ColorUtils { "#535da6", // indigo "#008078", // blue "#ff9201", - "#38428c"]; + "#38428c", + "#3391ff",// red + "#0076ff",// pink + "#66adff",// purple + "#2db3aa",// deep purple + "#008078",// indigo + "#73e6de",// blue + "#535da6",// light blue + "#38428c", // cyan + "#7a84cc",// teal + "#ff9201",// green + "#ff7500",// light green + "#ffab40",// lime + "#2db4e2",// amber 0xffc105 + "#0094c6", // orange + "#7cdeff",// deep orange + "#ffd44a", // brown + "#fbbf00",// blue gray + "#ffe593",// yellow 0xffec3d + ]; /** * Get the color value according to the length of the string @@ -220,10 +241,9 @@ export class ColorUtils { } } -export function drawLines(ctx: any, xs: Array, height: number, lineColor: string) { +export function drawLines(ctx: CanvasRenderingContext2D, xs: Array, height: number, lineColor: string) { if (ctx) { ctx.lineWidth = 1; - // ctx.strokeStyle = window.getComputedStyle(this.rootEL!, null).getPropertyValue("border-bottom-color");//"#dadada" "#474e59";// ctx.strokeStyle = lineColor || "#dadada"; xs?.forEach(it => { ctx.moveTo(Math.floor(it), 0) @@ -233,7 +253,7 @@ export function drawLines(ctx: any, xs: Array, height: number, lineColor: s } } -export function drawFlagLine(ctx: any, hoverFlag: any, selectFlag: any, startNS: number, endNS: number, totalNS: number, frame: any) { +export function drawFlagLine(ctx: any, hoverFlag: any, selectFlag: any, startNS: number, endNS: number, totalNS: number, frame: any, slicesTime: { startTime: number | null, endTime: number | null ,color:string|null}) { if (ctx) { if (hoverFlag) { ctx.beginPath(); @@ -254,6 +274,159 @@ export function drawFlagLine(ctx: any, hoverFlag: any, selectFlag: any, startNS: ctx.stroke(); ctx.closePath(); } + if (slicesTime && slicesTime.startTime && slicesTime.endTime) { + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = slicesTime.color||"#dadada"; + let x1 = ns2x(slicesTime.startTime, startNS, endNS, totalNS, frame); + let x2 = ns2x(slicesTime.endTime, startNS, endNS, totalNS, frame); + ctx.moveTo(Math.floor(x1), 0) + ctx.lineTo(Math.floor(x1), frame.height) + ctx.moveTo(Math.floor(x2), 0) + ctx.lineTo(Math.floor(x2), frame.height) + ctx.stroke(); + ctx.closePath(); + } } } +/** + * get framechart color by percent + * @param widthPercentage proportion of function + * @returns rbg + */ +export function getHeatColor(widthPercentage: number) { + return { + r: Math.floor(245 + 10 * (1 - widthPercentage)), + g: Math.floor(110 + 105 * (1 - widthPercentage)), + b: 100, + }; +} + +export enum ChartMode { + Call, + Byte, + Count, +} + +export class ChartStruct extends BaseStruct { + static hoverFuncStruct: ChartStruct | undefined; + static selectFuncStruct: ChartStruct | undefined; + static padding: number = 1; + depth: number = 0; + symbol: string = ''; + size: number = 0; + count: number = 0; + type: ChartMode = ChartMode.Call; + parent: ChartStruct | undefined; + children: Array = []; + + /** + * set function position + * @param node current function struct + * @param canvas_frame canvas + * @param total all rect size + */ + static setFuncFrame(node: ChartStruct, canvas_frame: Rect, total: number, mode: ChartMode) { + if (!node.frame) { + node.frame = new Rect(0, 0, 0, 0); + } + // filter depth is 0 + if (node.parent instanceof ChartStruct) { + let idx = node.parent.children.indexOf(node); + if (idx == 0) { + node.frame!.x = node.parent.frame!.x; + } else { + // set x by left frame. left frame is parent.children[idx - 1] + node.frame.x = node.parent.children[idx - 1].frame!.x + node.parent.children[idx - 1].frame!.width + } + let width = 0; + if (mode == ChartMode.Byte) { + width = node.size / total * canvas_frame.width; + } else { + width = node.count / total * canvas_frame.width; + } + // ensure every rect at least draw 1px + width = (width < 1) ? Math.ceil(width) : Math.floor(width); + node.frame!.width = width; + node.frame!.y = node.parent.frame!.y + 20; + node.frame!.height = 20; + } + } + + /** + * draw rect + * @param ctx CanvasRenderingContext2D + * @param data rect which is need draw + * @param percent function size or count / total size or count + */ + static draw(ctx: CanvasRenderingContext2D, data: ChartStruct, percent: number) { + let spApplication = document.getElementsByTagName("sp-application")[0] + if (data.frame) { + // draw rect + let color = getHeatColor(percent); + let miniHeight = 20; + ctx.fillStyle = `rgba(${color.r}, ${color.g}, ${color.b}, 0.9)`; + ctx.fillRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - ChartStruct.padding * 2); + + //draw border + if (ChartStruct.isHover(data)) { + if (spApplication.dark) { + ctx.strokeStyle = "#fff"; + } else { + ctx.strokeStyle = "#000"; + } + } else { + if (spApplication.dark) { + ctx.strokeStyle = "#000"; + } else { + ctx.strokeStyle = "#fff"; + } + } + ctx.lineWidth = 0.4; + ctx.strokeRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - ChartStruct.padding * 2); + + //draw symbol name + if (data.frame.width > 10) { + if (percent > 0.6) { + ctx.fillStyle = "#fff"; + } else { + ctx.fillStyle = "#000"; + } + ChartStruct.drawString(ctx, data.symbol || '', 5, data.frame); + } + + } + } + + /** + * draw function string in rect + * @param ctx CanvasRenderingContext2D + * @param str function Name + * @param textPadding textPadding + * @param frame canvas area + * @returns is draw + */ + static drawString(ctx: CanvasRenderingContext2D, str: string, textPadding: number, frame: Rect): boolean { + let textMetrics = ctx.measureText(str); + let charWidth = Math.round(textMetrics.width / str.length) + if (textMetrics.width < frame.width - textPadding * 2) { + let x2 = Math.floor(frame.width / 2 - textMetrics.width / 2 + frame.x + textPadding) + ctx.fillText(str, x2, Math.floor(frame.y + frame.height / 2 + 2), frame.width - textPadding * 2) + return true; + } + if (frame.width - textPadding * 2 > charWidth * 4) { + let chatNum = (frame.width - textPadding * 2) / charWidth; + let x1 = frame.x + textPadding + ctx.fillText(str.substring(0, chatNum - 4) + '...', x1, Math.floor(frame.y + frame.height / 2 + 2), frame.width - textPadding * 2) + return true; + } + return false; + } + + static isHover(data: ChartStruct): boolean { + return ChartStruct.hoverFuncStruct == data; + } + + +} diff --git a/host/ide/src/trace/database/ProcedureWorkerCpuAbility.ts b/host/ide/src/trace/database/ProcedureWorkerCpuAbility.ts new file mode 100644 index 0000000..dcf87ec --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerCpuAbility.ts @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct, ColorUtils, ns2x} from "./ProcedureWorkerCommon.js"; + +export function cpuAbility(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { + res.clear() + if (list) { + for (let index = 0; index < list.length; index++) { + let item = list[index]; + if (index === list.length - 1) { + item.dur = (endNS || 0) - (item.startNS || 0) + } else { + item.dur = (list[index + 1].startNS || 0) - (item.startNS || 0) + } + if ((item.startNS || 0) + (item.dur || 0) > (startNS || 0) && (item.startNS || 0) < (endNS || 0)) { + CpuAbilityMonitorStruct.setCpuAbilityFrame(list[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame) + if (index > 0 && ((list[index - 1].frame?.x || 0) == (list[index].frame?.x || 0) && (list[index - 1].frame?.width || 0) == (list[index].frame?.width || 0))) { + + } else { + res.add(item) + } + } + } + } +} + +export class CpuAbilityMonitorStruct extends BaseStruct { + static maxCpuUtilization: number = 0 + static maxCpuUtilizationName: string = "0 %" + static hoverCpuAbilityStruct: CpuAbilityMonitorStruct | undefined; + static selectCpuAbilityStruct: CpuAbilityMonitorStruct | undefined; + + type: number | undefined + value: number | undefined + startNS: number | undefined + dur: number | undefined //自补充,数据库没有返回 + + static draw(context2D: CanvasRenderingContext2D, data: CpuAbilityMonitorStruct) { + if (data.frame) { + let width = data.frame.width || 0; + let index = 2; + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / CpuAbilityMonitorStruct.maxCpuUtilization); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight + 4); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight + 4) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / CpuAbilityMonitorStruct.maxCpuUtilization); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } + + static setCpuAbilityFrame(node: any, padding: number, startNS: number, endNS: number, totalNS: number, frame: any) { + let startPointX: number, endPointX: number + + if ((node.startNS || 0) < startNS) { + startPointX = 0 + } else { + startPointX = ns2x((node.startNS || 0), startNS, endNS, totalNS, frame); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + endPointX = frame.width; + } else { + endPointX = ns2x((node.startNS || 0) + (node.dur || 0), startNS, endNS, totalNS, frame); + } + let frameWidth: number = endPointX - startPointX <= 1 ? 1 : endPointX - startPointX; + if (!node.frame) { + node.frame = {}; + } + node.frame.x = Math.floor(startPointX); + node.frame.y = frame.y + padding; + node.frame.width = Math.ceil(frameWidth); + node.frame.height = Math.floor(frame.height - padding * 2); + } +} + +export class CpuAbility { + context: any + params: any +} \ No newline at end of file diff --git a/host/ide/src/trace/database/ProcedureWorkerDiskIoAbility.ts b/host/ide/src/trace/database/ProcedureWorkerDiskIoAbility.ts new file mode 100644 index 0000000..c7305ff --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerDiskIoAbility.ts @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct, ColorUtils, ns2x} from "./ProcedureWorkerCommon.js"; + +export function diskIoAbility(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { + res.clear(); + if (list) { + for (let index = 0; index < list.length; index++) { + let item = list[index]; + if (index === list.length - 1) { + item.dur = (endNS || 0) - (item.startNS || 0) + } else { + item.dur = (list[index + 1].startNS || 0) - (item.startNS || 0) + } + if ((item.startNS || 0) + (item.dur || 0) > (startNS || 0) && (item.startNS || 0) < (endNS || 0)) { + DiskAbilityMonitorStruct.setDiskIOFrame(list[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame) + if (index > 0 && ((list[index - 1].frame?.x || 0) == (list[index].frame?.x || 0) && (list[index - 1].frame?.width || 0) == (list[index].frame?.width || 0))) { + + } else { + res.add(item) + } + } + } + } + +} + +export class DiskAbilityMonitorStruct extends BaseStruct { + static maxDiskRate: number = 0 + static maxDiskRateName: string = "0 KB/S" + static hoverDiskAbilityStruct: DiskAbilityMonitorStruct | undefined; + static selectDiskAbilityStruct: DiskAbilityMonitorStruct | undefined; + value: number | undefined + startNS: number | undefined + dur: number | undefined //自补充,数据库没有返回 + + static draw(context2D: CanvasRenderingContext2D, data: DiskAbilityMonitorStruct, maxDiskRate: number) { + if (data.frame) { + let width = data.frame.width || 0; + let index = 2; + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / maxDiskRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight + 4); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight + 4) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / maxDiskRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } + + static setDiskIOFrame(node: any, padding: number, startNS: number, endNS: number, totalNS: number, frame: any) { + let startPointX: number, endPointX: number + + if ((node.startNS || 0) < startNS) { + startPointX = 0 + } else { + startPointX = ns2x((node.startNS || 0), startNS, endNS, totalNS, frame); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + endPointX = frame.width; + } else { + endPointX = ns2x((node.startNS || 0) + (node.dur || 0), startNS, endNS, totalNS, frame); + } + let frameWidth: number = endPointX - startPointX <= 1 ? 1 : endPointX - startPointX; + if (!node.frame) { + node.frame = {}; + } + node.frame.x = Math.floor(startPointX); + node.frame.y = frame.y + padding; + node.frame.width = Math.ceil(frameWidth); + node.frame.height = Math.floor(frame.height - padding * 2); + } +} diff --git a/host/ide/src/trace/database/ProcedureWorkerFunc.ts b/host/ide/src/trace/database/ProcedureWorkerFunc.ts index 773ff7b..f08f27d 100644 --- a/host/ide/src/trace/database/ProcedureWorkerFunc.ts +++ b/host/ide/src/trace/database/ProcedureWorkerFunc.ts @@ -69,12 +69,20 @@ export class FuncStruct extends BaseStruct { node.frame.height = 20; } + static getInt(data:FuncStruct):number{ + let str = data.funName || ""; + let sum = 0; + for (let i = 0; i < str.length; i++) { + sum+=str.charCodeAt(i) + } + return (sum+(data?.depth||0)) % ColorUtils.FUNC_COLOR.length; + } static draw(ctx: CanvasRenderingContext2D, data: FuncStruct) { if (data.frame) { let isBinder = FuncStruct.isBinder(data); if (data.dur == undefined || data.dur == null || data.dur == 0) { } else { - ctx.fillStyle = ColorUtils.FUNC_COLOR[(data.funName?.length || 0) % ColorUtils.FUNC_COLOR.length] + ctx.fillStyle = ColorUtils.FUNC_COLOR[FuncStruct.getInt(data)]; let miniHeight = 20 ctx.fillRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - padding * 2) if (data.frame.width > 10) { diff --git a/host/ide/src/trace/database/ProcedureWorkerHeap.ts b/host/ide/src/trace/database/ProcedureWorkerHeap.ts index 9a11b40..dcb963c 100644 --- a/host/ide/src/trace/database/ProcedureWorkerHeap.ts +++ b/host/ide/src/trace/database/ProcedureWorkerHeap.ts @@ -23,7 +23,7 @@ export function heap(list: Array, res: Set, startNS: number, endNS: nu if ((it.startTime || 0) + (it.dur || 0) > (startNS || 0) && (it.startTime || 0) < (endNS || 0)) { HeapStruct.setFrame(list[i], 5, startNS || 0, endNS || 0, totalNS || 0, frame) if (i > 0 && ((list[i - 1].frame?.x || 0) == (list[i].frame?.x || 0) && (list[i - 1].frame?.width || 0) == (list[i].frame?.width || 0))) { - continue; + } else { res.add(list[i]) } @@ -67,10 +67,10 @@ export class HeapStruct extends BaseStruct { if (data.startTime === HeapStruct.hoverHeapStruct?.startTime) { ctx.lineWidth = 1; ctx.globalAlpha = 0.6; - let drawHeight:number = 0; - if(data.minHeapSize < 0 ){ + let drawHeight: number = 0; + if (data.minHeapSize < 0) { drawHeight = Math.ceil((((data.heapsize || 0) - data.minHeapSize) * (data.frame.height || 0)) / (data.maxHeapSize - data.minHeapSize)); - }else{ + } else { drawHeight = Math.ceil(((data.heapsize || 0) * (data.frame.height || 0)) / data.maxHeapSize); } ctx.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) diff --git a/host/ide/src/trace/database/ProcedureWorkerHiPerfCPU.ts b/host/ide/src/trace/database/ProcedureWorkerHiPerfCPU.ts new file mode 100644 index 0000000..030f6e9 --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerHiPerfCPU.ts @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./ProcedureWorkerCommon.js"; + +export function hiPerfCpu(arr: Array, arr2: any ,type: string, res: Set, startNS: number, endNS: number, totalNS: number, frame: any, groupBy10MS: boolean, maxCpu: number | undefined, intervalPerf: number) { + res.clear(); + if (arr) { + let list: Array; + if (groupBy10MS) { + if (arr2[type] && arr2[type].length > 0) { + list = arr2[type]; + } else { + list = HiPerfCpuStruct.groupBy10MS(arr, maxCpu, intervalPerf); + arr2[type] = list; + } + } else { + list = arr; + } + let pns = (endNS - startNS) / frame.width; + let y = frame.y; + + let groups = list.filter(it => (it.startNS || 0) + (it.dur || 0) > startNS && (it.startNS || 0) < endNS).map(it => { + if (!it.frame) { + it.frame = {}; + it.frame.y = y; + } + it.frame.height = it.height; + HiPerfCpuStruct.setFrame(it, pns, startNS, endNS, frame); + return it; + }).reduce((pre, current, index, arr) => { + if(!pre[`${current.frame.x}`]){ + pre[`${current.frame.x}`]=[]; + pre[`${current.frame.x}`].push(current); + res.add(current); + } + return pre; + }, {}); + } +} + +export class HiPerfCpuStruct extends BaseStruct { + static hoverStruct: HiPerfCpuStruct | undefined; + static selectStruct: HiPerfCpuStruct | undefined; + static path = new Path2D('M 100,100 h 50 v 50 h 50'); + id: number | undefined; + sample_id: number | undefined; + timestamp: number | undefined; + thread_id: number | undefined; + event_count: number | undefined; + event_type_id: number | undefined; + cpu_id: number | undefined; + thread_state: string | undefined; + //------------------------------------------------------ + startNS: number | undefined; + endNS: number | undefined; + dur: number | undefined; + height: number | undefined; + cpu: number | undefined; + + static draw(ctx: CanvasRenderingContext2D,path:Path2D, data: HiPerfCpuStruct, groupBy10MS: boolean) { + if (data.frame) { + if (groupBy10MS) { + let width = data.frame.width; + path.rect(data.frame.x, 40 - (data.height || 0), width, data.height || 0) + } else { + path.moveTo(data.frame.x + 7, 20); + HiPerfCpuStruct.drawRoundRectPath(path,data.frame.x-7,20-7,14,14,3) + path.moveTo(data.frame.x, 27); + path.lineTo(data.frame.x, 33); + } + } + } + + static drawRoundRectPath(cxt: Path2D,x:number,y:number, width:number, height:number, radius:number) { + cxt.arc(x+width - radius, y+height - radius, radius, 0, Math.PI / 2); + cxt.lineTo(x+radius, y+height); + cxt.arc(x+radius, y+height - radius, radius, Math.PI / 2, Math.PI); + cxt.lineTo(x+0, y+radius); + cxt.arc(x+radius, y+radius, radius, Math.PI, Math.PI * 3 / 2); + cxt.lineTo(x+width - radius, y+0); + cxt.arc(x+width - radius, y+radius, radius, Math.PI * 3 / 2, Math.PI * 2); + cxt.lineTo(x+width, y+height - radius); + cxt.moveTo(x+width/3,y+height/5); + cxt.lineTo(x+width/3,y+height/5*4); + cxt.moveTo(x+width/3,y+height/5); + cxt.bezierCurveTo(x+width/3+7,y+height/5-2,x+width/3+7,y+height/5+6,x+width/3,y+height/5+4); + } + + static setFrame(node: any, pns: number, startNS: number, endNS: number, frame: any) { + if ((node.startNS || 0) < startNS) { + node.frame.x = 0; + } else { + node.frame.x = Math.floor(((node.startNS || 0) - startNS) / pns); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + node.frame.width = frame.width - node.frame.x; + } else { + node.frame.width = Math.ceil(((node.startNS || 0) + (node.dur || 0) - startNS) / pns - node.frame.x); + } + if (node.frame.width < 1) { + node.frame.width = 1; + } + } + + static groupBy10MS(array: Array, maxCpu: number | undefined, intervalPerf: number): Array { + let obj = array.map(it => { + it.timestamp_group = Math.trunc(it.startNS / 1_000_000_0) * 1_000_000_0; + return it; + }).reduce((pre, current) => { + (pre[current["timestamp_group"]] = pre[current["timestamp_group"]] || []).push(current); + return pre; + }, {}); + let arr: any[] = []; + for (let aKey in obj) { + let ns = parseInt(aKey); + let height: number = 0; + if(maxCpu!=undefined){ + height = Math.floor(obj[aKey].length / (10 / intervalPerf) / maxCpu * 40); + }else{ + height = Math.floor(obj[aKey].length / (10 / intervalPerf) * 40); + } + arr.push({ + startNS: ns, + dur: 1_000_000_0, + height: height, + }) + } + return arr; + } +} \ No newline at end of file diff --git a/host/ide/src/trace/database/ProcedureWorkerHiPerfProcess.ts b/host/ide/src/trace/database/ProcedureWorkerHiPerfProcess.ts new file mode 100644 index 0000000..4c37adc --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerHiPerfProcess.ts @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./ProcedureWorkerCommon.js"; +import {HiPerfCpuStruct} from "./ProcedureWorkerHiPerfCPU.js"; + +export function hiPerfProcess(arr: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any, groupBy10MS: boolean,intervalPerf:number) { + res.clear(); + if (arr) { + let list = groupBy10MS ? HiPerfProcessStruct.groupBy10MS(arr,intervalPerf) : arr; + let pns = (endNS - startNS) / frame.width; + let y = frame.y; + for (let i = 0, len = list.length; i < len; i++) { + let it = list[i]; + if ((it.startNS || 0) + (it.dur || 0) > startNS && (it.startNS || 0) < endNS) { + if (!list[i].frame) { + list[i].frame = {}; + list[i].frame.y = y; + } + list[i].frame.height = it.height; + HiPerfProcessStruct.setFrame(list[i], pns, startNS, endNS, frame) + if (groupBy10MS) { + if (i > 0 && ((list[i - 1].frame?.x || 0) == (list[i].frame?.x || 0) + && ((list[i - 1].frame?.width || 0) == (list[i].frame?.width || 0)) + && ((list[i - 1].frame?.height || 0) == (list[i].frame?.height || 0)) + )) { + } else { + res.add(list[i]) + } + } else { + if (i > 0 && (Math.abs((list[i - 1].frame?.x || 0) - (list[i].frame?.x || 0)) < 3)) { + } else { + res.add(list[i]) + } + } + + } + } + } +} + +export class HiPerfProcessStruct extends BaseStruct { + static hoverStruct: HiPerfProcessStruct | undefined; + static selectStruct: HiPerfProcessStruct | undefined; + id: number | undefined; + sample_id: number | undefined; + timestamp: number | undefined; + thread_id: number | undefined; + event_count: number | undefined; + event_type_id: number | undefined; + cpu_id: number | undefined; + thread_state: string | undefined; + //------------------------------------------------------ + startNS: number | undefined; + endNS: number | undefined; + dur: number | undefined; + height: number | undefined; + cpu: number | undefined; + group: number | undefined; + + static draw(ctx: CanvasRenderingContext2D,path:Path2D, data: HiPerfProcessStruct, groupBy10MS: boolean) { + if (data.frame) { + if (groupBy10MS) { + let width = data.frame.width; + path.rect(data.frame.x, 40 - (data.height || 0), width, data.height || 0) + } else { + path.moveTo(data.frame.x + 7, 20); + HiPerfCpuStruct.drawRoundRectPath(path,data.frame.x-7,20-7,14,14,3) + path.moveTo(data.frame.x, 27); + path.lineTo(data.frame.x, 33); + } + } + } + + static setFrame(node: any, pns: number, startNS: number, endNS: number, frame: any) { + if ((node.startNS || 0) < startNS) { + node.frame.x = 0; + } else { + node.frame.x = Math.floor(((node.startNS || 0) - startNS) / pns); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + node.frame.width = frame.width - node.frame.x; + } else { + node.frame.width = Math.ceil(((node.startNS || 0) + (node.dur || 0) - startNS) / pns - node.frame.x); + } + if (node.frame.width < 1) { + node.frame.width = 1; + } + } + + static groupBy10MS(array: Array,intervalPerf:number): Array { + let obj = array.map(it => { + it.timestamp_group = Math.trunc(it.startNS / 1_000_000_0) * 1_000_000_0; + return it; + }).reduce((pre, current) => { + (pre[current["timestamp_group"]] = pre[current["timestamp_group"]] || []).push(current); + return pre; + }, {}); + let arr: any[] = []; + for (let aKey in obj) { + let ns = parseInt(aKey); + let height: number = 0; + height = Math.floor(obj[aKey].length / (10/intervalPerf) * 40); + arr.push({ + startNS: ns, + height: height, + dur: 1_000_000_0, + }) + } + return arr; + } +} diff --git a/host/ide/src/trace/database/ProcedureWorkerHiPerfThread.ts b/host/ide/src/trace/database/ProcedureWorkerHiPerfThread.ts new file mode 100644 index 0000000..547d987 --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerHiPerfThread.ts @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct} from "./ProcedureWorkerCommon.js"; +import {HiPerfCpuStruct} from "./ProcedureWorkerHiPerfCPU.js"; + +export function hiPerfThread(arr: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any, groupBy10MS: boolean, intervalPerf: number) { + res.clear(); + if (arr) { + let list = groupBy10MS ? HiPerfThreadStruct.groupBy10MS(arr, intervalPerf) : arr; + let pns = (endNS - startNS) / frame.width; + let y = frame.y; + for (let i = 0, len = list.length; i < len; i++) { + let it = list[i]; + if ((it.startNS || 0) + (it.dur || 0) > startNS && (it.startNS || 0) < endNS) { + if (!list[i].frame) { + list[i].frame = {}; + list[i].frame.y = y; + } + list[i].frame.height = it.height; + HiPerfThreadStruct.setFrame(list[i], pns, startNS, endNS, frame) + if (groupBy10MS) { + if (i > 0 && ((list[i - 1].frame?.x || 0) == (list[i].frame?.x || 0) + && ((list[i - 1].frame?.width || 0) == (list[i].frame?.width || 0)) + && ((list[i - 1].frame?.height || 0) == (list[i].frame?.height || 0)) + )) { + + } else { + res.add(list[i]) + } + } else { + if (i > 0 && (Math.abs((list[i - 1].frame?.x || 0) - (list[i].frame?.x || 0)) < 3)) { + } else { + res.add(list[i]) + } + } + } + } + } +} + +export class HiPerfThreadStruct extends BaseStruct { + static hoverStruct: HiPerfThreadStruct | undefined; + static selectStruct: HiPerfThreadStruct | undefined; + id: number | undefined; + sample_id: number | undefined; + timestamp: number | undefined; + thread_id: number | undefined; + event_count: number | undefined; + event_type_id: number | undefined; + cpu_id: number | undefined; + thread_state: string | undefined; + //------------------------------------------------------ + startNS: number | undefined; + endNS: number | undefined; + dur: number | undefined; + height: number | undefined; + cpu: number | undefined; + + static draw(ctx: CanvasRenderingContext2D, path: Path2D, data: HiPerfThreadStruct, groupBy10MS: boolean) { + if (data.frame) { + if (groupBy10MS) { + let width = data.frame.width; + path.rect(data.frame.x, 40 - (data.height || 0), width, data.height || 0) + } else { + path.moveTo(data.frame.x + 7, 20); + HiPerfCpuStruct.drawRoundRectPath(path,data.frame.x-7,20-7,14,14,3) + path.moveTo(data.frame.x, 27); + path.lineTo(data.frame.x, 33); + } + } + } + + static setFrame(node: any, pns: number, startNS: number, endNS: number, frame: any) { + if ((node.startNS || 0) < startNS) { + node.frame.x = 0; + } else { + node.frame.x = Math.floor(((node.startNS || 0) - startNS) / pns); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + node.frame.width = frame.width - node.frame.x; + } else { + node.frame.width = Math.ceil(((node.startNS || 0) + (node.dur || 0) - startNS) / pns - node.frame.x); + } + if (node.frame.width < 1) { + node.frame.width = 1; + } + } + + static groupBy10MS(array: Array, intervalPerf: number): Array { + let obj = array.map(it => { + it.timestamp_group = Math.trunc(it.startNS / 1_000_000_0) * 1_000_000_0; + return it; + }).reduce((pre, current) => { + (pre[current["timestamp_group"]] = pre[current["timestamp_group"]] || []).push(current); + return pre; + }, {}); + let arr: any[] = []; + for (let aKey in obj) { + let ns = parseInt(aKey); + let height: number = 0; + height = Math.floor(obj[aKey].length / (10 / intervalPerf) * 40); + arr.push({ + startNS: ns, + height: height, + dur: 1_000_000_0, + }) + } + return arr; + } +} diff --git a/host/ide/src/trace/database/ProcedureWorkerMemoryAbility.ts b/host/ide/src/trace/database/ProcedureWorkerMemoryAbility.ts new file mode 100644 index 0000000..8c5857d --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerMemoryAbility.ts @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct, ColorUtils, ns2x} from "./ProcedureWorkerCommon.js"; + +export function memoryAbility(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { + res.clear(); + if (list) { + for (let index = 0; index < list.length; index++) { + let item = list[index]; + if (index === list.length - 1) { + item.dur = (endNS || 0) - (item.startNS || 0) + } else { + item.dur = (list[index + 1].startNS || 0) - (item.startNS || 0) + } + if ((item.startNS || 0) + (item.dur || 0) > (startNS || 0) && (item.startNS || 0) < (endNS || 0)) { + MemoryAbilityMonitorStruct.setMemoryFrame(list[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame) + if (index > 0 && ((list[index - 1].frame?.x || 0) == (list[index].frame?.x || 0) && (list[index - 1].frame?.width || 0) == (list[index].frame?.width || 0))) { + + } else { + res.add(item) + } + } + } + } +} + +export class MemoryAbilityMonitorStruct extends BaseStruct { + static maxMemoryByte: number = 0 + static maxMemoryByteName: string = "0 MB" + static hoverMemoryAbilityStruct: MemoryAbilityMonitorStruct | undefined; + static selectMemoryAbilityStruct: MemoryAbilityMonitorStruct | undefined; + cpu: number | undefined + value: number | undefined + startNS: number | undefined + dur: number | undefined + + static draw(context2D: CanvasRenderingContext2D, data: MemoryAbilityMonitorStruct) { + if (data.frame) { + let width = data.frame.width || 0; + let index = 2; + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / MemoryAbilityMonitorStruct.maxMemoryByte); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight + 4); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight + 4) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / MemoryAbilityMonitorStruct.maxMemoryByte); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } + + static setMemoryFrame(node: any, padding: number, startNS: number, endNS: number, totalNS: number, frame: any) { + let startPointX: number, endPointX: number + + if ((node.startNS || 0) < startNS) { + startPointX = 0 + } else { + startPointX = ns2x((node.startNS || 0), startNS, endNS, totalNS, frame); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + endPointX = frame.width; + } else { + endPointX = ns2x((node.startNS || 0) + (node.dur || 0), startNS, endNS, totalNS, frame); + } + let frameWidth: number = endPointX - startPointX <= 1 ? 1 : endPointX - startPointX; + if (!node.frame) { + node.frame = {}; + } + node.frame.x = Math.floor(startPointX); + node.frame.y = frame.y + padding; + node.frame.width = Math.ceil(frameWidth); + node.frame.height = Math.floor(frame.height - padding * 2); + } +} + +const textPadding = 2; diff --git a/host/ide/src/trace/database/ProcedureWorkerNetworkAbility.ts b/host/ide/src/trace/database/ProcedureWorkerNetworkAbility.ts new file mode 100644 index 0000000..5a5e322 --- /dev/null +++ b/host/ide/src/trace/database/ProcedureWorkerNetworkAbility.ts @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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 {BaseStruct, ColorUtils, ns2x} from "./ProcedureWorkerCommon.js"; + +export function networkAbility(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { + res.clear(); + if (list) { + for (let index = 0; index < list.length; index++) { + let item = list[index]; + if (index === list.length - 1) { + item.dur = (endNS || 0) - (item.startNS || 0) + } else { + item.dur = (list[index + 1].startNS || 0) - (item.startNS || 0) + } + if ((item.startNS || 0) + (item.dur || 0) > (startNS || 0) && (item.startNS || 0) < (endNS || 0)) { + NetworkAbilityMonitorStruct.setNetworkFrame(list[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame) + if (index > 0 && ((list[index - 1].frame?.x || 0) == (list[index].frame?.x || 0) && (list[index - 1].frame?.width || 0) == (list[index].frame?.width || 0))) { + + } else { + res.add(item) + } + } + } + } +} + +export class NetworkAbilityMonitorStruct extends BaseStruct { + static maxNetworkRate: number = 0 + static maxNetworkRateName: string = "0 KB/S" + static hoverNetworkAbilityStruct: NetworkAbilityMonitorStruct | undefined; + static selectNetworkAbilityStruct: NetworkAbilityMonitorStruct | undefined; + value: number | undefined + startNS: number | undefined + + static draw(context2D: CanvasRenderingContext2D, data: NetworkAbilityMonitorStruct, maxNetworkRate: number) { + if (data.frame) { + let width = data.frame.width || 0; + let index = 2; + context2D.fillStyle = ColorUtils.colorForTid(index) + context2D.strokeStyle = ColorUtils.colorForTid(index) + if (data.startNS === NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.startNS) { + context2D.lineWidth = 1; + context2D.globalAlpha = 0.6; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0) * 1.0) / maxNetworkRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + context2D.beginPath() + context2D.arc(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, 3, 0, 2 * Math.PI, true) + context2D.fill() + context2D.globalAlpha = 1.0; + context2D.stroke(); + context2D.beginPath() + context2D.moveTo(data.frame.x + 3, data.frame.y + data.frame.height - drawHeight + 4); + context2D.lineWidth = 3; + context2D.lineTo(data.frame.x + width, data.frame.y + data.frame.height - drawHeight + 4) + context2D.stroke(); + } else { + context2D.globalAlpha = 0.6; + context2D.lineWidth = 1; + let drawHeight: number = Math.floor(((data.value || 0) * (data.frame.height || 0)) / maxNetworkRate); + context2D.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight + 4, width, drawHeight) + } + } + context2D.globalAlpha = 1.0; + context2D.lineWidth = 1; + } + + static setNetworkFrame(node: any, padding: number, startNS: number, endNS: number, totalNS: number, frame: any) { + let startPointX: number, endPointX: number + + if ((node.startNS || 0) < startNS) { + startPointX = 0 + } else { + startPointX = ns2x((node.startNS || 0), startNS, endNS, totalNS, frame); + } + if ((node.startNS || 0) + (node.dur || 0) > endNS) { + endPointX = frame.width; + } else { + endPointX = ns2x((node.startNS || 0) + (node.dur || 0), startNS, endNS, totalNS, frame); + } + let frameWidth: number = endPointX - startPointX <= 1 ? 1 : endPointX - startPointX; + if (!node.frame) { + node.frame = {}; + } + node.frame.x = Math.floor(startPointX); + node.frame.y = frame.y + padding; + node.frame.width = Math.ceil(frameWidth); + node.frame.height = Math.floor(frame.height - padding * 2); + } +} diff --git a/host/ide/src/trace/database/ProcedureWorkerProcess.ts b/host/ide/src/trace/database/ProcedureWorkerProcess.ts index 01669ed..f314edf 100644 --- a/host/ide/src/trace/database/ProcedureWorkerProcess.ts +++ b/host/ide/src/trace/database/ProcedureWorkerProcess.ts @@ -49,12 +49,9 @@ export class ProcessStruct extends BaseStruct { type: string | undefined utid: number | undefined - static draw(ctx: CanvasRenderingContext2D, data: ProcessStruct) { + static draw(ctx: CanvasRenderingContext2D,path:Path2D, data: ProcessStruct,miniHeight:number) { if (data.frame) { - let width = data.frame.width || 0; - ctx.fillStyle = ColorUtils.colorForTid(data.pid || 0) - let miniHeight = Math.round(data.frame.height / CpuStruct.cpuCount) - ctx.fillRect(data.frame.x, data.frame.y + (data.cpu || 0) * miniHeight + padding, data.frame.width, miniHeight - padding * 2) + path.rect(data.frame.x, data.frame.y + (data.cpu || 0) * miniHeight + padding, data.frame.width, miniHeight - padding * 2) } } diff --git a/host/ide/src/trace/database/ProcedureWorkerThread.ts b/host/ide/src/trace/database/ProcedureWorkerThread.ts index a285e79..9b7b1d2 100644 --- a/host/ide/src/trace/database/ProcedureWorkerThread.ts +++ b/host/ide/src/trace/database/ProcedureWorkerThread.ts @@ -18,17 +18,26 @@ import {BaseStruct, ns2x, Rect} from "./ProcedureWorkerCommon.js"; export function thread(list: Array, res: Set, startNS: number, endNS: number, totalNS: number, frame: any) { res.clear(); if (list) { - for (let i = 0, len = list.length; i < len; i++) { - let it = list[i]; - if ((it.startTime || 0) + (it.dur || 0) > startNS && (it.startTime || 0) < endNS) { - ThreadStruct.setThreadFrame(list[i], 5, startNS, endNS, totalNS, frame) - if (i > 0 && ((list[i - 1].frame?.x || 0) == (list[i].frame?.x || 0) && (list[i - 1].frame?.width || 0) == (list[i].frame?.width || 0))) { - + let groups = list.filter(it => (it.startTime || 0) + (it.dur || 0) > startNS && (it.startTime || 0) < endNS).map(it => { + ThreadStruct.setThreadFrame(it, 5, startNS, endNS, totalNS, frame) + return it; + }).reduce((pre, current, index, arr) => { + (pre[`${current.frame.x}`] = pre[`${current.frame.x}`] || []).push(current); + return pre; + }, {}); + Reflect.ownKeys(groups).map((kv => { + let arr = (groups[kv].sort((a: any, b: any) => b.frame.width - a.frame.width)); + if (arr.length > 1) { + let idx = arr.findIndex((it: any) => it.state != "S") + if (idx != -1) { + res.add(arr[idx]); } else { - res.add(list[i]) + res.add(arr[0]); } + } else { + res.add(arr[0]); } - } + })); } } @@ -125,7 +134,7 @@ export class ThreadStruct extends BaseStruct { ctx.fillRect(data.frame.x, data.frame.y + padding, data.frame.width, data.frame.height - padding * 2) ctx.fillStyle = "#fff"; data.frame.width > 4 && ThreadStruct.drawString(ctx, ThreadStruct.getEndState(data.state || ''), 2, data.frame); - } else if("T" == data.state || "t" == data.state) { + } else if ("T" == data.state || "t" == data.state) { ctx.fillStyle = ThreadStruct.traceColor; ctx.fillRect(data.frame.x, data.frame.y + padding, data.frame.width, data.frame.height - padding * 2) ctx.fillStyle = "#fff"; diff --git a/host/ide/src/trace/database/SqlLite.ts b/host/ide/src/trace/database/SqlLite.ts index 3e49266..2f722cc 100644 --- a/host/ide/src/trace/database/SqlLite.ts +++ b/host/ide/src/trace/database/SqlLite.ts @@ -25,16 +25,31 @@ import {WakeupBean} from "../bean/WakeupBean.js"; import {BinderArgBean} from "../bean/BinderArgBean.js"; import {FpsStruct} from "../bean/FpsStruct.js"; import {HeapBean} from "../bean/HeapBean.js"; -import {SPT, SPTChild, StateProcessThread} from "../bean/StateProcessThread.js"; +import {SPT, SPTChild, SptSlice, StateProcessThread, ThreadProcess, ThreadState} from "../bean/StateProcessThread.js"; import {CpuUsage, Freq} from "../bean/CpuUsage.js"; import {HeapStruct} from "../bean/HeapStruct.js"; import {HeapTreeDataBean} from "../bean/HeapTreeDataBean.js"; import { - NativeEventHeap, NativeHookMalloc, + NativeEventHeap, + NativeHookMalloc, NativeHookProcess, NativeHookSampleQueryInfo, NativeHookStatistics } from "../bean/NativeHook.js"; +import { + LiveProcess, + ProcessHistory, + SystemCpuSummary, + SystemDiskIOSummary, + SystemNetworkSummary +} from "../bean/AbilityMonitor.js"; +import {NetworkAbilityMonitorStruct} from "../bean/NetworkAbilityMonitorStruct.js"; +import {DiskAbilityMonitorStruct} from "../bean/DiskAbilityMonitorStruct.js"; +import {MemoryAbilityMonitorStruct} from "../bean/MemoryAbilityMonitorStruct.js"; +import {CpuAbilityMonitorStruct} from "../bean/CpuAbilityMonitorStruct.js"; +import {PerfCallChain, PerfCmdLine, PerfFile, PerfSample, PerfThread} from "../bean/PerfProfile.js"; +import {SearchFuncBean} from "../bean/SearchFuncBean.js"; +import {info} from "../../log/Log.js"; class DbThread extends Worker { busy: boolean = false; @@ -45,20 +60,22 @@ class DbThread extends Worker { uuid(): string { // @ts-ignore - return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11) + .replace(/[018]/g, (c: any) => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); } - queryFunc(name: string, sql: string, args: any, handler: Function) { + queryFunc(name: string, sql: string, args: any, handler: Function, action: string | null) { this.busy = true; let id = this.uuid(); this.taskMap[id] = handler - this.postMessage({ + let msg = { id: id, name: name, - action: "exec", + action: action || "exec", sql: sql, params: args, - }) + } + this.postMessage(msg); } dbOpen = async (): Promise<{ status: boolean, msg: string }> => { @@ -186,497 +203,1094 @@ export class DbPool { this.works.length = 0; } - submit(name: string, sql: string, args: any, handler: Function) { + submit(name: string, sql: string, args: any, handler: Function, action: string | null) { let noBusyThreads = this.works.filter(it => !it.busy); let thread: DbThread if (noBusyThreads.length > 0) { //取第一个空闲的线程进行任务 thread = noBusyThreads[0]; - thread.queryFunc(name, sql, args, handler) + thread.queryFunc(name, sql, args, handler, action) } else { // 随机插入一个线程中 thread = this.works[Math.floor(Math.random() * this.works.length)] - thread.queryFunc(name, sql, args, handler) + thread.queryFunc(name, sql, args, handler, action) } } } export const threadPool = new DbPool() -function query(name: string, sql: string, args: any = null): Promise> { +export function query(name: string, sql: string, args: any = null, action: string | null = null): Promise> { + let a = new Date().getTime(); return new Promise>((resolve, reject) => { threadPool.submit(name, sql, args, (res: any) => { + info("查询耗时", name, new Date().getTime() - a) resolve(res) - }) + }, action); }) } export const querySql = (sql: string): Promise> => query("queryProcess", sql) -/*-------------------------------------------------------------------------------------*/ + export const queryProcess = (): Promise> => - query("queryProcess", `SELECT pid,processName FROM temp_query_process`) -/*-------------------------------------------------------------------------------------*/ + query("queryProcess", ` + SELECT + pid, processName + FROM + temp_query_process`) + export const queryTotalTime = (): Promise> => - query("queryTotalTime", `select end_ts-start_ts as total from trace_section;`) -/*-------------------------------------------------------------------------------------*/ + query("queryTotalTime", ` + select + end_ts-start_ts as total + from + trace_section;`) + export const queryCpu = async (): Promise> => - query("queryCpu", `select cpu from cpu_measure_filter where name='cpu_idle' order by cpu;`) -/*-------------------------------------------------------------------------------------*/ + query("queryCpu", ` + select + cpu + from + cpu_measure_filter + where + name='cpu_idle' + order by cpu;`) + export const getAsyncEvents = (): Promise> => - query("getAsyncEvents", `select *,p.pid as pid,c.ts - t.start_ts as "startTime" from callstack c,trace_section t -left join process p on c.callid = p.id where cookie is not null;`) + query("getAsyncEvents", ` + select + *, + p.pid as pid, + c.ts - t.start_ts as "startTime" + from + callstack c,trace_section t + left join + process p + on + c.callid = p.id + where + cookie is not null;`) export const getCpuUtilizationRate = (startNS: number, endNS: number): Promise> => - query("getCpuUtilizationRate", `select * from temp_get_cpu_rate;`, {}) -/*-------------------------------------------------------------------------------------*/ + query("getCpuUtilizationRate", ` + select + * + from + temp_get_cpu_rate;`, {}) + export const getFps = () => - query("getFps", `select distinct(ts-tb.start_ts) as startNS,fps -from hidump c ,trace_section tb -where startNS >= 0 -order by startNS;`, {}) + query("getFps", ` + select + distinct(ts-tb.start_ts) as startNS, fps + from + hidump c ,trace_section tb + where + startNS >= 0 + order by + startNS;`, {}) -/*-------------------------------------------------------------------------------------*/ export const getFunDataByTid = (tid: number): Promise> => - query("getFunDataByTid", `select * from temp_query_thread_function where tid = $tid`, {$tid: tid}) -/*-------------------------------------------------------------------------------------*/ + query("getFunDataByTid", ` + select + * + from + temp_query_thread_function + where + tid = $tid`, {$tid: tid}) + + +export const getThreadStateDataCount = (): Promise> => + query("getThreadStateDataCount", ` + select count(1) as count from thread_state,trace_range where dur > 0 and (ts - start_ts) >= 0; +`, {}); + +export const getThreadStateData = (limit: number, offset: number): Promise> => + query("getThreadStateData", ` + select itid, + state, + dur, + ts, + (ts - start_ts + dur) as end_ts, + (ts - start_ts) as start_ts, + cpu +from thread_state,trace_range where dur > 0 and (ts - start_ts) >= 0 +limit $limit +offset $offset; +`, {$limit: limit, $offset: offset}); + +export const getThreadProcessData = (): Promise> => + query("getThreadProcessData", ` + select A.id, + A.tid as threadId, + A.name as thread, + IP.pid as processId, + IP.name as process +from thread as A left join process as IP on A.ipid = IP.id +where IP.pid not null; +`, {}); + +export const getSliceDataCount = (): Promise> => + query("getSliceDataCount", ` + select count(1) as count from sched_slice; +`, {}); + +export const getSliceData = (limit: number, offset: number): Promise> => + query("getSliceData", ` + select itid,ts,priority + from sched_slice +limit $limit +offset $offset; +`, {$limit: limit, $offset: offset}); + export const getStatesProcessThreadDataCount = (): Promise> => - query("getStatesProcessThreadData", `select count(1) as count from (select IP.name as process, - IP.pid as processId, - A.name as thread, - B.state as state, - A.tid as threadId, - B.dur, - (B.ts - TR.start_ts + B.dur) as end_ts, - (B.ts - TR.start_ts) as start_ts, - B.cpu, - C.priority, - '-' as note -from thread_state as B - left join thread as A on B.itid = A.id - left join process as IP on A.ipid = IP.id - left join trace_section as TR - left join sched_slice as C on B.itid = C.itid and C.ts = B.ts -where - B.dur > 0 and IP.pid not null and (B.ts - TR.start_ts) >= 0); + query("getStatesProcessThreadData", ` + select + count(1) as count + from + (select + IP.name as process, + IP.pid as processId, + A.name as thread, + B.state as state, + A.tid as threadId, + B.dur, + (B.ts - TR.start_ts + B.dur) as end_ts, + (B.ts - TR.start_ts) as start_ts, + B.cpu, + C.priority, + '-' as note + from + thread_state as B + left join + thread as A + on + B.itid = A.id + left join + process as IP + on + A.ipid = IP.id + left join + trace_section as TR + left join + sched_slice as C + on + B.itid = C.itid + and + C.ts = B.ts + where + B.dur > 0 + and + IP.pid not null + and + (B.ts - TR.start_ts) >= 0); `, {}); -export const getStatesProcessThreadData = (limit:number,offset:number): Promise> => - query("getStatesProcessThreadData", `select IP.name as process, - IP.pid as processId, - A.name as thread, - B.state as state, - A.tid as threadId, - B.dur, - (B.ts - TR.start_ts + B.dur) as end_ts, - (B.ts - TR.start_ts) as start_ts, - B.cpu, - C.priority, - '-' as note -from thread_state as B - left join thread as A on B.itid = A.id - left join process as IP on A.ipid = IP.id - left join trace_section as TR - left join sched_slice as C on B.itid = C.itid and C.ts = B.ts -where - B.dur > 0 and IP.pid not null and (B.ts - TR.start_ts) >= 0 limit $limit offset $offset; +export const getStatesProcessThreadData = (limit: number, offset: number): Promise> => + query("getStatesProcessThreadData", ` + select + IP.name as process, + IP.pid as processId, + A.name as thread, + B.state as state, + A.tid as threadId, + B.dur, + (B.ts - TR.start_ts + B.dur) as end_ts, + (B.ts - TR.start_ts) as start_ts, + B.cpu, + C.priority, + '-' as note + from + thread_state as B + left join + thread as A + on + B.itid = A.id + left join + process as IP + on + A.ipid = IP.id + left join + trace_section as TR + left join + sched_slice as C + on + B.itid = C.itid + and + C.ts = B.ts + where + B.dur > 0 + and + IP.pid not null + and (B.ts - TR.start_ts) >= 0 + limit $limit + offset $offset; `, {$limit: limit, $offset: offset}); export const getTabStatesGroupByProcessThread = (leftNs: number, rightNs: number): Promise> => - query("getTabStatesGroupByProcessThread", `select process, - processId, - thread, - threadId, - sum(dur) as wallDuration, - round(avg(dur),2) as avgDuration, - min(dur) as minDuration, - max(dur) as maxDuration, - count(threadId) as count -from temp_get_process_thread_state_data -where not (end_ts < $leftNS or start_ts > $rightNS) -group by process, processId,thread,threadId`, {$leftNS: leftNs, $rightNS: rightNs}); + query("getTabStatesGroupByProcessThread", ` + select + process, + processId, + thread, + threadId, + sum(dur) as wallDuration, + round(avg(dur),2) as avgDuration, + min(dur) as minDuration, + max(dur) as maxDuration, + count(threadId) as count + from + temp_get_process_thread_state_data + where + not (end_ts < $leftNS or start_ts > $rightNS) + group by + process, + processId, + thread, + threadId`, {$leftNS: leftNs, $rightNS: rightNs}); export const getTabStatesGroupByProcess = (leftNs: number, rightNs: number): Promise> => - query("getTabStatesGroupByProcess", `select process, processId, - sum(dur) as wallDuration, - round(avg(dur),2) as avgDuration, - min(dur) as minDuration, - max(dur) as maxDuration, - count(processId) as count -from temp_get_process_thread_state_data -where not (end_ts < $leftNS or start_ts > $rightNS) -group by process,processId`, {$leftNS: leftNs, $rightNS: rightNs}); - -// todo wasm模式报错 + query("getTabStatesGroupByProcess", ` + select + process, + processId, + sum(dur) as wallDuration, + round(avg(dur),2) as avgDuration, + min(dur) as minDuration, + max(dur) as maxDuration, + count(processId) as count + from + temp_get_process_thread_state_data + where + not (end_ts < $leftNS or start_ts > $rightNS) + group by + process,processId`, {$leftNS: leftNs, $rightNS: rightNs}); + export const getTabStatesGroupByState = (leftNs: number, rightNs: number): Promise> => - query("getTabStatesGroupByState", `select state, - sum(dur) as wallDuration, - round(avg(dur),2) as avgDuration, - min(dur) as minDuration, - max(dur) as maxDuration, - count(state) as count -from temp_get_process_thread_state_data -where not (end_ts < $leftNS or start_ts > $rightNS) -group by state`, {$leftNS: leftNs, $rightNS: rightNs}); + query("getTabStatesGroupByState", ` + select + state, + sum(dur) as wallDuration, + round(avg(dur),2) as avgDuration, + min(dur) as minDuration, + max(dur) as maxDuration, + count(state) as count + from + temp_get_process_thread_state_data + where + not (end_ts < $leftNS or start_ts > $rightNS) + group by + state`, {$leftNS: leftNs, $rightNS: rightNs}); export const getTabStatesGroupByStatePid = (leftNs: number, rightNs: number): Promise> => - query("getTabStatesGroupByStatePid", `select process, - processId, - state, - sum(dur) as wallDuration, - round(avg(dur),2) as avgDuration, - min(dur) as minDuration, - max(dur) as maxDuration, - count(processId) as count -from temp_get_process_thread_state_data -where not (end_ts < $leftNS or start_ts > $rightNS) -group by process,processId,state`, {$leftNS: leftNs, $rightNS: rightNs}); + query("getTabStatesGroupByStatePid", ` + select + process, + processId, + state, + sum(dur) as wallDuration, + round(avg(dur),2) as avgDuration, + min(dur) as minDuration, + max(dur) as maxDuration, + count(processId) as count + from + temp_get_process_thread_state_data + where + not (end_ts < $leftNS or start_ts > $rightNS) + group by + process, + processId, + state`, {$leftNS: leftNs, $rightNS: rightNs}); export const getTabStatesGroupByStatePidTid = (leftNs: number, rightNs: number): Promise> => - query("getTabStatesGroupByStatePidTid", `select process, - processId, - thread, - state, - threadId, - sum(dur) as wallDuration, - round(avg(dur),2) as avgDuration, - min(dur) as minDuration, - max(dur) as maxDuration, - count(threadId) as count -from temp_get_process_thread_state_data -where not (end_ts < $leftNS or start_ts > $rightNS) -group by process, processId, thread, threadId,state`, {$leftNS: leftNs, $rightNS: rightNs}); - -export const getTabBoxChildData = (leftNs: number, rightNs: number, state: string | undefined, processId: number | undefined, threadId: number | undefined): Promise> => - query("getTabBoxChildData", `select IP.name as process, - IP.pid as processId, - A.name as thread, - B.state as state, - A.tid as threadId, - B.dur as duration, - B.ts - TR.start_ts as startNs, - B.cpu, - C.priority, - '-' as note -from thread_state AS B - left join thread as A on B.itid = A.id - left join process AS IP on A.ipid = IP.id - left join trace_section AS TR - left join sched_slice as C on B.itid = C.itid and C.ts = B.ts -where - B.dur > 0 and IP.pid not null - and not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS)) - ${state != undefined && state != '' ? 'and B.state = $state' : ''} - ${processId != undefined && processId != -1 ? 'and IP.pid = $processID' : ''} - ${threadId != undefined && threadId != -1 ? 'and A.tid = $threadID' : ''} + query("getTabStatesGroupByStatePidTid", ` + select + process, + processId, + thread, + state, + threadId, + sum(dur) as wallDuration, + round(avg(dur),2) as avgDuration, + min(dur) as minDuration, + max(dur) as maxDuration, + count(threadId) as count + from + temp_get_process_thread_state_data + where + not (end_ts < $leftNS or start_ts > $rightNS) + group by + process, + processId, + thread, + threadId, + state`, {$leftNS: leftNs, $rightNS: rightNs}); + +export const getTabBoxChildData = (leftNs: number, rightNs: number, state: string | undefined, + processId: number | undefined, threadId: number | undefined): Promise> => + query("getTabBoxChildData", ` + select + IP.name as process, + IP.pid as processId, + A.name as thread, + B.state as state, + A.tid as threadId, + B.dur as duration, + B.ts - TR.start_ts as startNs, + B.cpu, + C.priority, + '-' as note + from + thread_state AS B + left join + thread as A + on + B.itid = A.id + left join + process AS IP + on + A.ipid = IP.id + left join + trace_section AS TR + left join + sched_slice as C + on + B.itid = C.itid + and + C.ts = B.ts + where + B.dur > 0 + and + IP.pid not null + and + not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS)) + ${state != undefined && state != '' ? 'and B.state = $state' : ''} + ${processId != undefined && processId != -1 ? 'and IP.pid = $processID' : ''} + ${threadId != undefined && threadId != -1 ? 'and A.tid = $threadID' : ''} `, {$leftNS: leftNs, $rightNS: rightNs, $state: state, $processID: processId, $threadID: threadId}) -/*-------------------------------------------------------------------------------------*/ export const getTabCpuUsage = (cpus: Array, leftNs: number, rightNs: number): Promise> => - query("getTabCpuUsage", `select cpu, - sum(case - when (A.ts - B.start_ts) < $leftNS then (A.ts - B.start_ts + A.dur - $leftNS) - when (A.ts - B.start_ts) >= $leftNS and (A.ts - B.start_ts + A.dur) <= $rightNS then A.dur - when (A.ts - B.start_ts + A.dur) > $rightNS then ($rightNS - (A.ts - B.start_ts)) end) / cast($rightNS - $leftNS as float) as usage -from thread_state A ,trace_section B -where (A.ts - B.start_ts) > 0 and A.dur > 0 - and cpu in (${cpus.join(",")}) - and (A.ts - B.start_ts + A.dur) > $leftNS and (A.ts - B.start_ts) < $rightNS -group by cpu`, {$leftNS: leftNs, $rightNS: rightNs}) + query("getTabCpuUsage", ` + select + cpu, + sum(case + when (A.ts - B.start_ts) < $leftNS + then (A.ts - B.start_ts + A.dur - $leftNS) + when (A.ts - B.start_ts) >= $leftNS + and (A.ts - B.start_ts + A.dur) <= $rightNS + then A.dur + when (A.ts - B.start_ts + A.dur) > $rightNS + then ($rightNS - (A.ts - B.start_ts)) end) / cast($rightNS - $leftNS as float) as usage + from + thread_state A, + trace_section B + where + (A.ts - B.start_ts) > 0 and A.dur > 0 + and + cpu in (${cpus.join(",")}) + and + (A.ts - B.start_ts + A.dur) > $leftNS + and + (A.ts - B.start_ts) < $rightNS + group by + cpu`, {$leftNS: leftNs, $rightNS: rightNs}) export const getTabCpuFreq = (cpus: Array, leftNs: number, rightNs: number): Promise> => - query("getTabCpuFreq", `select cpu,value,(ts - tb.start_ts) as startNs -from measure c ,trace_section tb -inner join cpu_measure_filter t on c.filter_id = t.id -where (name = 'cpufreq' or name='cpu_frequency') - and cpu in (${cpus.join(",")}) - and startNs > 0 - and startNs < $rightNS - order by startNs`, {$leftNS: leftNs, $rightNS: rightNs}) -/*-------------------------------------------------------------------------------------*/ + query("getTabCpuFreq", ` + select + cpu, + value, + (ts - tb.start_ts) as startNs + from + measure c, + trace_section tb + inner join + cpu_measure_filter t + on + c.filter_id = t.id + where + (name = 'cpufreq' or name='cpu_frequency') + and + cpu in (${cpus.join(",")}) + and + startNs > 0 + and + startNs < $rightNS + order by + startNs`, {$leftNS: leftNs, $rightNS: rightNs}) + export const getTabFps = (leftNs: number, rightNs: number): Promise> => - query("getTabFps", `select distinct(ts-tb.start_ts) as startNS,fps -from hidump c ,trace_section tb -where startNS <= $rightNS and startNS >= 0 -order by startNS;`, {$leftNS: leftNs, $rightNS: rightNs}) -/*-------------------------------------------------------------------------------------*/ + query("getTabFps", ` + select + distinct(ts-tb.start_ts) as startNS, + fps + from + hidump c, + trace_section tb + where + startNS <= $rightNS + and + startNS >= 0 + order by + startNS;`, {$leftNS: leftNs, $rightNS: rightNs}) + export const getTabCounters = (filterIds: Array, startTime: number) => - query("getTabCounters", `select t1.filter_id as trackId,t2.name,value, t1.ts - t3.start_ts as startTime -from measure t1 -left join process_measure_filter t2 on t1.filter_id = t2.id -left join trace_section t3 where filter_id in (${filterIds.join(",")}) -and startTime <= $startTime -order by startTime asc;`, {$startTime: startTime}) -/*-------------------------------------------------------------------------------------*/ + query("getTabCounters", ` + select + t1.filter_id as trackId, + t2.name, + value, + t1.ts - t3.start_ts as startTime + from + measure t1 + left join + process_measure_filter t2 + on + t1.filter_id = t2.id + left join + trace_section t3 + where + filter_id in (${filterIds.join(",")}) + and + startTime <= $startTime + order by + startTime asc;`, {$startTime: startTime}) + export const getTabCpuByProcess = (cpus: Array, leftNS: number, rightNS: number) => - query("getTabCpuByProcess", `select IP.name as process, - IP.pid as pid, - sum(B.dur) as wallDuration, - avg(B.dur) as avgDuration, - count(A.tid) as occurrences -from thread_state AS B - left join thread as A on B.itid = A.id - left join trace_section AS TR - left join process AS IP on A.ipid = IP.id -where B.cpu in (${cpus.join(",")}) - and not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS )) -group by IP.name, IP.pid -order by wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS}) -/*-------------------------------------------------------------------------------------*/ + query("getTabCpuByProcess", ` + select + IP.name as process, + IP.pid as pid, + sum(B.dur) as wallDuration, + avg(B.dur) as avgDuration, + count(A.tid) as occurrences + from + thread_state AS B + left join + thread as A + on + B.itid = A.id + left join + trace_section AS TR + left join + process AS IP + on + A.ipid = IP.id + where + B.cpu in (${cpus.join(",")}) + and + not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS )) + group by + IP.name, + IP.pid + order by + wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS}) + export const getTabCpuByThread = (cpus: Array, leftNS: number, rightNS: number) => - query("getTabCpuByThread", `select IP.name as process, - IP.pid as pid, - A.name as thread, - A.tid as tid, - sum(B.dur) as wallDuration, - avg(B.dur) as avgDuration, - count(A.tid) as occurrences -from thread_state AS B - left join thread as A on B.itid = A.id - left join trace_section AS TR - left join process AS IP on A.ipid = IP.id -where B.cpu in (${cpus.join(",")}) - and not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS)) -group by IP.name, IP.pid, A.name, A.tid -order by wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS}) -/*-------------------------------------------------------------------------------------*/ + query("getTabCpuByThread", ` + select + IP.name as process, + IP.pid as pid, + A.name as thread, + A.tid as tid, + sum(B.dur) as wallDuration, + avg(B.dur) as avgDuration, + count(A.tid) as occurrences + from + thread_state AS B + left join + thread as A + on + B.itid = A.id + left join + trace_section AS TR + left join + process AS IP + on + A.ipid = IP.id + where + B.cpu in (${cpus.join(",")}) + and + not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS)) + group by + IP.name, + IP.pid, + A.name, + A.tid + order by + wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS}) + export const getTabSlices = (funTids: Array, leftNS: number, rightNS: number): Promise> => - query("getTabSlices", `select + query("getTabSlices", ` + select c.name as name, sum(c.dur) as wallDuration, avg(c.dur) as avgDuration, count(c.name) as occurrences -from thread A,trace_section D -left join callstack C on A.id = C.callid -where C.ts not null - and c.dur >= 0 - and A.tid in (${funTids.join(",")}) - and c.name not like 'binder%' - and not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS)) -group by c.name -order by wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS}) -/*-------------------------------------------------------------------------------------*/ + from + thread A, trace_section D + left join + callstack C + on + A.id = C.callid + where + C.ts not null + and + c.dur >= 0 + and + A.tid in (${funTids.join(",")}) + and + c.name not like 'binder%' + and + not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS)) + group by + c.name + order by + wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS}) + export const getTabThreadStates = (tIds: Array, leftNS: number, rightNS: number): Promise> => - query("getTabThreadStates", `select - IP.name as process, - IP.pid, - A.name as thread, - A.tid, - B.state, - sum(B.dur) as wallDuration, - avg(ifnull(B.dur,0)) as avgDuration, - count(A.tid) as occurrences -from thread_state AS B -left join thread as A on A.id = B.itid -left join trace_section AS TR -left join process AS IP on IP.id=ipid -where A.tid in (${tIds.join(",")}) -and not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS)) -group by IP.name, IP.pid, A.name, A.tid, B.state -order by wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS}) -/*-------------------------------------------------------------------------------------*/ + query("getTabThreadStates", ` + select + IP.name as process, + IP.pid, + A.name as thread, + A.tid, + B.state, + sum(B.dur) as wallDuration, + avg(ifnull(B.dur,0)) as avgDuration, + count(A.tid) as occurrences + from + thread_state AS B + left join + thread as A + on + A.id = B.itid + left join + trace_section AS TR + left join + process AS IP + on + IP.id=ipid + where + A.tid in (${tIds.join(",")}) + and + not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS)) + group by + IP.name, IP.pid, A.name, A.tid, B.state + order by + wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS}) + export const getThreadFuncData = (tId: number): Promise> => - query("getThreadFuncData", `select tid, - A.start_ts, - A.end_ts, - A.name as threadName, - is_main_thread, - c.callid as track_id, - c.ts-D.start_ts as startTs, - c.ts + c.dur as endTs, - c.dur, - c.name as funName, - c.depth, - c.parent_id, - c.id -from thread A,trace_section D -left join callstack C on A.id = C.callid -where startTs not null and A.tid = $tid;`, {$tid: tId}) -/*-------------------------------------------------------------------------------------*/ + query("getThreadFuncData", ` + select + tid, + A.start_ts, + A.end_ts, + A.name as threadName, + is_main_thread, + c.callid as track_id, + c.ts-D.start_ts as startTs, + c.ts + c.dur as endTs, + c.dur, + c.name as funName, + c.depth, + c.parent_id, + c.id + from + thread A, + trace_section D + left join + callstack C + on + A.id = C.callid + where + startTs not null + and + A.tid = $tid;`, {$tid: tId}) + export const queryBinderArgsByArgset = (argset: number): Promise> => - query("queryBinderArgsByArgset", `select * from args_view where argset = $argset;`, {$argset: argset}) -/*-------------------------------------------------------------------------------------*/ + query("queryBinderArgsByArgset", ` + select + * + from + args_view + where + argset = $argset;`, {$argset: argset}) + export const queryClockFrequency = (): Promise> => - query("queryClockFrequency", `with freq as ( select measure.filter_id, measure.ts, measure.type, measure.value from clock_event_filter -left join measure -where clock_event_filter.name = '%s' and clock_event_filter.type = 'clock_set_rate' and clock_event_filter.id = measure.filter_id -order by measure.ts) -select freq.filter_id,freq.ts - r.start_ts as ts,freq.type,freq.value from freq,trace_section r;`, {}) -/*-------------------------------------------------------------------------------------*/ + query("queryClockFrequency", ` + with freq as ( + select + measure.filter_id, + measure.ts, + measure.type, + measure.value + from + clock_event_filter + left join + measure + where + clock_event_filter.name = '%s' + and + clock_event_filter.type = 'clock_set_rate' + and + clock_event_filter.id = measure.filter_id + order by + measure.ts) + select + freq.filter_id, + freq.ts - r.start_ts as ts, + freq.type, + freq.value + from + freq, + trace_section r;`, {}) + export const queryClockList = (): Promise> => - query("queryClockList", `with list as ( - select distinct name from clock_event_filter - where clock_event_filter.type = 'clock_set_rate' order by name -),freq as( - select measure.filter_id, measure.ts, measure.type, measure.value , clock_event_filter.name from clock_event_filter - left join measure - where clock_event_filter.type = 'clock_set_rate' and clock_event_filter.id = measure.filter_id - order by measure.ts -),state as ( - select filter_id, ts, endts, endts-ts as dur, type, value,name from - (select measure.filter_id, measure.ts, lead(ts, 1, null) over( order by measure.ts) endts, measure.type, measure.value,clock_event_filter.name from clock_event_filter,trace_section - left join measure - where clock_event_filter.type != 'clock_set_rate' and clock_event_filter.id = measure.filter_id - order by measure.ts) -),count_freq as ( - select COUNT(*) num,name srcname from freq group by name -),count_state as ( - select COUNT(*) num,name srcname from state group by name -) -select count_freq.srcname||' Frequency' as name,* from count_freq union select count_state.srcname||' State' as name,* from count_state order by name;`) -/*-------------------------------------------------------------------------------------*/ + query("queryClockList", ` + with list as ( + select + distinct name + from + clock_event_filter + where + clock_event_filter.type = 'clock_set_rate' + order by + name), + freq as( + select + measure.filter_id, + measure.ts, + measure.type, + measure.value, + clock_event_filter.name + from + clock_event_filter + left join + measure + where + clock_event_filter.type = 'clock_set_rate' + and + clock_event_filter.id = measure.filter_id + order by + measure.ts + ),state as ( + select + filter_id, + ts, + endts, + endts-ts as dur, + type, + value, + name + from + (select + measure.filter_id, + measure.ts, + lead(ts, 1, null) over( order by measure.ts) endts, + measure.type, + measure.value, + clock_event_filter.name + from + clock_event_filter, + trace_section + left join + measure + where + clock_event_filter.type != 'clock_set_rate' + and + clock_event_filter.id = measure.filter_id + order by + measure.ts) + ),count_freq as ( + select + COUNT(*) num, + name srcname + from + freq + group by + name + ),count_state as ( + select + COUNT(*) num, + name srcname + from + state + group by + name + ) + select + count_freq.srcname||' Frequency' as name, + * + from + count_freq union select count_state.srcname||' State' as name,* from count_state order by name;`) + export const queryClockState = (): Promise> => - query("queryClockState", `with state as ( -select filter_id, ts, endts, endts-ts as dur, type, value from -(select measure.filter_id, measure.ts, lead(ts, 1, null) over( order by measure.ts) endts, measure.type, measure.value from clock_event_filter,trace_section -left join measure -where clock_event_filter.name = '%s' and clock_event_filter.type != 'clock_set_rate' and clock_event_filter.id = measure.filter_id -order by measure.ts)) + query("queryClockState", ` + with state as ( + select + filter_id, + ts, + endts, + endts-ts as dur, + type, + value + from + (select + measure.filter_id, + measure.ts, + lead(ts, 1, null) over( order by measure.ts) endts, + measure.type, + measure.value + from + clock_event_filter, + trace_section + left join + measure + where + clock_event_filter.name = '%s' + and + clock_event_filter.type != 'clock_set_rate' + and + clock_event_filter.id = measure.filter_id + order by + measure.ts)) -- select * from state; select s.filter_id,s.ts-r.start_ts as ts,s.type,s.value,s.dur from state s,trace_section r;`) -/*-------------------------------------------------------------------------------------*/ + export const queryCpuData = (cpu: number, startNS: number, endNS: number): Promise> => - query("queryCpuData", `select * from temp_query_cpu_data where cpu = $cpu and startTime between $startNS and $endNS;`, { + query("queryCpuData", ` + select + * + from + temp_query_cpu_data + where + cpu = $cpu + and + startTime between $startNS and $endNS;`, { $cpu: cpu, $startNS: startNS, $endNS: endNS }) -/*-------------------------------------------------------------------------------------*/ + export const queryCpuFreq = (): Promise> => -query("queryCpuFreq", `select cpu from cpu_measure_filter where (name='cpufreq' or name='cpu_frequency') order by cpu;`) -/*-------------------------------------------------------------------------------------*/ + query("queryCpuFreq", ` + select + cpu + from + cpu_measure_filter + where + (name='cpufreq' or name='cpu_frequency') + order by cpu;`) + export const queryCpuFreqData = (cpu: number): Promise> => - query("queryCpuFreqData", `select cpu,value,ts-tb.start_ts as startNS -from measure c ,trace_section tb -inner join cpu_measure_filter t on c.filter_id = t.id -where (name = 'cpufreq' or name='cpu_frequency') and cpu= $cpu -order by ts;`, {$cpu: cpu}); -/*-------------------------------------------------------------------------------------*/ + query("queryCpuFreqData", ` + select + cpu, + value, + ts-tb.start_ts as startNS + from + measure c, + trace_section tb + inner join + cpu_measure_filter t + on + c.filter_id = t.id + where + (name = 'cpufreq' or name='cpu_frequency') + and + cpu= $cpu + order by + ts;`, {$cpu: cpu}); + export const queryCpuMax = (): Promise> => - query("queryCpuMax", `select cpu from sched_slice order by cpu desc limit 1;`) -/*-------------------------------------------------------------------------------------*/ + query("queryCpuMax", ` + select + cpu + from + sched_slice + order by + cpu + desc limit 1;`) + export const queryCpuMaxFreq = (): Promise> => -query("queryCpuMaxFreq", `select max(value) as maxFreq -from measure c -inner join cpu_measure_filter t on c.filter_id = t.id -where (name = 'cpufreq' or name='cpu_frequency');`) -// /*-------------------------------------------------------------------------------------*/ + query("queryCpuMaxFreq", ` + select + max(value) as maxFreq + from + measure c + inner join + cpu_measure_filter t + on + c.filter_id = t.id + where + (name = 'cpufreq' or name='cpu_frequency');`) + export const queryLogs = (): Promise> => - query("queryLogs", `select l.*,l.ts-t.start_ts as "startTime" from log as l left join trace_section AS t - where "startTime" between %s and %s order by "startTime" - limit %s offset %s;`) -/*-------------------------------------------------------------------------------------*/ + query("queryLogs", ` + select + l.*, + l.ts-t.start_ts as "startTime" + from + log as l + left join + trace_section AS t + where + "startTime" between %s and %s + order by + "startTime" + limit %s offset %s;`) + export const queryLogsCount = (): Promise> => - query("queryLogsCount", `select l.*,l.ts-t.start_ts as "startTime" from log as l left join trace_section AS t - where "startTime" between %s and %s;`) -/*-------------------------------------------------------------------------------------*/ + query("queryLogsCount", ` + select + l.*, + l.ts-t.start_ts as "startTime" + from + log as l + left join + trace_section AS t + where + "startTime" + between %s and %s;`) + export const queryProcessData = (pid: number, startNS: number, endNS: number): Promise> => - query("queryProcessData", `select * from temp_query_process_data where tid != 0 and pid = $pid and startTime between $startNS and $endNS;`, { + query("queryProcessData", ` + select + * + from + temp_query_process_data + where + tid != 0 + and + pid = $pid + and + startTime between $startNS and $endNS;`, { $pid: pid, $startNS: startNS, $endNS: endNS }) -/*-------------------------------------------------------------------------------------*/ + export const queryProcessDataCount = (): Promise> => - query("queryProcessDataCount", `select ta.id,type, ts, dur, ta.cpu, itid as utid, state - ,ts-tb.start_ts as startTime,tc.tid,tc.pid,tc.process,tc.thread -from thread_state ta,trace_section tb -left join ( - select it.id,tid,pid,ip.name as process,it.name as thread from thread as it left join process ip on it.ipid = ip.id - ) tc on ta.itid = tc.id -where tc.pid = %d - and startTime between %s and %s -and ta.cpu is not null -order by startTime;`) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessDataCount", ` + select + ta.id, + type, + ts, + dur, + ta.cpu, + itid as utid, + state, + ts-tb.start_ts as startTime, + tc.tid, + tc.pid, + tc.process, + tc.thread + from + thread_state ta, + trace_section tb + left join ( + select + it.id, + tid, + pid, + ip.name as process, + it.name as thread + from + thread as it + left join + process ip + on + it.ipid = ip.id + ) tc + on + ta.itid = tc.id + where + tc.pid = %d + and + startTime between %s and %s + and + ta.cpu is not null + order by startTime;`) + export const queryProcessDataLimit = (pid: number, startNS: number, endNS: number, limit: number): Promise> => - query("queryProcessDataLimit", `with list as (select ta.id,type, ts, dur, ta.cpu, itid as utid, state - ,ts-tb.start_ts as startTime,tc.tid,tc.pid,tc.process,tc.thread -from thread_state ta,trace_section tb -left join ( - select it.id,tid,pid,ip.name as process,it.name as thread from thread as it left join process ip on it.ipid = ip.id - ) tc on ta.itid = tc.id -where tc.pid = $pid - and startTime between $startNS and $endNS -and ta.cpu is not null -order by startTime ) + query("queryProcessDataLimit", ` + with list as ( + select + ta.id,type, + ts, dur, + ta.cpu, + itid as utid, + state, + ts-tb.start_ts as startTime, + tc.tid, + tc.pid, + tc.process, + tc.thread + from + thread_state ta, + trace_section tb + left join ( + select + it.id, + tid,pid, + ip.name as process, + it.name as thread + from + thread as it + left join + process ip + on + it.ipid = ip.id + ) tc on ta.itid = tc.id + where + tc.pid = $pid + and + startTime between $startNS and $endNS + and + ta.cpu is not null + order by startTime ) select * from list order by random() limit $limit;`, {$pid: pid, $startNS: startNS, $endNS: endNS, $limit: limit}) -/*-------------------------------------------------------------------------------------*/ + export const queryProcessMem = (): Promise> => - query("queryProcessMem", `select process_measure_filter.id as trackId, - process_measure_filter.name as trackName, - ipid as upid, - process_view.pid, - process_view.name as processName -from process_measure_filter join process_view using (ipid) -order by trackName;`) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessMem", ` + select + process_measure_filter.id as trackId, + process_measure_filter.name as trackName, + ipid as upid, + process_view.pid, + process_view.name as processName + from + process_measure_filter + join + process_view using (ipid) + order by trackName;`) + export const queryProcessMemData = (trackId: number): Promise> => - query("queryProcessMemData", `select c.type, - ts, value, - filter_id as track_id, - c.ts-tb.start_ts startTime -from measure c,trace_section tb where filter_id = $id;`, {$id: trackId}) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessMemData", ` + select + c.type, + ts, + value, + filter_id as track_id, + c.ts-tb.start_ts startTime + from + measure c, + trace_section tb + where + filter_id = $id;`, {$id: trackId}) + export const queryProcessNOrder = (): Promise> => - query("queryProcessNOrder", `select pid,name as processName from process;`) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessNOrder", ` + select + pid, + name as processName + from + process;`) + export const queryProcessThreads = (): Promise> => - query("queryProcessThreads", `select - the_tracks.ipid as upid, - the_tracks.itid as utid, - total_dur as hasSched, - process_view.pid as pid, - thread_view.tid as tid, - process_view.name as processName, - thread_view.name as threadName -from ( - select ipid, itid from sched_view join thread_view using(itid) group by itid -) the_tracks -left join (select ipid, sum(dur) as total_dur - from sched_view join thread_view using(itid) - group by ipid -) using(ipid) -left join thread_view using(itid) -left join process_view using(ipid) -order by - total_dur desc, - the_tracks.ipid, - the_tracks.itid;`, {}) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessThreads", ` + select + the_tracks.ipid as upid, + the_tracks.itid as utid, + total_dur as hasSched, + process_view.pid as pid, + thread_view.tid as tid, + process_view.name as processName, + thread_view.name as threadName + from ( + select + ipid, + itid + from + sched_view + join + thread_view using(itid) + group by + itid + ) the_tracks + left join ( + select + ipid, + sum(dur) as total_dur + from + sched_view join thread_view using(itid) + group by + ipid + ) using(ipid) + left join + thread_view using(itid) + left join + process_view using(ipid) + order by + total_dur desc, + the_tracks.ipid, + the_tracks.itid;`, {}) + export const queryProcessThreadsNOrder = (): Promise> => - query("queryProcessThreadsNOrder", `select p.id as upid, - t.id as utid, - p.pid, - t.tid, - p.name as processName, - t.name as threadName - from thread t left join process p on t.ipid = p.id;`) -/*-------------------------------------------------------------------------------------*/ + query("queryProcessThreadsNOrder", ` + select + p.id as upid, + t.id as utid, + p.pid, + t.tid, + p.name as processName, + t.name as threadName + from + thread t + left join + process p + on + t.ipid = p.id;`) + export const queryScreenState = (): Promise> => - query("queryScreenState", `select m.type, m.ts-r.start_ts as ts, value, filter_id from measure m,trace_section r where filter_id in (select id from process_measure_filter where name = 'ScreenState');`) -/*-------------------------------------------------------------------------------------*/ + query("queryScreenState", ` + select + m.type, + m.ts-r.start_ts as ts, + value, + filter_id + from + measure m, + trace_section r + where + filter_id in ( + select + id + from + process_measure_filter + where + name = 'ScreenState');`) + export const queryThreadData = (tid: number): Promise> => - query("queryThreadData", `select * from temp_query_thread_data where tid = $tid;`, {$tid: tid}) -/*-------------------------------------------------------------------------------------*/ + query("queryThreadData", ` + select + * + from + temp_query_thread_data + where + tid = $tid;`, {$tid: tid}) + export const queryWakeUpThread_Desc = (): Promise> => query("queryWakeUpThread_Desc", `This is the interval from when the task became eligible to run (e.g.because of notifying a wait queue it was a suspended on) to when it started running.`) + /*-------------------------------------------------------------------------------------*/ -export const queryWakeUpThread_WakeThread = (wakets: number): Promise> => - query("queryWakeUpThread_WakeThread", `select TB.tid,TB.name as thread,TA.cpu,TC.pid,TC.name as process +export const queryWakeUpFromThread_WakeThread = (wakets: number): Promise> => + query("queryWakeUpFromThread_WakeThread", `select TB.tid,TB.name as thread,TA.cpu,(TA.ts - TR.start_ts) as ts,TC.pid,TC.name as process from sched_view TA left join thread TB on TA.itid = TB.id left join process TC on TB.ipid = TC.id +left join trace_range TR where itid = (select itid from raw where name = 'sched_waking' and ts = $wakets ) and TA.ts < $wakets and Ta.ts + Ta.dur >= $wakets`, {$wakets: wakets}) /*-------------------------------------------------------------------------------------*/ -export const queryWakeUpThread_WakeTime = (tid: number, startTime: number): Promise> => - query("queryWakeUpThread_WakeTime", `select * from +export const queryWakeUpFromThread_WakeTime = (tid: number, startTime: number): Promise> => + query("queryWakeUpFromThread_WakeTime", `select * from ( select ts as wakeTs,start_ts as startTs from instants_view,trace_section where name = 'sched_waking' and ref = $tid @@ -688,187 +1302,1315 @@ export const queryWakeUpThread_WakeTime = (tid: number, startTime: number): Prom and ts < start_ts + $startTime order by ts desc limit 1) TB`, {$tid: tid, $startTime: startTime}) /*-------------------------------------------------------------------------------------*/ -export const queryThreadsByPid = (pid: number): Promise> => - query("queryThreadsByPid", `select - the_tracks.ipid as upid, - the_tracks.itid as utid, - total_dur as hasSched, - process_view.pid as pid, - thread_view.tid as tid, - process_view.name as processName, - thread_view.name as threadName - from ( - select ipid, itid from sched_view join thread_view using(itid) group by itid - ) the_tracks - left join (select ipid, sum(dur) as total_dur - from sched_view join thread_view using(itid) - group by ipid - ) using(ipid) - left join thread_view using(itid) - left join process_view using(ipid) - where pid = $pid - order by - total_dur desc, - the_tracks.ipid, - the_tracks.itid`, {$pid: pid}) +export const queryThreadWakeUp = (itid: number, startTime: number,dur:number): Promise> => + query("queryThreadWakeUp", ` +select TB.tid,TB.name as thread,min(TA.ts - TR.start_ts) as ts,TC.pid,TC.name as process +from + (select min(ts) as wakeTs,ref as itid from instant,trace_range + where name = 'sched_wakeup' + and wakeup_from = $tid + and ts > start_ts + $startTime + and ts < start_ts + $startTime + $dur + group by ref + ) TW +left join sched_slice TA on TW.itid = TA.itid and TA.ts > TW.wakeTs +left join thread TB on TA.itid = TB.id +left join process TC on TB.ipid = TC.id +left join trace_range TR +where TB.ipid not null +group by TB.tid, TB.name,TC.pid, TC.name; + `, {$tid: itid, $startTime: startTime,$dur:dur}) + +export const queryThreadWakeUpFrom = (itid: number, startTime: number,dur:number): Promise> => + query("queryThreadWakeUpFrom", ` +select TB.tid,TB.name as thread,TA.cpu,(TA.ts - TR.start_ts) as ts,TC.pid,TC.name as process +from + (select ts as wakeTs,wakeup_from as wakeupFromTid from instant,trace_range + where name = 'sched_wakeup' + and ref = $tid + and ts > start_ts + $startTime + and ts < start_ts + $startTime + $dur + order by ts) TW +left join sched_slice TA on TW.wakeupFromTid = TA.itid and TA.ts < TW.wakeTs and TA.ts + TA.dur >= TW.wakeTs +left join thread TB on TA.itid = TB.id +left join process TC on TB.ipid = TC.id +left join trace_range TR +where TB.ipid not null +limit 1; + `, {$tid: itid, $startTime: startTime,$dur:dur}) /*-------------------------------------------------------------------------------------*/ +export const queryThreadsByPid = (pid: number): Promise> => + query("queryThreadsByPid", ` + select + the_tracks.ipid as upid, + the_tracks.itid as utid, + total_dur as hasSched, + process_view.pid as pid, + thread_view.tid as tid, + process_view.name as processName, + thread_view.name as threadName + from ( + select + ipid, + itid + from + sched_view + join + thread_view using(itid) + group by + itid + ) the_tracks + left join ( + select + ipid, + sum(dur) as total_dur + from + sched_view + join + thread_view using(itid) + group by + ipid + ) using(ipid) + left join + thread_view using(itid) + left join + process_view using(ipid) + where + pid = $pid + order by + total_dur desc, + the_tracks.ipid, + the_tracks.itid`, {$pid: pid}) + export const queryHeapByPid = (startTs: number, endTs: number, ipid: number): Promise> => - query("queryHeapByPid", `select a.maxheap maxHeapSize,current_size_dur as dur,h.all_heap_size heapsize,h.start_ts - t.start_ts as startTime,h.end_ts - t.start_ts as endTime -from native_hook h left join trace_section t left join (select max(all_heap_size) maxheap from native_hook) a where ipid = ${ipid} and startTime between ${startTs} and ${endTs}; + query("queryHeapByPid", ` + select + a.maxheap maxHeapSize, + current_size_dur as dur, + h.all_heap_size heapsize, + h.start_ts - t.start_ts as startTime, + h.end_ts - t.start_ts as endTime + from + native_hook h + left join + trace_section t + left join ( + select + max(all_heap_size) maxheap + from + native_hook) a + where + ipid = ${ipid} + and + startTime + between ${startTs} and ${endTs}; `, {$ipid: ipid, $startTs: startTs, $endTs: endTs}) export const queryHeapGroupByEvent = (): Promise> => - query("queryHeapGroupByEvent", `select event_type as eventType,sum(heap_size) as sumHeapSize from native_hook group by event_type`, {}) - -export const queryHeapByEventType = (startTs: number, endTs: number, arg1: string,arg2: string): Promise> => - query("queryHeapByEventType", ` -select a.maxHeap maxHeapSize, - current_size_dur as dur, - h.all_heap_size heapsize, - h.start_ts - t.start_ts as startTime, - h.end_ts - t.start_ts as endTime, - h.event_type as eventType -from native_hook h -left join trace_section t -left join ( -select max(all_heap_size) maxHeap -from native_hook ${arg1}) a -where startTime between ${startTs} and ${endTs} ${arg2} -`, {$startTs: startTs, $endTs: endTs,$arg1:arg1,$arg2:arg2}) -/*-------------------------------------------------------------------------------------*/ + query("queryHeapGroupByEvent", ` + select + event_type as eventType, + sum(heap_size) as sumHeapSize + from + native_hook + group by event_type`, {}) + +export const queryHeapByEventType = + (startTs: number, endTs: number, arg1: string, arg2: string): Promise> => + query("queryHeapByEventType", ` + select + a.maxHeap maxHeapSize, + current_size_dur as dur, + h.all_heap_size heapsize, + h.start_ts - t.start_ts as startTime, + h.end_ts - t.start_ts as endTime, + h.event_type as eventType + from + native_hook h + left join + trace_section t + left join ( + select + max(all_heap_size) maxHeap + from + native_hook ${arg1}) a + where + startTime + between ${startTs} and ${endTs} ${arg2} +`, {$startTs: startTs, $endTs: endTs, $arg1: arg1, $arg2: arg2}) + export const queryHeapPid = (): Promise> => - query("queryHeapPid", `select ipid,pid from native_hook h left join process p on h.ipid = p.id group by ipid,pid`, {}) -/*-------------------------------------------------------------------------------------*/ + query("queryHeapPid", ` + select + ipid, + pid + from + native_hook h + left join + process p + on + h.ipid = p.id + group by ipid,pid`, {}) + export const queryHeapTable = (startTs: number, endTs: number, ipids: Array): Promise> => - query("queryHeapTable", `select *,Allocations - Deallocations Total,AllocationSize - DeAllocationSize RemainingSize from (select f.file_path MoudleName, - sum(case when h.event_type = 'AllocEvent' then 1 else 0 end) Allocations, - sum(case when h.event_type = 'FreeEvent' then 1 else 0 end) Deallocations, - sum(case when h.event_type = 'AllocEvent' then heap_size else 0 end) AllocationSize, - sum(case when h.event_type = 'FreeEvent' then heap_size else 0 end) DeAllocationSize, + query("queryHeapTable", ` + select + *, + Allocations - Deallocations Total, + AllocationSize - DeAllocationSize RemainingSize + from ( + select + f.file_path MoudleName, + sum(case when h.event_type = 'AllocEvent' then 1 else 0 end) Allocations, + sum(case when h.event_type = 'FreeEvent' then 1 else 0 end) Deallocations, + sum(case when h.event_type = 'AllocEvent' then heap_size else 0 end) AllocationSize, + sum(case when h.event_type = 'FreeEvent' then heap_size else 0 end) DeAllocationSize, f.symbol_name AllocationFunction - from (select native_hook.start_ts - t.start_ts as startTime,* from native_hook - left join trace_range t where ipid in (${ipids.join(",")}) and startTime between ${startTs} and ${endTs}) h - left join (select * from native_hook_frame where depth = 0) f - on f.eventId = h.eventId group by f.file_path)`, + from ( + select + native_hook.start_ts - t.start_ts as startTime, + * + from + native_hook + left join + trace_range t \ + where + ipid in (${ipids.join(",")}) + and + startTime + between + ${startTs} and ${endTs}) h + left join ( + select + * + from + native_hook_frame + where + depth = 0) f + on + f.eventId = h.eventId + group by + f.file_path)`, {ipids: ipids, $startTs: startTs, $endTs: endTs}) + export const queryHeapTreeTable = (startTs: number, endTs: number, ipids: Array): Promise> => query("queryHeapTable", ` - select h.start_ts - t.start_ts as startTs, - h.end_ts - t.start_ts as endTs, - h.heap_size as heapSize, - h.event_type as eventType, - f.symbol_name as AllocationFunction, - f.file_path as MoudleName, - f.depth, - f.eventId - from native_hook h - inner join trace_range t - inner join native_hook_frame f on h.eventId = f.eventId where event_type = 'AllocEvent' - and ipid in (${ipids.join(",")}) - and (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`, + select + h.start_ts - t.start_ts as startTs, + h.end_ts - t.start_ts as endTs, + h.heap_size as heapSize, + h.event_type as eventType, + f.symbol_name as AllocationFunction, + f.file_path as MoudleName, + f.depth, + f.eventId + from + native_hook h + inner join + trace_range t + inner join + native_hook_frame f + on + h.eventId = f.eventId + where + event_type = 'AllocEvent' + and + ipid in (${ipids.join(",")}) + and + (h.start_ts - t.start_ts between ${startTs} + and ${endTs} or h.end_ts - t.start_ts + between ${startTs} and ${endTs})`, {ipids: ipids, $startTs: startTs, $endTs: endTs}) + export const queryHeapAllTable = (limit: number, offset: number): Promise> => query("queryHeapAllTable", ` select - h.symbol_name as AllocationFunction, - h.file_path as MoudleName, - h.depth, - h.eventId - from native_hook_frame h limit $limit offset $offset`, - { $limit: limit, $offset: offset}) + h.symbol_name as AllocationFunction, + h.file_path as MoudleName, + h.depth, + h.eventId + from + native_hook_frame h + limit $limit offset $offset`, + {$limit: limit, $offset: offset}) + export const queryHeapAllData = (startTs: number, endTs: number, ipids: Array): Promise> => query("queryHeapAllData", ` - select h.start_ts - t.start_ts as startTs, - h.end_ts - t.start_ts as endTs, - h.heap_size as heapSize, - h.event_type as eventType, - h.eventId - from native_hook h - inner join trace_range t - where event_type = 'AllocEvent' - and ipid in (${ipids.join(",")}) - and (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`, + select + h.start_ts - t.start_ts as startTs, + h.end_ts - t.start_ts as endTs, + h.heap_size as heapSize, + h.event_type as eventType, + h.eventId + from + native_hook h + inner join + trace_range t + where + event_type = 'AllocEvent' + and + ipid in (${ipids.join(",")}) + and + (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`, {ipids: ipids, $startTs: startTs, $endTs: endTs}) + export const queryHeapFrameCount = (): Promise> => query("queryHeapAllTable", ` select count(*) as count - from native_hook_frame `, + from + native_hook_frame `, {}) -export const queryNativeHookStatistics = (leftNs:number,rightNs:number): Promise> => - query("queryNativeHookStatistics",` - select event_type as eventType,sub_type as subType,max(all_heap_size) as max,sum(heap_size) as sumHeapSize,count(event_type) as count -from native_hook A,trace_range B -where (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} ---not ((A.start_ts - B.start_ts + ifnull(A.dur,0)) < ${leftNs} or (A.start_ts - B.start_ts) > ${rightNs}) -group by event_type, sub_type`,{$leftNs:leftNs,$rightNs:rightNs}) - -export const queryNativeHookStatisticsMalloc = (leftNs:number,rightNs:number):Promise> => - query('queryNativeHookStatisticsMalloc', - `select event_type as eventType, - heap_size as heapSize, - sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, - sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, - sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, - sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount -from native_hook A,trace_range B -where ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} - or (A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) - and (event_type = 'AllocEvent') -group by event_type,heap_size; - `,{$leftNs:leftNs,$rightNs:rightNs}) - -export const queryNativeHookStatisticsSubType = (leftNs:number,rightNs:number):Promise> => - query('queryNativeHookStatisticsSubType', - `select event_type as eventType, - sub_type as subType, - max(heap_size) as heapSize, - sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, - sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, - sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, - sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount -from native_hook A,trace_range B -where ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} - or (A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) - and (event_type = 'MmapEvent') -group by event_type,sub_type; - `,{$leftNs:leftNs,$rightNs:rightNs}) - -export const queryNativeHookEventId = (leftNs:number,rightNs:number,types:Array): Promise> => - query("queryNativeHookEventId",` - select eventId,event_type as eventType,sub_type as subType,heap_size as heapSize,addr,(A.start_ts - B.start_ts) as startTs,(A.end_ts - B.start_ts) as endTs -from native_hook A, trace_range B -where A.start_ts - B.start_ts between ${leftNs} and ${rightNs} and A.event_type in (${types.join(",")})`,{$leftNs:leftNs,$rightNs:rightNs,$types:types}) - -export const queryNativeHookEventTid = (leftNs:number,rightNs:number,types:Array): Promise> => - query("queryNativeHookEventTid",` - select eventId, - event_type as eventType, - sub_type as subType, - heap_size as heapSize, - addr, - (A.start_ts - B.start_ts) as startTs, - (A.end_ts - B.start_ts) as endTs, - tid -from native_hook A, trace_range B -left join thread t on A.itid = t.id -where A.start_ts - B.start_ts between ${leftNs} and ${rightNs} and A.event_type in (${types.join(",")})`,{$leftNs:leftNs,$rightNs:rightNs,$types:types}) - -export const queryNativeHookProcess = ():Promise> => - query("queryNativeHookProcess",`select distinct ipid,pid,name from native_hook left join process p on native_hook.ipid = p.id`,{}) - -export const queryNativeHookSnapshot = (rightNs:number):Promise> => - query("queryNativeHookSnapshot",`select event_type as eventType,sub_type as subType,sum(heap_size) as growth,count(*) as existing from native_hook n, trace_range t -where (event_type = 'AllocEvent' or event_type = 'MmapEvent') - and n.start_ts between 0 and ${rightNs} + t.start_ts - and n.end_ts > ${rightNs} + t.start_ts -group by event_type,sub_type`,{$rightNs:rightNs}) - -export const queryNativeHookSnapshotTypes = ():Promise> => - query("queryNativeHookSnapshotTypes",`select event_type as eventType,sub_type as subType from native_hook where (event_type = 'AllocEvent' or event_type = 'MmapEvent') group by event_type,sub_type;`,{}) - -export const queryAllHookData = (rightNs:number):Promise> => - query("queryAllHookData",`select eventId,event_type as eventType,sub_type as subType,addr,heap_size as growth,(n.start_ts - t.start_ts) as startTs,(n.end_ts - t.start_ts) as endTs from native_hook n, trace_range t -where (event_type = 'AllocEvent' or event_type = 'MmapEvent') - and n.start_ts between t.start_ts and ${rightNs} + t.start_ts`,{$rightNs:rightNs}) \ No newline at end of file +export const queryNativeHookStatistics = (leftNs: number, rightNs: number): Promise> => + query("queryNativeHookStatistics", ` + select + event_type as eventType, + sub_type as subType, + max(all_heap_size) as max, + sum(heap_size) as sumHeapSize, + count(event_type) as count + from + native_hook A, + trace_range B + where + (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} + --not ((A.start_ts - B.start_ts + ifnull(A.dur,0)) < ${leftNs} or (A.start_ts - B.start_ts) > ${rightNs}) + group by event_type, sub_type`, {$leftNs: leftNs, $rightNs: rightNs}) + +export const queryNativeHookStatisticsMalloc = (leftNs: number, rightNs: number): Promise> => + query('queryNativeHookStatisticsMalloc', ` + select + event_type as eventType, + heap_size as heapSize, + sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, + sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, + sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, + sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount + from + native_hook A, + trace_range B + where + ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} + or + (A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) + and + (event_type = 'AllocEvent') + group by + event_type, + heap_size; + `, {$leftNs: leftNs, $rightNs: rightNs}) + +export const queryNativeHookStatisticsSubType = (leftNs: number, rightNs: number): Promise> => + query('queryNativeHookStatisticsSubType', ` + select + event_type as eventType, + sub_type as subType, + max(heap_size) as heapSize, + sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte, + sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount, + sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte, + sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount + from + native_hook A, + trace_range B + where + ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs} + or + (A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) + and + (event_type = 'MmapEvent') + group by + event_type,sub_type; + `, {$leftNs: leftNs, $rightNs: rightNs}) + +export const queryNativeHookEventId = (leftNs: number, rightNs: number, types: Array): Promise> => + query("queryNativeHookEventId", ` + select + eventId, + event_type as eventType, + sub_type as subType, + heap_size as heapSize, + addr, + (A.start_ts - B.start_ts) as startTs, + (A.end_ts - B.start_ts) as endTs + from + native_hook A, + trace_range B + where + A.start_ts - B.start_ts between ${leftNs} and ${rightNs} and A.event_type in (${types.join(",")})` + , {$leftNs: leftNs, $rightNs: rightNs, $types: types}) + +export const queryNativeHookEventTid = (leftNs: number, rightNs: number, types: Array): Promise> => + query("queryNativeHookEventTid", ` + select + eventId, + event_type as eventType, + sub_type as subType, + heap_size as heapSize, + addr, + (A.start_ts - B.start_ts) as startTs, + (A.end_ts - B.start_ts) as endTs, + tid + from + native_hook A, + trace_range B + left join + thread t + on + A.itid = t.id + where + A.start_ts - B.start_ts + between ${leftNs} and ${rightNs} and A.event_type in (${types.join(",")})` + , {$leftNs: leftNs, $rightNs: rightNs, $types: types}) + +export const queryNativeHookProcess = (): Promise> => + query("queryNativeHookProcess", ` + select + distinct ipid, + pid, + name + from + native_hook + left join + process p + on + native_hook.ipid = p.id`, {}) + +export const queryNativeHookSnapshot = (rightNs: number): Promise> => + query("queryNativeHookSnapshot", ` + select + event_type as eventType, + sub_type as subType, + sum(heap_size) as growth, + count(*) as existing + from + native_hook n, + trace_range t + where + (event_type = 'AllocEvent' or event_type = 'MmapEvent') + and n.start_ts between 0 and ${rightNs} + t.start_ts + and n.end_ts > ${rightNs} + t.start_ts + group by event_type,sub_type`, {$rightNs: rightNs}) + +export const queryNativeHookSnapshotTypes = (): Promise> => + query("queryNativeHookSnapshotTypes", ` + select + event_type as eventType, + sub_type as subType + from + native_hook + where + (event_type = 'AllocEvent' or event_type = 'MmapEvent') + group by + event_type,sub_type;`, {}) + +export const queryAllHookData = (rightNs: number): Promise> => + query("queryAllHookData", ` + select + eventId, + event_type as eventType, + sub_type as subType, + addr, + heap_size as growth, + (n.start_ts - t.start_ts) as startTs, + (n.end_ts - t.start_ts) as endTs + from + native_hook n, + trace_range t + where + (event_type = 'AllocEvent' or event_type = 'MmapEvent') + and + n.start_ts between t.start_ts and ${rightNs} + t.start_ts`, {$rightNs: rightNs}) + + +/** + * HiPerf + */ +export const queryHiPerfCpuData = (cpu: number): Promise> => + query("queryHiPerfCpuData", `select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where cpu_id=${cpu} and s.thread_id != 0;`, {$cpu: cpu}) +export const queryHiPerfCpuMergeData = (): Promise> => + query("queryHiPerfCpuData", `select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where s.thread_id != 0;`, {}) + +export const queryHiPerfProcessData = (pid: number): Promise> => query("queryHiPerfProcessData", `SELECT sp.*, + th.thread_name, + th.thread_id tid, + th.process_id pid, + sp.timestamp_trace - tr.start_ts startNS +from perf_sample sp, + trace_range tr + left join perf_thread th on th.thread_id = sp.thread_id +where pid = ${pid} and sp.thread_id != 0;;`, {$pid: pid}) + +export const queryHiPerfThreadData = (tid: number): Promise> => query("queryHiPerfThreadData", `SELECT sp.*, + th.thread_name, + th.thread_id tid, + th.process_id pid, + sp.timestamp_trace - tr.start_ts startNS +from perf_sample sp, + trace_range tr + left join perf_thread th on th.thread_id = sp.thread_id +where tid = ${tid} and sp.thread_id != 0;`, {$tid: tid}) + +export const querySelectTraceStats = (): Promise> => + query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat'); + +export const queryCustomizeSelect = (sql: string): Promise> => + query('queryCustomizeSelect', sql); + +export const queryMetricTraceStats = (): Promise> => + query('queryMetricTraceStats', `select 'stat {' || char(13) || ' name: ' || + event_name || '_' || stat_type || char(13) || ' count: ' || + count || char(13) || ' source: ' || + source || char(13) || ' severity: ' || + serverity || char(13) || ' }' || char(13) as traceStatsResult from stat`); + +export const querySysCalls = (): Promise> => + query('querySysCalls', `SELECT ' function {' || CHAR ( 13 ) || ' function_name: ' || + name || char(13) || ' durMax: ' || + max( dur ) || char(13) || ' durMin: ' || + min( dur ) || char(13) ||' durAvg: ' || + floor(avg( dur )) || char(13) || ' }' || char(13) as sysCallsResult + FROM callstack GROUP BY name ORDER BY count(*) DESC LIMIT 100`); + +export const querySysCallsTop10 = (): Promise> => + query('querySysCallsTop10', `select + ' process_info {' || char(13) || + ' name: ' || cpu.process_name || char(13) || + ' pid: ' || cpu.pid || char(13) || + ' threads {' || char(13) || + ' name: ' || cpu.thread_name || char(13) || + ' tid: ' || cpu.tid || char(13) || + ' function {' || char(13) || + ' function_name: ' || cpu.thread_name || char(13) || + ' durMax: ' || max(callstack.dur) || char(13) || + ' durMin: ' || min(callstack.dur) || char(13) || + ' durAvg: ' || floor(avg(callstack.dur)) || char(13) || + ' }' || char(13) || + ' }' || char(13) || + ' }' as name + from callstack inner join + ( select + itid as tid, + ipid as pid, + group_concat(cpu,',') as cpu, + group_concat(duration,',') as duration, + group_concat(min_freq,',') as min_freq, + group_concat(max_freq,',') as max_freq, + group_concat(avg_frequency,',') as avg_frequency, + sum(duration*avg_frequency) as sumNum, + process_name, + thread_name + from + ( + SELECT itid, + ipid, + cpu, + CAST(SUM(duration) AS INT) AS duration, + CAST(MIN(freq) AS INT) AS min_freq, + CAST(MAX(freq) AS INT) AS max_freq, + CAST((SUM(duration * freq) / SUM(duration)) AS INT) AS avg_frequency, + process_name, + thread_name + FROM (SELECT (MIN(cpu_frequency_view.end_ts, cpu_thread_view.end_ts) - MAX(cpu_frequency_view.start_ts, cpu_thread_view.ts)) AS duration, + freq, + cpu_thread_view.cpu as cpu, + itid, + ipid, + process_name, + thread_name + FROM cpu_frequency_view JOIN cpu_thread_view ON(cpu_frequency_view.cpu = cpu_thread_view.cpu) + WHERE cpu_frequency_view.start_ts < cpu_thread_view.end_ts AND cpu_frequency_view.end_ts > cpu_thread_view.ts + ) GROUP BY itid, cpu) GROUP BY ipid, itid order by sumNum desc limit 10 + ) + as cpu on + callstack.callid = cpu.tid + group by callstack.name order by count(callstack.name) desc limit 10`); + +export const queryMetricTraceTask = (): Promise> => + query('queryMetricTraceTask', `select + ttt.name || + REPLACE(ttt.thread_name,',',CHAR (13)) || char(13) || ' }' || CHAR (13) as nameStr + from + (SELECT ' process{' || CHAR (13) || ' pid: ' || + P.pid || char(13) || ' process_name: ' || + P.name || char(13) as name, + group_concat(' thread_name: ', T.name || ',') as thread_name + from process as P left join thread as T where P.id = T.ipid + group by pid) ttt`); + +export const queryMetricData = (): Promise> => + query('queryMetricData', ` + select + cast(name as varchar) as name, + cast(value as varchar) as value + from meta + UNION + select + 'start_ts', + cast(start_ts as varchar) + from trace_range + UNION + select + 'end_ts', + cast(end_ts as varchar) + from + trace_range`); + +export const queryDistributedTerm = (): Promise> => + query('queryDistributedTerm', ` + select + group_concat(thread.id,',') as threadId, + group_concat(thread.name,',') as threadName, + group_concat(process.id,',') as processId, + group_concat(process.name,',') as processName, + group_concat(callstack.name,',') as funName, + group_concat(callstack.dur,',') as dur, + group_concat(callstack.ts,',') as ts, + cast(callstack.chainId as varchar) as chainId, + callstack.spanId as spanId, + callstack.parentSpanId as parentSpanId, + group_concat(callstack.flag,',') as flag, + (select + value + from + meta + where + name='source_name') as trace_name + from + callstack + inner join thread on callstack.callid = thread.id + inner join process on process.id = thread.ipid + where (callstack.flag='S' or callstack.flag='C') + group by callstack.chainId,callstack.spanId,callstack.parentSpanId`); + +export const queryTraceCpu = (): Promise> => + query('queryTraceCpu', ` + select + itid as tid, + ipid as pid, + group_concat(cpu,',') as cpu, + group_concat(duration,',') as duration, + group_concat(min_freq,',') as min_freq, + group_concat(max_freq,',') as max_freq, + group_concat(avg_frequency,',') as avg_frequency, + process_name as process_name, + thread_name as thread_name + from + ( + SELECT itid, + ipid, + cpu, + CAST(SUM(duration) AS INT) AS duration, + CAST(MIN(freq) AS INT) AS min_freq, + CAST(MAX(freq) AS INT) AS max_freq, + CAST((SUM(duration * freq) / SUM(duration)) AS INT) AS avg_frequency, + process_name, + thread_name + FROM (SELECT (MIN(cpu_frequency_view.end_ts, cpu_thread_view.end_ts) - MAX(cpu_frequency_view.start_ts, cpu_thread_view.ts)) AS duration, + freq, + cpu_thread_view.cpu as cpu, + itid, + ipid, + process_name, + thread_name + FROM cpu_frequency_view JOIN cpu_thread_view ON(cpu_frequency_view.cpu = cpu_thread_view.cpu) + WHERE cpu_frequency_view.start_ts < cpu_thread_view.end_ts AND cpu_frequency_view.end_ts > cpu_thread_view.ts + ) GROUP BY itid, cpu + ) + GROUP BY ipid, itid order by ipid`); + +export const queryTraceCpuTop = (): Promise> => + query('queryTraceCpuTop', ` + select + itid as tid, + ipid as pid, + group_concat(cpu,',') as cpu, + group_concat(duration,',') as duration, + group_concat(min_freq,',') as min_freq, + group_concat(max_freq,',') as max_freq, + group_concat(avg_frequency,',') as avg_frequency, + sum(duration*avg_frequency) as sumNum, + process_name as process_name, + thread_name as thread_name + from + ( + SELECT itid, + ipid, + cpu, + CAST(SUM(duration) AS INT) AS duration, + CAST(MIN(freq) AS INT) AS min_freq, + CAST(MAX(freq) AS INT) AS max_freq, + CAST((SUM(duration * freq) / SUM(duration)) AS INT) AS avg_frequency, + process_name, + thread_name + FROM (SELECT (MIN(cpu_frequency_view.end_ts, cpu_thread_view.end_ts) - MAX(cpu_frequency_view.start_ts, cpu_thread_view.ts)) AS duration, + freq, + cpu_thread_view.cpu as cpu, + itid, + ipid, + process_name, + thread_name + FROM cpu_frequency_view JOIN cpu_thread_view ON(cpu_frequency_view.cpu = cpu_thread_view.cpu) + WHERE cpu_frequency_view.start_ts < cpu_thread_view.end_ts AND cpu_frequency_view.end_ts > cpu_thread_view.ts + ) GROUP BY itid, cpu + ) + GROUP BY ipid, itid order by sumNum desc limit 10`); + +export const queryTraceMemory = (): Promise> => + query('queryTraceMemory', ` + select + max(value) as maxNum, + min(value) as minNum, + avg(value) as avgNum, + result.name as name, + result.processName as processName + from measure inner join + ( + select filter.id,filter.name,p.name as processName from process_measure_filter as filter + left join process as p + on filter.ipid=p.id where filter.name = 'mem.rss.anon' + ) as result on result.id = filter_id + where filter_id > 0 group by filter_id order by avgNum desc`); + +export const queryTraceMemoryTop = (): Promise> => + query('queryTraceMemoryTop', ` + select + max(value) as maxNum, + min(value) as minNum, + avg(value) as avgNum, + result.name as name, + result.processName as processName + from measure inner join + ( + select filter.id,filter.name,p.name as processName from process_measure_filter as filter + left join process as p + on filter.ipid=p.id where filter.name = 'mem.rss.anon' + ) as result on result.id = filter_id + where filter_id > 0 group by filter_id order by avgNum desc limit 10`); + +export const queryTraceMemoryUnAgg = (): Promise> => + query('queryTraceMemoryUnAgg', `d + select + processName as processName, + group_concat(name) as name, + cast(group_concat(value) as varchar) as value, + cast(group_concat(ts) as varchar) as ts + from measure inner join + ( + select filter.ipid,filter.id,filter.name,p.name as processName from process_measure_filter as filter + left join process as p + on filter.ipid=p.id where filter.name = 'mem.rss.anon' or filter.name = 'mem.rss.file' or filter.name = 'mem.swap' or filter.name = 'oom_score_adj' + ) as result + on result.id = filter_id + group by processName,ipid order by ipid`); + +export const queryTraceTaskName = (): Promise> => + query('queryTraceTaskName', ` + select + P.id as id, + P.pid as pid, + P.name as process_name, + group_concat(T.name,',') as thread_name + from process as P left join thread as T where P.id = T.ipid + group by pid`); + +export const queryTraceMetaData = (): Promise> => + query('queryTraceMetaData', ` + select + cast(name as varchar) as name, + cast(value as varchar) as valueText + from meta + UNION + select 'start_ts',cast(start_ts as varchar) from trace_range + UNION + select 'end_ts',cast(end_ts as varchar) from trace_range`); + +export const querySystemCalls = (): Promise> => + query('querySystemCalls', ` + select + count(*) as frequency, + min(dur) as minDur, + max(dur) as maxDur, + floor(avg(dur)) as avgDur, + name as funName + from + callstack + group by name + order by + frequency desc limit 100`); + +export const querySystemCallsTop = (): Promise> => + query('querySystemCallsTop', `select + cpu.tid as tid, + cpu.pid as pid, + cpu.process_name as process_name, + cpu.thread_name as thread_name, + callstack.name as funName, + count(callstack.name) as frequency, + min(callstack.dur) as minDur, + max(callstack.dur) as maxDur, + floor(avg(callstack.dur)) as avgDur + from callstack inner join + ( select + itid as tid, + ipid as pid, + group_concat(cpu,',') as cpu, + group_concat(duration,',') as duration, + group_concat(min_freq,',') as min_freq, + group_concat(max_freq,',') as max_freq, + group_concat(avg_frequency,',') as avg_frequency, + sum(duration*avg_frequency) as sumNum, + process_name, + thread_name + from + ( + SELECT itid, + ipid, + cpu, + CAST(SUM(duration) AS INT) AS duration, + CAST(MIN(freq) AS INT) AS min_freq, + CAST(MAX(freq) AS INT) AS max_freq, + CAST((SUM(duration * freq) / SUM(duration)) AS INT) AS avg_frequency, + process_name, + thread_name + FROM (SELECT (MIN(cpu_frequency_view.end_ts, cpu_thread_view.end_ts) - MAX(cpu_frequency_view.start_ts, cpu_thread_view.ts)) AS duration, + freq, + cpu_thread_view.cpu as cpu, + itid, + ipid, + process_name, + thread_name + FROM cpu_frequency_view JOIN cpu_thread_view ON(cpu_frequency_view.cpu = cpu_thread_view.cpu) + WHERE cpu_frequency_view.start_ts < cpu_thread_view.end_ts AND cpu_frequency_view.end_ts > cpu_thread_view.ts + ) GROUP BY itid, cpu) GROUP BY ipid, itid order by sumNum desc limit 10 + ) + as cpu on + callstack.callid = cpu.tid + group by callstack.name order by frequency desc limit 10`); + +export const getTabLiveProcessData = (leftNs: number, rightNs: number): Promise> => + query("getTabLiveProcessData", `SELECT + process.id as processId, + process.name as processName, + process.ppid as responsibleProcess, + process.uud as userName, + process.usag as cpu, + process.threadN as threads, + process.pss as memory, + process.cpu_time as cpuTime, + process.disk_reads as diskReads, + process.disk_writes as diskWrite + FROM + ( + SELECT + tt.process_id AS id, + tt.process_name AS name, + tt.parent_process_id AS ppid, + tt.uid as uud, + tt.cpu_usage as usag, + tt.thread_num AS threadN, + mt.maxTT - TR.start_ts as endTs, + tt.pss_info as pss, + tt.cpu_time, + tt.disk_reads, + tt.disk_writes + FROM + live_process tt + LEFT JOIN trace_range AS TR + LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT + from live_process re GROUP BY re.process_name, re.process_id ) mt + on mt.idd = tt.process_id where endTs >= $rightNS + GROUP BY + tt.process_name, + tt.process_id + ) process ;`, {$leftNS: leftNs, $rightNS: rightNs}) + +export const getTabProcessHistoryData = (leftNs: number, rightNs: number, + processId: number | undefined, threadId: number | undefined): Promise> => + query("getTabProcessHistoryData", `SELECT + process.id as processId, + process.isD as alive, + process.startTS as firstSeen, + process.endTs as lastSeen, + process.name as processName, + process.ppid as responsibleProcess, + process.uuid as userName, + process.cpu_time as cpuTime, + 0 as pss + FROM + ( + SELECT + tt.process_id AS id, + tt.process_name AS name, + tt.parent_process_id AS ppid, + tt.uid AS uuid, + tt.cpu_time, + (mt.minTT - TR.start_ts ) AS startTS, + mt.maxTT - TR.start_ts as endTs, + (mt.maxTT - TR.start_ts - $rightNS) > 0 as isD + FROM + live_process tt + LEFT JOIN trace_range AS TR + LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT + from live_process re GROUP BY re.process_name, re.process_id ) mt + on mt.idd = tt.process_id + GROUP BY + tt.process_name, + tt.process_id + ) process;` + , {$leftNS: leftNs, $rightNS: rightNs, $processID: processId, $threadID: threadId}) + +export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise> => + query("getTabCpuAbilityData", `SELECT + ( n.ts - TR.start_ts ) AS startTime, + n.dur AS duration, + n.total_load AS totalLoad, + n.user_load AS userLoad, + n.system_load AS systemLoad, + n.process_num AS threads + FROM + cpu_usage AS n, + trace_range AS TR + WHERE + ( n.ts - TR.start_ts ) >= ifnull(( + SELECT + ( usage.ts - TR.start_ts ) + FROM + cpu_usage usage, + trace_range TR + WHERE + ( usage.ts - TR.start_ts ) <= $leftNS + ORDER BY + usage.ts DESC + LIMIT 1 + ),0) + AND ( n.ts - TR.start_ts ) <= $rightNS + ORDER BY + startTime ASC; + `, {$leftNS: leftNs, $rightNS: rightNs}) + +export const getTabMemoryAbilityData = (leftNs: number, rightNs: number): Promise> => + query("getTabMemoryAbilityData", `SELECT + m.ts AS startTime, + GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value, + GROUP_CONCAT( f.name ) AS name + FROM + measure AS m + INNER JOIN sys_event_filter AS f ON m.filter_id = f.id + AND (f.name = 'sys.mem.total' + or f.name = 'sys.mem.free' + or f.name = 'sys.mem.buffers' + or f.name = 'sys.mem.cached' + or f.name = 'sys.mem.shmem' + or f.name = 'sys.mem.slab' + or f.name = 'sys.mem.swap.total' + or f.name = 'sys.mem.swap.free' + or f.name = 'sys.mem.mapped' + or f.name = 'sys.mem.vmalloc.used' + or f.name = 'sys.mem.page.tables' + or f.name = 'sys.mem.kernel.stack' + or f.name = 'sys.mem.active' + or f.name = 'sys.mem.inactive' + or f.name = 'sys.mem.unevictable' + or f.name = 'sys.mem.vmalloc.total' + or f.name = 'sys.mem.slab.unreclaimable' + or f.name = 'sys.mem.cma.total' + or f.name = 'sys.mem.cma.free' + or f.name = 'sys.mem.kernel.reclaimable' + or f.name = 'sys.mem.zram' + ) + AND m.ts >= ifnull(( + SELECT + m.ts AS startTime + FROM + measure AS m + INNER JOIN sys_event_filter AS f ON m.filter_id = f.id + AND m.ts <= $leftNS + AND (f.name = 'sys.mem.total' + or f.name = 'sys.mem.free' + or f.name = 'sys.mem.buffers' + or f.name = 'sys.mem.cached' + or f.name = 'sys.mem.shmem' + or f.name = 'sys.mem.slab' + or f.name = 'sys.mem.swap.total' + or f.name = 'sys.mem.swap.free' + or f.name = 'sys.mem.mapped' + or f.name = 'sys.mem.vmalloc.used' + or f.name = 'sys.mem.page.tables' + or f.name = 'sys.mem.kernel.stack' + or f.name = 'sys.mem.active' + or f.name = 'sys.mem.inactive' + or f.name = 'sys.mem.unevictable' + or f.name = 'sys.mem.vmalloc.total' + or f.name = 'sys.mem.slab.unreclaimable' + or f.name = 'sys.mem.cma.total' + or f.name = 'sys.mem.cma.free' + or f.name = 'sys.mem.kernel.reclaimable' + or f.name = 'sys.mem.zram' + ) + ORDER BY + m.ts DESC + LIMIT 1 + ),0) + AND m.ts <= $rightNS GROUP BY m.ts;`, {$leftNS: leftNs, $rightNS: rightNs}) + +export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise> => + query("getTabNetworkAbilityData", `SELECT + ( n.ts - TR.start_ts ) AS startTime, + n.dur AS duration, + n.rx AS dataReceived, + n.tx_speed AS dataReceivedSec, + n.tx AS dataSend, + n.rx_speed AS dataSendSec, + n.packet_in AS packetsIn, + n.packet_in_sec AS packetsInSec, + n.packet_out AS packetsOut, + n.packet_out_sec AS packetsOutSec + FROM + network AS n, + trace_range AS TR + WHERE + ( n.ts - TR.start_ts ) >= ifnull(( + SELECT + ( nn.ts - T.start_ts ) AS startTime + FROM + network nn, + trace_range T + WHERE + ( nn.ts - T.start_ts ) <= $leftNS + ORDER BY + nn.ts DESC + LIMIT 1 + ),0) + AND ( n.ts - TR.start_ts ) <= $rightNS + ORDER BY + startTime ASC`, {$leftNS: leftNs, $rightNS: rightNs}) + +/*-------------------------------------------------------------------------------------*/ +export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise> => + query("getTabDiskAbilityData", `SELECT + ( n.ts - TR.start_ts ) AS startTime, + n.dur AS duration, + n.rd AS dataRead, + n.rd_speed AS dataReadSec, + n.wr AS dataWrite, + n.wr_speed AS dataWriteSec, + n.rd_count AS readsIn, + n.rd_count_speed AS readsInSec, + n.wr_count AS writeOut, + n.wr_count_speed AS writeOutSec + FROM + diskio AS n, + trace_range AS TR + WHERE + ( n.ts - TR.start_ts ) >= ifnull(( + SELECT + ( nn.ts - T.start_ts ) AS startTime + FROM + diskio AS nn, + trace_range AS T + WHERE + ( nn.ts - T.start_ts ) <= $leftNS + ORDER BY + nn.ts DESC + LIMIT 1 + ),0) + AND ( n.ts - TR.start_ts ) <= $rightNS + ORDER BY + startTime ASC; + `, {$leftNS: leftNs, $rightNS: rightNs}) + +export const queryCpuAbilityData = (): Promise> => + query("queryCpuAbilityData", `select + (t.total_load) as value, + (t.ts - TR.start_ts) as startNS + from cpu_usage t, trace_section AS TR;`) + +export const queryCpuAbilityUserData = (): Promise> => + query("queryCpuAbilityUserData", `select + t.user_load as value, + (t.ts - TR.start_ts) as startNS + from cpu_usage t, trace_section AS TR;`) + +export const queryCpuAbilitySystemData = (): Promise> => + query("queryCpuAbilitySystemData", `select + t.system_load as value, + (t.ts - TR.start_ts) as startNS + from cpu_usage t, trace_section AS TR;`) + +export const queryMemoryUsedAbilityData = (id: string): Promise> => + query("queryMemoryUsedAbilityData", `select + t.value as value, + (t.ts - TR.start_ts) as startNS + from measure t, trace_section AS TR where t.filter_id = $id;`, {$id: id}) + +export const queryCachedFilesAbilityData = (id: string): Promise> => + query("queryCachedFilesAbilityData", `select + t.value as value, + (t.ts - TR.start_ts) as startNS + from measure t, trace_section AS TR where t.filter_id = $id;`, {$id: id}) + +export const queryCompressedAbilityData = (id: string): Promise> => + query("queryCompressedAbilityData", `select + t.value as value, + (t.ts - TR.start_ts) as startNS + from measure t, trace_section AS TR where t.filter_id = $id;`, {$id: id}) + +export const querySwapUsedAbilityData = (id: string): Promise> => + query("querySwapUsedAbilityData", `select + t.value as value, + (t.ts - TR.start_ts) as startNS + from measure t, trace_section AS TR where t.filter_id = $id;`, {$id: id}) + +export const queryBytesReadAbilityData = (): Promise> => + query("queryBytesReadAbilityData", `select + t.rd_speed as value, + (t.ts - TR.start_ts) as startNS + from diskio t, trace_section AS TR;`) + +export const queryBytesWrittenAbilityData = (): Promise> => + query("queryBytesWrittenAbilityData", `select + t.wr_speed as value, + (t.ts - TR.start_ts) as startNS + from diskio t, trace_section AS TR;`) + +export const queryReadAbilityData = (): Promise> => + query("queryReadAbilityData", `select + t.rd_count_speed as value, + (t.ts - TR.start_ts) as startNS + from diskio t, trace_section AS TR;`) + + +export const queryWrittenAbilityData = (): Promise> => + query("queryWrittenAbilityData", `select + t.wr_count_speed as value, + (t.ts - TR.start_ts) as startNS + from diskio t, trace_section AS TR;`) + +export const queryBytesInAbilityData = (): Promise> => + query("queryBytesInAbilityData", `select + t.tx_speed as value, + (t.ts - TR.start_ts) as startNS + from network t, trace_section AS TR;`) + +export const queryBytesOutAbilityData = (): Promise> => + query("queryBytesOutAbilityData", `select + t.rx_speed as value, + (t.ts - TR.start_ts) as startNS + from network t, trace_section AS TR;`,) + +export const queryPacketsInAbilityData = (): Promise> => + query("queryPacketsInAbilityData", `select + t.packet_in_sec as value, + (t.ts - TR.start_ts) as startNS + from network t, trace_section AS TR;`,) + +export const queryPacketsOutAbilityData = (): Promise> => + query("queryPacketsOutAbilityData", `select + t.packet_out_sec as value, + (t.ts - TR.start_ts) as startNS + from network t, trace_section AS TR;`) + +export const queryNetWorkMaxData = (): Promise> => + query("queryNetWorkMaxData", `select + ifnull(max(tx_speed),0) as maxIn, + ifnull(max(rx_speed),0) as maxOut, + ifnull(max(packet_in_sec),0) as maxPacketIn, + ifnull(max(packet_in_sec),0) as maxPacketOut + from network`) + +export const queryMemoryMaxData = (memoryName: string): Promise> => + query("queryMemoryMaxData", + `SELECT ifnull(max(m.value),0) as maxValue, + filter_id + from measure m + WHERE m.filter_id = + (SELECT id FROM sys_event_filter WHERE name = $memoryName) +`, {$memoryName: memoryName}) + +export const queryDiskIoMaxData = (): Promise> => + query("queryDiskIoMaxData", `select + ifnull(max(rd_speed),0) as bytesRead, + ifnull(max(wr_speed),0) as bytesWrite, + ifnull(max(rd_count_speed),0) as readOps, + ifnull(max(wr_count_speed),0) as writeOps + from diskio`) + +export const queryAbilityExits = (): Promise> => + query("queryAbilityExits", `select + event_name + from stat s + where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory') + and s.stat_type ='received' and s.count > 0`) + +export const queryStartTime = (): Promise> => + query("queryStartTime", `SELECT start_ts FROM trace_range`) + +export const queryPerfFiles = (): Promise> => + query("queryPerfFiles", `select file_id as fileId,symbol,path from perf_files`, {}) + +export const queryPerfCallchains = (limit:number,offset:number):Promise> => + query("queryPerfCallchains",`select c.sample_id as sampleId,c.callchain_id as callChainId,c.vaddr_in_file as vaddrInFile,c.file_id as fileId,c.symbol_id as symbolId, + s.thread_id as tid,t.process_id as pid,s.thread_state as threadState,s.timestamp as startNS from perf_callchain c left join perf_sample s on c.sample_id = s.sample_id left join perf_thread t on t.thread_id = s.thread_id limit $limit offset $offset`, + {$limit: limit, $offset: offset}) + +export const queryPerfCallchainsCount = ():Promise> => + query("queryPerfCallchainsCount",`select count(*) as count from perf_callchain`,{}) + +export const queryPerfProcess = (): Promise> => + query("queryPerfThread", `select process_id as pid,thread_name as processName from perf_thread where process_id = thread_id`, {}) + + +export const queryPerfThread = (): Promise> => + query("queryPerfThread", `select a.thread_id as tid,a.thread_name as threadName,a.process_id as pid,b.thread_name as processName from perf_thread a left join (select * from perf_thread where thread_id = process_id) b on a.process_id = b.thread_id`, {}) + +export const queryPerfSampleListByTimeRange = (leftNs: number, rightNs: number, cpus: Array, processes: Array, threads: Array): Promise> => { + let sql = ` +select A.sample_id as sampleId, + A.thread_id as tid, + C.thread_name as threadName, + A.thread_state as state, + C.process_id as pid, + (timestamp_trace - R.start_ts) as time, + cpu_id as core +from perf_sample A,trace_range R +left join perf_thread C on A.thread_id = C.thread_id +where time >= $leftNs and time <= $rightNs and A.thread_id != 0 + ` + if (cpus.length != 0 || processes.length != 0 || threads.length != 0) { + let arg1 = cpus.length > 0 ? `or core in (${cpus.join(",")}) ` : ''; + let arg2 = processes.length > 0 ? `or pid in (${processes.join(",")}) ` : ''; + let arg3 = threads.length > 0 ? `or tid in (${threads.join(",")})` : ''; + let arg = `${arg1}${arg2}${arg3}`.substring(3); + sql = `${sql} and (${arg})` + } + return query("queryPerfSampleListByTimeRange", sql, {$leftNs: leftNs, $rightNs: rightNs}); +} + +export const queryPerfSampleCallChain = (sampleId: number): Promise> => + query("queryPerfSampleCallChain", ` + select + callchain_id as callChainId, + sample_id as sampleId, + vaddr_in_file as vaddrInFile, + file_id as fileId, + symbol_id as symbolId +from perf_callchain where sample_id = $sampleId order by id desc; + `, {$sampleId: sampleId}) + +export const queryPerfCmdline = ():Promise> => + query("queryPerfCmdline",` + select report_value from perf_report where report_type = 'cmdline' + `,{}) + +export const queryCPuAbilityMaxData = (): Promise> => + query("queryCPuAbilityMaxData", + `select ifnull(max(total_load),0) as totalLoad, + ifnull(max(user_load),0) as userLoad, + ifnull(max(system_load),0) as systemLoad + from cpu_usage`) + +export const querySearchFunc = (search:string):Promise> => + query("querySearchFunc",` + select c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName + ,p.pid ,'func' as type from callstack c left join thread t on c.callid = t.id left join process p on t.ipid = p.id + left join trace_range r + where c.name like '%${search}%' and startTime > 0; + `,{$search:search}) \ No newline at end of file diff --git a/host/ide/src/trace/database/TempSql.ts b/host/ide/src/trace/database/TempSql.ts index a04efb3..7282e15 100644 --- a/host/ide/src/trace/database/TempSql.ts +++ b/host/ide/src/trace/database/TempSql.ts @@ -14,22 +14,30 @@ */ let temp_query_process = `create table temp_query_process as select - distinct process_view.pid as pid, - process_view.name as processName -from ( - select ipid, itid from sched_slice join thread_view using(itid) group by itid -) the_tracks -left join (select ipid, sum(dur) as total_dur - from sched_view join thread_view using(itid) - group by ipid -) using(ipid) -left join process_view using(ipid) -where pid is not null -order by - total_dur desc, - the_tracks.ipid, - processName, - the_tracks.itid; + distinct process_view.pid as pid, + process_view.name as processName + from ( + select + ipid, + itid + from + sched_slice join thread_view using(itid) + group by itid + ) the_tracks + left join + (select ipid, sum(dur) as total_dur + from sched_view join thread_view using(itid) + group by ipid + ) using(ipid) + left join + process_view using(ipid) + where + pid is not null + order by + total_dur desc, + the_tracks.ipid, + processName, + the_tracks.itid; ` let temp_query_cpu_data = `create table temp_query_cpu_data as with list as (SELECT IP.name as processName, @@ -195,63 +203,99 @@ select state, create index temp_get_tab_states_group_by_state_idx1 on temp_get_tab_states_group_by_state(start_ts,end_ts); ` let temp_get_tab_states_group_by_process_thread = `create table temp_get_tab_states_group_by_process_thread as -select IP.name as process, - IP.pid as processId, - A.name as thread, - a.tid as threadId, - B.dur as dur, - A.tid as tid, - (ts - TR.start_ts + dur) as end_ts, - (ts - TR.start_ts) as start_ts - from thread_state AS B - left join thread as A on B.itid = A.id - left join process AS IP on A.ipid = IP.id - left join trace_section AS TR - where pid not null and - B.dur > 0 and (ts - TR.start_ts)>0; + select + IP.name as process, + IP.pid as processId, + A.name as thread, + a.tid as threadId, + B.dur as dur, + A.tid as tid, + (ts - TR.start_ts + dur) as end_ts, + (ts - TR.start_ts) as start_ts + from + thread_state AS B + left join + thread as A on B.itid = A.id + left join + process AS IP on A.ipid = IP.id + left join + trace_section AS TR + where + pid not null + and + B.dur > 0 + and + (ts - TR.start_ts)>0; create index temp_get_tab_states_group_by_process_thread_idx0 on temp_get_tab_states_group_by_process_thread(process,processId,thread,threadId); create index temp_get_tab_states_group_by_process_thread_idx1 on temp_get_tab_states_group_by_process_thread(start_ts,end_ts); ` let temp_get_cpu_rate = `create table temp_get_cpu_rate as with cpu as ( - select cpu,ts,dur,(case when ro < 99 then ro else 99 end) as ro , - (case when ro < 99 then stime+ro*cell else stime + 99 * cell end) as st, - (case when ro < 99 then stime + (ro+1)*cell else etime end) as et + select + cpu, + ts, + dur, + (case when ro < 99 then ro else 99 end) as ro , + (case when ro < 99 then stime+ro*cell else stime + 99 * cell end) as st, + (case when ro < 99 then stime + (ro+1)*cell else etime end) as et from ( - select cpu,ts,A.dur,((ts+A.dur)-D.start_ts)/((D.end_ts-D.start_ts)/100) as ro,D.start_ts as stime,D.end_ts etime,(D.end_ts-D.start_ts)/100 as cell - from sched_slice A - left join trace_section D - left join thread B on A.itid = B.id - left join process C on B.ipid = C.id - where tid != 0 and (A.ts) between D.start_ts and D.end_ts)) -select cpu,ro, + select + cpu, + ts, + A.dur, + ((ts+A.dur)-D.start_ts)/((D.end_ts-D.start_ts)/100) as ro, + D.start_ts as stime, + D.end_ts etime, + (D.end_ts-D.start_ts)/100 as cell + from + sched_slice A + left join + trace_section D + left join + thread B on A.itid = B.id + left join + process C on B.ipid = C.id + where + tid != 0 + and (A.ts) + between D.start_ts and D.end_ts)) + select cpu,ro, sum(case when ts <= st and ts + dur <= et then (ts + dur - st) when ts <= st and ts + dur > et then et-st when ts > st and ts + dur <= et then dur when ts > st and ts + dur > et then et - ts end)/cast(et-st as float) as rate -from cpu -group by cpu,ro; + from cpu + group by cpu,ro; ` let temp_get_tab_thread_states = `create table temp_get_tab_thread_states as select - IP.name as process, - IP.pid as pid, - A.name as thread, - A.tid as tid, - B.state as state, - B.dur as dur, - (B.ts - TR.start_ts + ifnull(B.dur,0)) as end_ts, - (B.ts - TR.start_ts) as start_ts -from thread_state AS B -left join thread as A on A.id = B.itid -left join trace_section AS TR -left join process AS IP on IP.id=ipid -where (B.ts - TR.start_ts > 0); -create index temp_get_tab_thread_states_idx0 on temp_get_tab_thread_states(process,pid,thread,tid,state); -create index temp_get_tab_thread_states_idx1 on temp_get_tab_thread_states(start_ts,end_ts); + IP.name as process, + IP.pid as pid, + A.name as thread, + A.tid as tid, + B.state as state, + B.dur as dur, + (B.ts - TR.start_ts + ifnull(B.dur,0)) as end_ts, + (B.ts - TR.start_ts) as start_ts + from + thread_state AS B + left join + thread as A + on + A.id = B.itid + left join + trace_section AS TR + left join + process AS IP + on + IP.id=ipid + where + (B.ts - TR.start_ts > 0); + create index temp_get_tab_thread_states_idx0 on temp_get_tab_thread_states(process,pid,thread,tid,state); + create index temp_get_tab_thread_states_idx1 on temp_get_tab_thread_states(start_ts,end_ts); `; let temp_get_tab_slices = `create table temp_get_tab_slices as @@ -261,12 +305,16 @@ let temp_get_tab_slices = `create table temp_get_tab_slices as A.tid as tid, (C.ts - D.start_ts + C.dur) as end_ts, (C.ts - D.start_ts) as start_ts -from thread A,trace_section D -left join callstack C on A.id = C.callid -where C.ts not null + from + thread A, + trace_section D + left join + callstack C on A.id = C.callid + where + C.ts not null and c.dur >= 0 and (C.ts - D.start_ts > 0); -create index temp_get_tab_slices_idx0 on temp_get_tab_slices(name); + create index temp_get_tab_slices_idx0 on temp_get_tab_slices(name); `; let delete_callstack_binder_data = `DELETE FROM callstack WHERE dur<0 or name like 'binder%';`; diff --git a/host/ide/src/trace/database/TraceWorker.ts b/host/ide/src/trace/database/TraceWorker.ts index 559550f..7bfd502 100644 --- a/host/ide/src/trace/database/TraceWorker.ts +++ b/host/ide/src/trace/database/TraceWorker.ts @@ -45,7 +45,7 @@ self.onmessage = async (e: MessageEvent) => { if (e.data.action === "open") { await initWASM(); // @ts-ignore - self.postMessage({id: e.data.id, action: "open", ready: true, index: 0}); + self.postMessage({id: e.data.id, action: e.data.action, ready: true, index: 0}); let uint8Array = new Uint8Array(e.data.buffer); let p = Module._malloc(uint8Array.length); Module.HEAPU8.set(uint8Array, p); @@ -54,7 +54,7 @@ self.onmessage = async (e: MessageEvent) => { Module._free(p); if (r1 == -1) { // @ts-ignore - self.postMessage({id: e.data.id, action: "open", init: false, msg: "parse data error"}); + self.postMessage({id: e.data.id, action: e.data.action, init: false, msg: "parse data error"}); return; } // @ts-ignore @@ -64,11 +64,15 @@ self.onmessage = async (e: MessageEvent) => { self.postMessage({id: e.data.id, ready: true, index: index + 1}); }); // @ts-ignore - self.postMessage({id: e.data.id, action: "open", init: true, msg: "ok"}); + self.postMessage({id: e.data.id, action: e.data.action, init: true, msg: "ok"}); } else if (e.data.action === "exec") { let arr = query(e.data.name, e.data.sql, e.data.params); // @ts-ignore - self.postMessage({id: e.data.id, action: "exec", results: arr}); + self.postMessage({id: e.data.id, action: e.data.action, results: arr}); + } else if (e.data.action == "exec-buf") { + let arr = queryArrayBuffer(e.data.name, e.data.sql, e.data.params); + // @ts-ignore + self.postMessage({id: e.data.id, action: e.data.action, results: arr},[arr]); } } @@ -81,6 +85,30 @@ function createView(sql: string) { return res; } +function queryArrayBuffer(name: string, sql: string, params: any) { + if (params) { + Reflect.ownKeys(params).forEach((key: any) => { + if (typeof params[key] === "string") { + sql = sql.replace(new RegExp(`\\${key}`, "g"), `'${params[key]}'`); + } else { + sql = sql.replace(new RegExp(`\\${key}`, "g"), params[key]); + } + }); + } + let arr: Array = [] + let enc = new TextEncoder(); + let dec = new TextDecoder(); + let sqlPtr = Module._malloc(sql.length); + let outPtr = Module._malloc(REQ_BUF_SIZE); + Module.HEAPU8.set(enc.encode(sql), sqlPtr); + let res = Module._TraceStreamerSqlQuery(sqlPtr, sql.length, outPtr, REQ_BUF_SIZE); + let out = Module.HEAPU8.subarray(outPtr, outPtr + res); + Module._free(sqlPtr); + Module._free(outPtr); + out = out.buffer.slice(out.byteOffset, out.byteLength + out.byteOffset) + return out; +} + function query(name: string, sql: string, params: any) { if (params) { Reflect.ownKeys(params).forEach((key: any) => { @@ -97,13 +125,15 @@ function query(name: string, sql: string, params: any) { let sqlPtr = Module._malloc(sql.length); let outPtr = Module._malloc(REQ_BUF_SIZE); Module.HEAPU8.set(enc.encode(sql), sqlPtr); - let a = new Date().getTime(); let res = Module._TraceStreamerSqlQuery(sqlPtr, sql.length, outPtr, REQ_BUF_SIZE); let out = Module.HEAPU8.subarray(outPtr, outPtr + res); let str = dec.decode(out); Module._free(sqlPtr); Module._free(outPtr); str = str.substring(str.indexOf("\n") + 1); + if (!str) { + return [] + } let parse = JSON.parse(str); let columns = parse.columns; let values = parse.values; diff --git a/host/ide/src/trace/database/TraceWorkerRoot.ts b/host/ide/src/trace/database/TraceWorkerRoot.ts new file mode 100644 index 0000000..cbde9eb --- /dev/null +++ b/host/ide/src/trace/database/TraceWorkerRoot.ts @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +let worker:Worker; +self.onmessage = (e)=>{ + if (e.data.action === "open") { + worker = new Worker("TraceWorker.js") + worker.onmessage = (msg)=>{ + self.postMessage(msg.data); + } + worker.postMessage(e.data,[e.data.buffer]); + } else if (e.data.action === "exec") { + worker.postMessage(e.data); + } else if (e.data.action == "exec-buf") { + // @ts-ignore + worker.postMessage(e.data); + } +} +self.onerror = event => { + worker.terminate(); +} +self.onclose = () => { + worker.terminate(); +} \ No newline at end of file diff --git a/host/ide/src/trace/grpc/HiProfilerClient.ts b/host/ide/src/trace/grpc/HiProfilerClient.ts index c4bbdb0..2375eca 100644 --- a/host/ide/src/trace/grpc/HiProfilerClient.ts +++ b/host/ide/src/trace/grpc/HiProfilerClient.ts @@ -12,12 +12,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import {Address, ProfilerClient} from "./ProfilerClient.js"; export class HiProfilerClient { private _client: ProfilerClient; private _address: Address; + public constructor(clients: ProfilerClient, addr: Address) { + this._client = clients; + this._address = addr; + }; + get client(): ProfilerClient { return this._client; } @@ -34,13 +40,8 @@ export class HiProfilerClient { this._address = value; } - public constructor(clients: ProfilerClient, addr: Address) { - this._client = clients; - this._address = addr; - }; - - public getProfilerClient(): ProfilerClient{ - return this._client; + public getProfilerClient(): ProfilerClient { + return this._client; } public getCapabilities() { diff --git a/host/ide/src/trace/grpc/ProfilerClient.ts b/host/ide/src/trace/grpc/ProfilerClient.ts index 73f0199..25038dc 100644 --- a/host/ide/src/trace/grpc/ProfilerClient.ts +++ b/host/ide/src/trace/grpc/ProfilerClient.ts @@ -12,122 +12,107 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import * as path from 'path'; -const profilerServicePath = path.join(__dirname,'../proto', 'profiler_service.proto'); +const profilerServicePath = path.join(__dirname, '../proto', 'profiler_service.proto'); export class ProfilerClient { - // proto filePaths - private _filePaths: Array | undefined; - // client - private _client: any; - // profiler_proto - private _profiler_proto: any; - // ProfilerClient constructor - public constructor(address: Address) { - // load client port - let clientPort = this.loadAddress(address); - // load proto file - this.start(clientPort, profilerServicePath); - }; - - get filePaths(): Array | undefined { - return this._filePaths; - } - - set filePaths(value: Array | undefined) { - this._filePaths = value; - } - - get client(): any { - return this._client; - } - - set client(value: any) { - this._client = value; - } - - get profiler_proto(): any { - return this._profiler_proto; - } - - set profiler_proto(value: any) { - this._profiler_proto = value; - } - - start(address: string, filePath: string){ - // let loadPackage = proto_load.loadSync( - // filePath, - // { - // keepCase: true, - // longs: String, - // enums: String, - // defaults: true, - // oneofs: true - // } - // ); - // // profiler Proto - // this._profiler_proto = rpc.loadPackageDefinition(loadPackage); - // // get profilerProto service - // let profilerProto = this._profiler_proto.profiler; - // // client - // this._client = new profilerProto.IProfilerService('127.0.0.1:5555', rpc.credentials.createInsecure()); - } - - // Address - loadAddress(clientAddress: Address): string{ - return clientAddress.host + ':' + clientAddress.port; - }; - - public getProfilerClient(callback: any): any{ - return this._client; - }; - - public getCapabilities(callback: any) { - this._client. - this._client.getCapabilities(callback); - callback(); - }; - - public createSession(callback: any) { - this._client.createSession(callback); - callback(); - }; - - public startSession(callback: any) { - this._client.startSession(callback); - callback(); - }; - - public stopSession(callback: any) { - this._client.stopSession(callback); - callback(); - }; - - public destroySession(callback: any) { - this._client.destroySession(callback); - callback(); - }; - - public keepSession(callback: any) { - this._client.keepSession(callback); - callback(); - }; - - public shutdown(): void { - - }; - - public getChannel() { - return this._client.channelInterpretation; - }; + // proto filePaths + private _filePaths: Array | undefined; + // client + private _client: any; + // profiler_proto + private _profiler_proto: any; + + // ProfilerClient constructor + public constructor(address: Address) { + // load client port + let clientPort = this.loadAddress(address); + // load proto file + this.start(clientPort, profilerServicePath); + }; + + get filePaths(): Array | undefined { + return this._filePaths; + } + + set filePaths(value: Array | undefined) { + this._filePaths = value; + } + + get client(): any { + return this._client; + } + + set client(value: any) { + this._client = value; + } + + get profiler_proto(): any { + return this._profiler_proto; + } + + set profiler_proto(value: any) { + this._profiler_proto = value; + } + + start(address: string, filePath: string) { + } + + // Address + loadAddress(clientAddress: Address): string { + return clientAddress.host + ':' + clientAddress.port; + }; + + public getProfilerClient(callback: any): any { + return this._client; + }; + + public getCapabilities(callback: any) { + this._client.this._client.getCapabilities(callback); + callback(); + }; + + public createSession(callback: any) { + this._client.createSession(callback); + callback(); + }; + + public startSession(callback: any) { + this._client.startSession(callback); + callback(); + }; + + public stopSession(callback: any) { + this._client.stopSession(callback); + callback(); + }; + + public destroySession(callback: any) { + this._client.destroySession(callback); + callback(); + }; + + public keepSession(callback: any) { + this._client.keepSession(callback); + callback(); + }; + + public shutdown(): void { + + }; + + public getChannel() { + return this._client.channelInterpretation; + }; } export interface Address { - // port - port: string | number; + // port + port: string | number; - // host - host?: string | number; + // host + host?: string | number; } diff --git a/host/ide/src/trace/grpc/ProfilerController.ts b/host/ide/src/trace/grpc/ProfilerController.ts index bbc186a..941709d 100644 --- a/host/ide/src/trace/grpc/ProfilerController.ts +++ b/host/ide/src/trace/grpc/ProfilerController.ts @@ -12,28 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export class ClientContainer { - // private _credentials: rpc.ChannelCredentials | undefined; - // private _clients: { service: any, client?: rpc.Client, target: any }[] = []; private _port: string | number | undefined; private _host: string | undefined; - /* get clients(): { service: any; client?: rpc.Client; target: any }[] { - return this._clients; - } - - set clients(value: { service: any; client?: rpc.Client; target: any }[]) { - this._clients = value; - }*/ - - /* get credentials(): rpc.ChannelCredentials | undefined { - return this._credentials; - } - - set credentials(value: rpc.ChannelCredentials | undefined) { - this._credentials = value; - }*/ - get port(): string | number | undefined { return this._port; } @@ -51,21 +34,6 @@ export class ClientContainer { } public registryClient(target: any, path: string) { - // let packageDefinition = proto_load.loadSync(path, { - // keepCase: true, - // longs: String, - // enums: String, - // defaults: true, - // oneofs: true - // }); - // let protoDescriptor = rpc.loadPackageDefinition(packageDefinition); - // - // const packages = Object.keys(protoDescriptor); - // for (let packageKey of packages) { - // for (let key in protoDescriptor[packageKey]) { - // - // } - // } }; public start() { @@ -74,23 +42,15 @@ export class ClientContainer { } private loadSettings() { - let { host, port} = SettingRegistry.settings; + let {host, port} = SettingRegistry.settings; this._host = host; this._port = port; } private _registryClient() { - // for (let clientContainer of this._clients) { - // let client: rpc.Client = new clientContainer.service( - // `${this.host}:${this.port}`, - // this.credentials - // ); - // clientContainer.client = client; - // } } } - export class SettingRegistry { static settings: Settings; diff --git a/host/ide/test/base-ui/checkbox/LitCheckBox.test.ts b/host/ide/test/base-ui/checkbox/LitCheckBox.test.ts index 3512ce0..79972fb 100644 --- a/host/ide/test/base-ui/checkbox/LitCheckBox.test.ts +++ b/host/ide/test/base-ui/checkbox/LitCheckBox.test.ts @@ -57,4 +57,105 @@ describe('checkBox Test', ()=>{ litCheckBox.checked = false expect(litCheckBox.checked).toBeFalsy(); }); + it('checkBoxTest06', function () { + document.body.innerHTML = ` + ` + let litCheckBox = new LitCheckBox(); + litCheckBox.indeterminate = false + expect(litCheckBox.indeterminate).toBeFalsy(); + }); + + it('checkBoxTest07', function () { + document.body.innerHTML = ` + ` + let litCheckBox = new LitCheckBox(); + litCheckBox.indeterminate = true + expect(litCheckBox.indeterminate).toBeTruthy(); + }); + + it('checkBoxTest08', function () { + let litCheckBox = new LitCheckBox(); + expect(litCheckBox.initHtml()).toMatchInlineSnapshot(` +" + + + + " +`); + }); }) \ No newline at end of file diff --git a/host/ide/test/base-ui/checkbox/LitCheckBoxWithText.test.ts b/host/ide/test/base-ui/checkbox/LitCheckBoxWithText.test.ts index 271b243..5d4b5bb 100644 --- a/host/ide/test/base-ui/checkbox/LitCheckBoxWithText.test.ts +++ b/host/ide/test/base-ui/checkbox/LitCheckBoxWithText.test.ts @@ -55,18 +55,65 @@ describe('checkBoxWithText Test', ()=>{ it('checkBoxWithTextTest05', function () { let litCheckBoxWithText = new LitCheckBoxWithText(); - expect(litCheckBoxWithText.lowerlimit).toEqual(undefined); + expect(litCheckBoxWithText.lowerLimit).toEqual("0"); }); it('checkBoxWithTextTest05', function () { let litCheckBoxWithText = new LitCheckBoxWithText(); - litCheckBoxWithText.lowerlimit = "111" - expect(litCheckBoxWithText.lowerlimit).toEqual("111"); + litCheckBoxWithText.lowerLimit = "111" + expect(litCheckBoxWithText.lowerLimit).toEqual("111"); }); it('checkBoxWithTextTest05', function () { let litCheckBoxWithText = new LitCheckBoxWithText(); - litCheckBoxWithText.uplimit = "111" - expect(litCheckBoxWithText.uplimit).toEqual("111"); + litCheckBoxWithText.upLimit = "111" + expect(litCheckBoxWithText.upLimit).toEqual("111"); + }); + + it('checkBoxWithTextTest05', function () { + let litCheckBoxWithText = new LitCheckBoxWithText(); + expect(litCheckBoxWithText.initHtml()).toMatchInlineSnapshot(` +" + + + + + " +`); + }); + + it('checkBoxWithTextTest06', function () { + let litCheckBoxWithText = new LitCheckBoxWithText(); + expect(litCheckBoxWithText.attributeChangedCallback("checked")).toBeUndefined(); + }); + + it('checkBoxWithTextTest07', function () { + let litCheckBoxWithText = new LitCheckBoxWithText(); + expect(litCheckBoxWithText.attributeChangedCallback("text")).toBeUndefined(); + }); + + it('checkBoxWithTextTest08', function () { + let litCheckBoxWithText = new LitCheckBoxWithText(); + expect(litCheckBoxWithText.attributeChangedCallback("lowerLimit")).toBeUndefined(); + }); + + it('checkBoxWithTextTest09', function () { + let litCheckBoxWithText = new LitCheckBoxWithText(); + expect(litCheckBoxWithText.attributeChangedCallback("upLimit")).toBeUndefined(); }); }) \ No newline at end of file diff --git a/host/ide/test/base-ui/checkbox/LitCheckGroup.test.ts b/host/ide/test/base-ui/checkbox/LitCheckGroup.test.ts index 57bd9df..02ce41c 100644 --- a/host/ide/test/base-ui/checkbox/LitCheckGroup.test.ts +++ b/host/ide/test/base-ui/checkbox/LitCheckGroup.test.ts @@ -36,4 +36,33 @@ describe('LitCheckGroup Test', ()=>{ expect(litCheckGroup.value).toEqual([]); }); + it('LitCheckGroupTest03', function () { + let litCheckGroup = new LitCheckGroup(); + expect(litCheckGroup.initHtml()).toMatchInlineSnapshot(` +" + + " +`); + }); + }) \ No newline at end of file diff --git a/host/ide/test/base-ui/icon/LitIcon.test.ts b/host/ide/test/base-ui/icon/LitIcon.test.ts index dd3ab13..63aca5d 100644 --- a/host/ide/test/base-ui/icon/LitIcon.test.ts +++ b/host/ide/test/base-ui/icon/LitIcon.test.ts @@ -56,4 +56,43 @@ describe("testLitIcon Test", () => { litIcon.name = "sss" expect(litIcon.name).toBe("sss") }); + + it('testLitIcon07', () => { + let litIcon = new LitIcon(); + expect(litIcon.color = "#FFF").not.toBeUndefined(); + }); + + it('testLitIcon07', () => { + let litIcon = new LitIcon(); + expect(litIcon.initHtml()).toMatchInlineSnapshot(` +" + + + + + " +`); + }); }) diff --git a/host/ide/test/base-ui/menu/LitMainMenu.test.ts b/host/ide/test/base-ui/menu/LitMainMenu.test.ts index dc0fc18..82e6963 100644 --- a/host/ide/test/base-ui/menu/LitMainMenu.test.ts +++ b/host/ide/test/base-ui/menu/LitMainMenu.test.ts @@ -56,4 +56,80 @@ describe("LitMainMenu Test", () => { ] expect(litMainMenu.menus.length).toBe(1) }); + + it('LitMainMenu03', () => { + let litMainMenu = new LitMainMenu(); + expect(litMainMenu.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + +
      +
      +
      + +
      +
      +
      + " +`); + }); }) diff --git a/host/ide/test/base-ui/menu/LitMainMenuGroup.test.ts b/host/ide/test/base-ui/menu/LitMainMenuGroup.test.ts index 5c87052..915a9fc 100644 --- a/host/ide/test/base-ui/menu/LitMainMenuGroup.test.ts +++ b/host/ide/test/base-ui/menu/LitMainMenuGroup.test.ts @@ -36,9 +36,97 @@ describe("litMainMenuGroup Test", () => { expect(litMainMenuGroup.collapsed).toBeTruthy() }); - it('litMainMenuGroup03', () => { + it('litMainMenuGroup04', () => { let litMainMenuGroup = new LitMainMenuGroup(); litMainMenuGroup.collapsed = false expect(litMainMenuGroup.collapsed).toBeFalsy() }); + + it('litMainMenuGroup06', () => { + let litMainMenuGroup = new LitMainMenuGroup(); + expect(litMainMenuGroup.radius).toBeFalsy() + }); + + it('litMainMenuGroup07', () => { + let litMainMenuGroup = new LitMainMenuGroup(); + expect(litMainMenuGroup.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + + " +`); + }); + + it('litMainMenuGroup04', () => { + let litMainMenuGroup = new LitMainMenuGroup(); + litMainMenuGroup.nocollapsed = true + expect(litMainMenuGroup.nocollapsed).toBeTruthy() + }); + + it('litMainMenuGroup04', () => { + let litMainMenuGroup = new LitMainMenuGroup(); + litMainMenuGroup.nocollapsed = false + expect(litMainMenuGroup.nocollapsed).toBeFalsy() + }); + + it('litMainMenuGroup05', () => { + let litMainMenuGroup = new LitMainMenuGroup(); + expect(litMainMenuGroup.collapsed).toBeFalsy() + }); }) diff --git a/host/ide/test/base-ui/menu/LitMainMenuItem.test.ts b/host/ide/test/base-ui/menu/LitMainMenuItem.test.ts index 4dc93a1..45cf99f 100644 --- a/host/ide/test/base-ui/menu/LitMainMenuItem.test.ts +++ b/host/ide/test/base-ui/menu/LitMainMenuItem.test.ts @@ -51,4 +51,100 @@ describe("litMainMenuItem Test", () => { litMainMenuItem.title ="test03" expect(litMainMenuItem.title).toEqual("test03") }); + + it('litMainMenuItem06', () => { + document.body.innerHTML = ` + ` + let litMainMenuItem = new LitMainMenuItem(); + expect(litMainMenuItem.isFile()).toBeFalsy(); + }); + + it('litMainMenuItem07', () => { + document.body.innerHTML = ` + ` + let litMainMenuItem = new LitMainMenuItem(); + litMainMenuItem.disabled = true; + expect(litMainMenuItem.disabled).toBeTruthy(); + }); + + it('litMainMenuItem08', () => { + document.body.innerHTML = ` + ` + let litMainMenuItem = new LitMainMenuItem(); + litMainMenuItem.disabled = false; + expect(litMainMenuItem.disabled).toBeFalsy(); + }); + + it('litMainMenuItem09', () => { + let litMainMenuItem = new LitMainMenuItem(); + expect(litMainMenuItem.initHtml()).toMatchInlineSnapshot(` +" + + + + " +`); + }); }) diff --git a/host/ide/test/base-ui/popover/LitPopContent.test.ts b/host/ide/test/base-ui/popover/LitPopContent.test.ts index b21ca9b..83288e4 100644 --- a/host/ide/test/base-ui/popover/LitPopContent.test.ts +++ b/host/ide/test/base-ui/popover/LitPopContent.test.ts @@ -49,4 +49,46 @@ describe("LitPopCont Test", () => { litPopContent.name = "11" expect(litPopContent.name).toEqual("11") }); + + it('LitPopCont05', () => { + let litPopContent = new LitPopContent(); + expect(litPopContent.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + " +`); + }); + + it('LitPopCont06', () => { + let litPopContent = new LitPopContent(); + expect(litPopContent.attributeChangedCallback("open","",null || "false")).toBeUndefined() + }); }) diff --git a/host/ide/test/base-ui/popover/LitPopover.test.ts b/host/ide/test/base-ui/popover/LitPopover.test.ts index a8be4f4..0b9966f 100644 --- a/host/ide/test/base-ui/popover/LitPopover.test.ts +++ b/host/ide/test/base-ui/popover/LitPopover.test.ts @@ -93,4 +93,330 @@ describe("LitPopover Test", () => { }] expect(litPopover.select).toEqual(["# Samples"]) }); + + it('LitPopover10', () => { + let litPopover = new LitPopover(); + litPopover.type = "multiple-text" + litPopover.title = "tee" + litPopover.dataSource = [{ + text: "# Samples", + isSelected: true + }] + expect(litPopover.trigger).not.toBeUndefined(); + }); + + it('LitPopover10', () => { + let litPopover = new LitPopover(); + litPopover.type = "multiple-text" + litPopover.title = "tee" + litPopover.dataSource = [{ + text: "# Samples", + isSelected: true + }] + expect(litPopover.limit).toEqual({textLowerLimit:"0",textUpperLimit:"∞"}); + }); + + it('LitPopover11', () => { + let litPopover = new LitPopover(); + litPopover.type = "multiple-text" + litPopover.title = "tee" + litPopover.dataSource = [{ + text: "# Samples", + isSelected: false + }] + expect(litPopover.limit).toEqual({textLowerLimit:"0",textUpperLimit:"∞"}); + }); + + it('LitPopover14', () => { + let litPopover = new LitPopover(); + litPopover.type = "data-ming" + litPopover.title = "tee" + litPopover.dataSource = [{ + text: "# Samples", + isSelected: false + }] + expect(litPopover.limit).toEqual({textLowerLimit:"",textUpperLimit:""}); + }); + + it('LitPopover12', () => { + let litPopover = new LitPopover(); + expect(litPopover.initHtml()).toMatchInlineSnapshot(` +" + + + " +`); + }); + + it('LitPopover13', () => { + let litPopover = new LitPopover(); + expect(litPopover.connectedCallback()).toBeUndefined() + }); }) diff --git a/host/ide/test/base-ui/popover/LitPopoverV.test.ts b/host/ide/test/base-ui/popover/LitPopoverV.test.ts new file mode 100644 index 0000000..dd9c978 --- /dev/null +++ b/host/ide/test/base-ui/popover/LitPopoverV.test.ts @@ -0,0 +1,441 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {LitPopover} from "../../../dist/base-ui/popover/LitPopoverV.js"; + +describe("LitPopoverV Test", () => { + it('LitPopoverV01', () => { + let litPopover = new LitPopover(); + expect(litPopover).not.toBeUndefined() + expect(litPopover).not.toBeNull() + }); + it('LitPopoverV02', () => { + let litPopoverV = new LitPopover(); + expect(litPopoverV.visible).toBe("false"); + }); + it('LitPopoverV03', () => { + let litPopoverV = new LitPopover(); + litPopoverV.visible = true; + expect(litPopoverV.visible).toBe("true"); + }); + it('LitPopoverV04', () => { + let litPopoverV = new LitPopover(); + litPopoverV.visible = false; + expect(litPopoverV.visible).toBe("false"); + }); + it('LitPopoverV05', () => { + let litPopoverV = new LitPopover(); + expect(litPopoverV.trigger).toBe("hover"); + }); + it('LitPopoverV06', () => { + let litPopoverV = new LitPopover(); + litPopoverV.trigger = "click"; + expect(litPopoverV.trigger).toBe("click"); + }); + + it('LitPopoverV07', () => { + let litPopoverV = new LitPopover(); + litPopoverV.title = "test"; + expect(litPopoverV.title).toBe("test"); + }); + + it('LitPopoverV08', () => { + let litPopoverV = new LitPopover(); + litPopoverV.width = "10px"; + expect(litPopoverV.width).toBe("10px"); + }); + + it('LitPopoverV09', () => { + let litPopoverV = new LitPopover(); + litPopoverV.width = "10px"; + expect(litPopoverV.width).toBe("10px"); + }); + + it('LitPopoverV10', () => { + let litPopoverV = new LitPopover(); + expect(litPopoverV.width).toBe("max-content"); + }); + + + it('LitPopoverV11', () => { + let litPopoverV = new LitPopover(); + expect(litPopoverV.haveRadio).toBeNull(); + }); + + it('LitPopoverV12', () => { + document.body.innerHTML = `` + let popver = document.querySelector("#litpop") as LitPopover; + expect(popver.haveRadio).toBeNull(); + }); + + it('LitPopoverV13', () => { + let litPopoverV = new LitPopover(); + expect(litPopoverV.initHtml()).toMatchInlineSnapshot(` +" + + +
      +
      null
      +
      +
      + + " +`); + }); +}); \ No newline at end of file diff --git a/host/ide/test/base-ui/progress-bar/LitProgressBar.test.ts b/host/ide/test/base-ui/progress-bar/LitProgressBar.test.ts index 0f2f37d..5cd62a6 100644 --- a/host/ide/test/base-ui/progress-bar/LitProgressBar.test.ts +++ b/host/ide/test/base-ui/progress-bar/LitProgressBar.test.ts @@ -21,7 +21,58 @@ describe('LitProgressBar Test', ()=>{ litProgressBar.loading = '' litProgressBar.loading = 'load' - it('LitProgressBarTest03', ()=>{ + it('LitProgressBarTest01', ()=>{ expect(litProgressBar.loading).toBeTruthy(); }) + + it('LitProgressBarTest02', ()=>{ + expect(litProgressBar.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +
      +
      + " +`); + }) }) diff --git a/host/ide/test/base-ui/radiobox/LitRadioBox.test.ts b/host/ide/test/base-ui/radiobox/LitRadioBox.test.ts index 7bd211a..c41a42e 100644 --- a/host/ide/test/base-ui/radiobox/LitRadioBox.test.ts +++ b/host/ide/test/base-ui/radiobox/LitRadioBox.test.ts @@ -37,8 +37,175 @@ describe('LitRadioBox Test', ()=>{ expect(litRadioBox.value).toBe('value'); }) + it('LitRadioBoxTest03', ()=>{ + expect(litRadioBox.initHtml()).toMatchInlineSnapshot(` +" + + + + " +`); + }) + it('litRadioGroupTest01', ()=>{ let isReturn = litRadioGroup.value.length == 0 expect(isReturn).toBeTruthy(); }) + + it('litRadioGroupTest02', ()=>{ + expect(litRadioGroup.initHtml()).toMatchInlineSnapshot(` +" + + " +`); + }) }) diff --git a/host/ide/test/base-ui/select/LitSelect.test.ts b/host/ide/test/base-ui/select/LitSelect.test.ts new file mode 100644 index 0000000..5d8e0be --- /dev/null +++ b/host/ide/test/base-ui/select/LitSelect.test.ts @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {LitButton, LitSelect} from "../../../dist/base-ui/select/LitSelect.js"; + +describe('LitSelect Test', ()=>{ + + it('LitSelectTest01', function () { + let litSelect = new LitSelect(); + expect(litSelect).not.toBeUndefined() + }); + + it('LitSelectTest02', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + expect(select).not.toBeUndefined() + }); + + it('LitSelectTest03', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.value = "value" + expect(select.value).toBe('value'); + }); + + it('LitSelectTest04', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.border = "value" + expect(select.border).toBe('true'); + }); + it('LitSelectTest05', function () { + let lit = new LitSelect(); + expect(lit.border).toBe('true'); + }); + it('LitSelectTest06', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.listHeight = true; + expect(select.listHeight).toBe('true'); + }); + + it('LitSelectTest07', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.defaultValue = true; + expect(select.defaultValue).toBe('true'); + }); + + it('LitSelectTest08', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.loading = 1 + expect(select.loading).toBe(true); + }); + + it('LitSelectTest09', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + expect(select.isMultiple()).toBe(false); + }); + + it('LitSelectTest10', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.inputElement.value = "3333"; + select.click(); + expect(select.focused).toBe(true); + }); + + it('LitSelectTest11', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.clear() + expect(select.inputElement.value).toBe(""); + }); + + it('LitSelectTest12', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + expect(select.reset()).toBeUndefined(); + }); + + it('LitSelectTest13', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + let newTag =select.newTag("111","111"); + expect(newTag.text).toBe("111"); + }); + + it('LitSelectTest14', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.dataSource = [{key:"111"}] + let cleart = select.clearElement as HTMLElement; + cleart.click() + expect(select.inputElement.value).toBe(""); + + }); + + it('LitSelectTest15', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + let input = select.inputElement as HTMLInputElement; + input.value = "11" + expect(select.inputElement.value).toBe("11"); + + }); + + it('LitSelectTest16', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.dataSource = [{key:"111"}] + expect(select.inputElement.value).toBe(""); + + }); + + it('LitSelectTest17', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.placeholder = true; + expect(select.placeholder).toBe('true'); + }); + it('LitSelectTest20', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.rounded = 1 + expect(select.rounded).toBe(true); + }); + + it('LitSelectTest21', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.placement = 1 + expect(select.placement).toBe("1"); + }); + + it('LitSelectTest18', function () { + let litSelect = new LitSelect(); + expect(litSelect.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +
      + + + + +
      +
      + + +
      + " +`); + }); + + it('LitSelectTest23', function () { + document.body.innerHTML = `` + let select = document.querySelector("#litSelect") as LitSelect; + select.canInsert = true + expect(select.canInsert).toBeTruthy(); + }); +}) diff --git a/host/ide/test/base-ui/select/LitSelectOption.test.ts b/host/ide/test/base-ui/select/LitSelectOption.test.ts new file mode 100644 index 0000000..8096114 --- /dev/null +++ b/host/ide/test/base-ui/select/LitSelectOption.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {LitSelectOption} from "../../../dist/base-ui/select/LitSelectOption.js"; + +describe('LitSelectOption Test', ()=> { + it('LitSelectOptionTest01', function () { + document.body.innerHTML = ""; + let inner = document.querySelector("#aa") as LitSelectOption; + expect(inner).not.toBeUndefined() + }); + it('LitSelectOptionTest03 ', function () { + expect(LitSelectOption.adoptedCallback).toBeUndefined() + + }); + + + it('LitSelectOption02', function () { + let litSelect = new LitSelectOption(); + expect(litSelect.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + + + " +`); + }); +}); \ No newline at end of file diff --git a/host/ide/test/base-ui/slider/LitSlider.test.ts b/host/ide/test/base-ui/slider/LitSlider.test.ts index d05e457..b866078 100644 --- a/host/ide/test/base-ui/slider/LitSlider.test.ts +++ b/host/ide/test/base-ui/slider/LitSlider.test.ts @@ -26,10 +26,6 @@ describe('LitSlider Test', ()=>{ litSliderPanel.percent = 'percent' litSliderPanel.resultUnit = 'resultUnit' - litSliderPanel.litSlider = jest.fn(()=> true) - - litSliderPanel.sliderStyle = 'sliderStyle' - it('LitSliderTest01', ()=>{ expect(litSliderPanel.disabledX).toEqual(''); }) @@ -59,6 +55,10 @@ describe('LitSlider Test', ()=>{ }) it('LitSliderTest08', ()=>{ + litSliderPanel.litSliderStyle = jest.fn(()=>true) + litSliderPanel.litSliderStyle.minRange = jest.fn(()=>2) + litSliderPanel.litSliderStyle.maxRange = jest.fn(()=>1) + litSliderPanel.litSliderStyle.stepSize = jest.fn(()=>1) expect(litSliderPanel.renderDefaultSlider()).toBeUndefined(); }) @@ -67,10 +67,119 @@ describe('LitSlider Test', ()=>{ }) it('LitSliderTest10', ()=>{ - litSliderPanel.litSlider.removeEventListener = jest.fn(()=> true) - litSliderPanel.litSlider.removeEventListener = jest.fn(()=> true) - litSliderPanel.litSliderButton = jest.fn(()=> true) - litSliderPanel.litSliderButton.removeEventListener = jest.fn(()=> true) expect(litSliderPanel.disconnectedCallback()).toBeUndefined(); }) + + it('LitSliderTest11', ()=>{ + expect(litSliderPanel.disconnectedCallback()).toBeUndefined(); + }) + + it('LitSliderTest12', function () { + expect(litSliderPanel.attributeChangedCallback("percent","","0%" || null)).toBeUndefined(); + }); + + it('LitSliderTest13', function () { + expect(litSliderPanel.initHtml()).toMatchInlineSnapshot(` +" + + +
      + +
      + " +`); + }); }) diff --git a/host/ide/test/base-ui/switch/LitSwitch.test.ts b/host/ide/test/base-ui/switch/LitSwitch.test.ts index c0094b0..fbc0144 100644 --- a/host/ide/test/base-ui/switch/LitSwitch.test.ts +++ b/host/ide/test/base-ui/switch/LitSwitch.test.ts @@ -20,6 +20,8 @@ describe('LitSwitch Test', ()=>{ let litSwitch = new LitSwitch(); litSwitch.checked = true litSwitch.checked = false + litSwitch.disabled = true + litSwitch.disabled =false it('LitSwitchTest01', ()=>{ expect(litSwitch.name).toBeNull(); @@ -53,4 +55,78 @@ describe('LitSwitch Test', ()=>{ it('LitSwitchTest08', ()=>{ expect(litSwitch.attributeChangedCallback('checked', 'disabled', null)).toBeUndefined() }) + + it('LitSwitchTest09', ()=>{ + expect(litSwitch.initHtml()).toMatchInlineSnapshot(` +" + + + " +`); + }) }) diff --git a/host/ide/test/base-ui/table/LitTable.test.ts b/host/ide/test/base-ui/table/LitTable.test.ts index b011898..299fd49 100644 --- a/host/ide/test/base-ui/table/LitTable.test.ts +++ b/host/ide/test/base-ui/table/LitTable.test.ts @@ -15,8 +15,9 @@ // @ts-ignore import {LitTable} from "../../../dist/base-ui/table/lit-table.js"; +import {LitTableColumn} from "../../../src/base-ui/table/lit-table-column.js"; -describe('LitTable Test', ()=>{ +describe('LitTable Test', () => { let litTable = new LitTable(); litTable.selectable = true litTable.selectable = false @@ -27,59 +28,389 @@ describe('LitTable Test', ()=>{ litTable.dataSource = [{ id: 1, name: 'name' - },{ + }, { id: 2, name: 'nameValue' }] + const td = { + style: { + position: 'sticky', + left: '0px', + right: '0px', + boxShadow: '3px 0px 5px #33333333' + } + } + const placement = "left" - JSON.parse = jest.fn(()=>[['children', 'father'], ['children', 'father']]) + const element = { + style: { + display: 'none', + transform: 'translateY' + }, + childNodes:{forEach:true}, + onclick: 1 + } + const rowObject = { + children: { + length: 1, + }, + data: [{isSelected:undefined}], + depth: 1, + top: 1 + } + const firstElement = { + style: { + display: 'none', + paddingLeft: "", + transform: 'translateY' - litTable.columns = litTable.columns || jest.fn(()=>true) - litTable.ds = jest.fn(()=>[{ + }, + innerHTML: "", + title: "", + firstChild: null, + onclick: 1 + + }||undefined + + JSON.parse = jest.fn(() => [['children', 'father'], ['children', 'father']]) + + litTable.columns = litTable.columns || jest.fn(() => true) + litTable.ds = jest.fn(() => [{ id: 1, name: 'name' - },{ + }, { id: 2, name: 'nameValue' }]) - litTable.tbodyElement = jest.fn(()=> ({ + litTable.tbodyElement = jest.fn(() => ({ innerHTML: '' })) - litTable.tableColumns = jest.fn(()=>[]) + litTable.tableColumns = jest.fn(() => []) - litTable.tableColumns.forEach = jest.fn(()=>[]) + litTable.tableColumns.forEach = jest.fn(() => []) - it('LitTableTest01', ()=>{ + it('LitTableTest01', () => { expect(litTable.adoptedCallback()).toBeUndefined(); }) - it('LitTableTest02', ()=>{ - litTable.ds.forEach = jest.fn(()=> true) + it('LitTableTest02', () => { + litTable.ds.forEach = jest.fn(() => true) expect(litTable.renderTable()).toBeUndefined(); }) - // it('LitTableTest03', ()=>{ - // litTable.parentNode = jest.fn(()=> true) - // litTable.parentNode.append = jest.fn(()=> true) - // expect(litTable.renderTreeTable()).toBeUndefined(); - // }) - - it('LitTableTest04', ()=>{ + it('LitTableTest04', () => { litTable.switch = document.querySelector("#switch") as HTMLInputElement; expect(litTable.connectedCallback()).toBeUndefined() }) - it('LitTableTest05', ()=>{ + it('LitTableTest05', () => { let rowLength = litTable.getCheckRows().length == 0; expect(rowLength).toBeTruthy() }) - it('LitTableTest06', ()=>{ - expect(litTable.deleteRowsCondition(()=>{ + it('LitTableTest06', () => { + expect(litTable.deleteRowsCondition(() => { return true })).toBeUndefined() }) + + it('LitTableTest07', () => { + expect(litTable.selectable).not.toBeUndefined() + }) + + it('LitTableTest08', () => { + litTable.selectable = true + expect(litTable.selectable).toBeTruthy() + }) + + it('LitTableTest09', () => { + expect(litTable.scrollY).not.toBeUndefined() + }) + + it('LitTableTest10', () => { + expect(litTable.dataSource).not.toBeUndefined() + }) + + it('LitTableTest11', () => { + expect(litTable.recycleDataSource).not.toBeUndefined() + }) + + it('LitTableTest12', () => { + expect(litTable.fixed(td, placement)).toBeUndefined() + }) + + it('LitTableTest13', () => { + expect(litTable.fixed(td, "right")).toBe(undefined) + }) + + it('LitTableTest14', () => { + expect(litTable.meauseElementHeight()).toBe(27) + }) + + it('LitTableTest15', () => { + expect(litTable.meauseTreeElementHeight()).toBe(27) + }) + + it('LitTableTest16', () => { + document.body.innerHTML = "" + let table = document.querySelector("#tab") as LitTable; + let htmlElement = document.createElement('lit-table-column') as LitTableColumn; + htmlElement.setAttribute('title', "1"); + htmlElement.setAttribute('data-index', "1"); + htmlElement.setAttribute('key', "1"); + htmlElement.setAttribute('align', 'flex-start'); + htmlElement.setAttribute('height', '32px'); + table!.appendChild(htmlElement); + setTimeout(() => { + table.recycleDataSource = [{ + id: 1, + name: 'name' + }, { + id: 2, + name: 'nameValue' + }] + expect(table.meauseTreeElementHeight()).toBe(27) + }, 20) + }) + + it('LitTableTest17', () => { + expect(litTable.shadowRoot.innerHTML).toMatchInlineSnapshot(` +" + + + +
      +
      +
      +
      +
      +
      +
      + " +`); + }) + + it('LitTableTest18', () => { + expect(litTable.createExpandBtn({expanded:false})).not.toBeUndefined() + }) + + it('LitTableTest19', () => { + expect(litTable.reMeauseHeight()).toBeUndefined(); + }) + + it('LitTableTest20', () => { + const rowData= { + data:[{ + isSelected:undefined + }], + } + litTable.columns.forEach = jest.fn(()=>true) + expect(litTable.createNewTableElement(rowData)).not.toBeUndefined(); + }) + + it('LitTableTest21', () => { + expect(litTable.freshCurrentLine(element)).toBeUndefined(); + }) + + it('LitTableTest22', () => { + litTable.recycleDs.length = 1 + litTable.setCurrentSelection = jest.fn(()=>true) + expect(litTable.scrollToData()).toBeUndefined(); + }) + + it('LitTableTest23', () => { + expect(litTable.expandList()).toBeUndefined(); + }) + + it('LitTableTest24', () => { + expect(litTable.clearAllSelection()).toBeUndefined(); + }) + + it('LitTableTest25', () => { + expect(litTable.dispatchRowClickEvent({data:{isSelected:""}})).toBeUndefined(); + }) + + it('LitTableTest26', () => { + litTable.treeElement = jest.fn(()=>undefined) + litTable.treeElement.children = jest.fn(()=>[1]) + litTable.columns.forEach = jest.fn(()=>true) + litTable.treeElement.lastChild= jest.fn(()=>true) + litTable.treeElement.lastChild.style= jest.fn(()=>true) + expect(litTable.createNewTreeTableElement({data:""})).not.toBeUndefined(); + }); + + it('LitTableTest27', () => { + litTable.tableElement = jest.fn(()=>undefined) + litTable.tableElement.scrollTop = jest.fn(()=>1) + expect(litTable.move1px()).toBeUndefined(); + }) + + it('LitTableTest28', () => { + document.body.innerHTML = `` + let litTable = document.querySelector('#aaa') as LitTable + expect(litTable.renderTreeTable()).toBeUndefined(); + }) + + it('LitTableTest29', () => { + document.body.innerHTML = `` + let litTable = document.querySelector('#aaa') as LitTable + expect(litTable.setMouseIn(true,[])).toBeUndefined(); + }) + + it('LitTableTest30', () => { + document.body.innerHTML = `` + let litTable = document.querySelector('#aaa') as LitTable + const data = { + isSelected:true + } + expect(litTable.setCurrentSelection(data)).toBeUndefined(); + }) }) + diff --git a/host/ide/test/base-ui/table/LitTableColumn.test.ts b/host/ide/test/base-ui/table/LitTableColumn.test.ts index 6a1fc57..3c4b6d7 100644 --- a/host/ide/test/base-ui/table/LitTableColumn.test.ts +++ b/host/ide/test/base-ui/table/LitTableColumn.test.ts @@ -27,4 +27,18 @@ describe('LitTableGroup Test', ()=>{ it('LitTableGroupTest02', ()=>{ expect(litTableColumn.connectedCallback()).toBeUndefined(); }) + + it('LitTableGroupTest03', ()=>{ + expect(litTableColumn.shadowRoot.innerHTML).toMatchInlineSnapshot(` +" + + + " +`); + }) }) diff --git a/host/ide/test/base-ui/table/LitTableGroup.test.ts b/host/ide/test/base-ui/table/LitTableGroup.test.ts index 64ce85e..6cda3ac 100644 --- a/host/ide/test/base-ui/table/LitTableGroup.test.ts +++ b/host/ide/test/base-ui/table/LitTableGroup.test.ts @@ -27,4 +27,15 @@ describe('LitTableGroup Test', ()=>{ it('LitTableGroupTest02', ()=>{ expect(litTableGroup.title).toBe('title'); }) + + it('LitTableGroupTest03', ()=>{ + expect(litTableGroup.shadowRoot.innerHTML).toMatchInlineSnapshot(` +" + + + " +`) + }) }) diff --git a/host/ide/test/base-ui/table/TableRowObject.test.ts b/host/ide/test/base-ui/table/TableRowObject.test.ts new file mode 100644 index 0000000..5864b84 --- /dev/null +++ b/host/ide/test/base-ui/table/TableRowObject.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {TableRowObject} from "../../../dist/base-ui/table/TableRowObject.js"; + +describe('TableRowObject Test', ()=>{ + + it('TableRowObjectTest01', ()=>{ + expect(new TableRowObject().top).toBe(0); + }) +}); \ No newline at end of file diff --git a/host/ide/test/base-ui/tabs/LitTabpane.test.ts b/host/ide/test/base-ui/tabs/LitTabpane.test.ts index 2094ef9..03884a6 100644 --- a/host/ide/test/base-ui/tabs/LitTabpane.test.ts +++ b/host/ide/test/base-ui/tabs/LitTabpane.test.ts @@ -20,7 +20,8 @@ describe('LitTabPane Test', ()=>{ let litTabPane = new LitTabpane(); litTabPane.tab = 'tab' - litTabPane.disabled = 'disabled' + litTabPane.disabled = null || false + litTabPane.disabled = !null || !false litTabPane.hidden = 'hidden' litTabPane.closeable = false litTabPane.key = 'key' @@ -40,14 +41,47 @@ describe('LitTabPane Test', ()=>{ it('LitTabPaneTest4', ()=>{ expect(litTabPane.disabled).toBeTruthy(); }) + it('LitTabPaneTest5', ()=>{ expect(litTabPane.hidden).toBeTruthy(); }) + it('LitTabPaneTest6', ()=>{ litTabPane.closeable = 'closeable' expect(litTabPane.closeable).toBeTruthy(); }) + it('LitTabPaneTest7', ()=>{ expect(litTabPane.key).toBe('key'); }) + + it('LitTabPaneTest9 ', function () { + expect(litTabPane.connectedCallback()).toBeUndefined() + + }); + + it('LitTabPaneTest10 ', function () { + expect(litTabPane.disconnectedCallback()).toBeUndefined() + + }); + + it('LitTabPaneTest11 ', function () { + expect(litTabPane.adoptedCallback()).toBeUndefined() + + }); + it('LitTabPaneTest8', ()=>{ + expect(litTabPane.initHtml()).toMatchInlineSnapshot(` +" + + + " +`); + }) }) diff --git a/host/ide/test/base-ui/tabs/LitTabs.test.ts b/host/ide/test/base-ui/tabs/LitTabs.test.ts index 06a740d..c3f7e63 100644 --- a/host/ide/test/base-ui/tabs/LitTabs.test.ts +++ b/host/ide/test/base-ui/tabs/LitTabs.test.ts @@ -23,7 +23,8 @@ describe('LitSwitch Test', ()=>{ litTabs.mode = 'mode' litTabs.activekey = 'activekey' - litTabs.nav = jest.fn(()=>{ + + litTabs.nav = jest.fn(()=>{ let el = document.createElement('div'); let htmlDivElement = document.createElement('div'); htmlDivElement.setAttribute('class', 'nav-item[data-key=\'${key}\']') @@ -53,6 +54,10 @@ describe('LitSwitch Test', ()=>{ expect(litTabs.activekey).toBe('activekey'); }) + it('litTabsTest01', ()=>{ + expect(litTabs.onTabClick).toBeUndefined(); + }) + it('litTabsTest02', ()=>{ litTabs.nav = jest.fn(()=> true) litTabs.nav.querySelector = jest.fn(()=> { @@ -78,34 +83,47 @@ describe('LitSwitch Test', ()=>{ }) litTabs.nav.querySelectorAll = jest.fn(()=> true) - expect(litTabs.updateHidden('key', 'value')).toBeUndefined(); + expect(litTabs.updateHidden('key', "true")).toBeUndefined(); + }) + + it('litTabsTest13', ()=>{ + litTabs.nav = jest.fn(()=> true) + litTabs.nav.querySelector = jest.fn(()=> { + return document.createElement('div') as HTMLDivElement + }) + litTabs.nav.querySelectorAll = jest.fn(()=> true) + + expect(litTabs.updateHidden('key', !"true")).toBeUndefined(); }) it('litTabsTest05', ()=>{ expect(litTabs.initTabPos()).toBeUndefined(); }) - // it('litTabsTest07', ()=>{ + it('litTabsTest07', ()=>{ // litTabs.nav.querySelectorAll = jest.fn(()=> true) // litTabs.nav.querySelectorAll.forEach = jest.fn(()=> true) - // expect(litTabs.activeByKey('newKey')).toBeNull(); - // }) + expect(litTabs.activeByKey(null||undefined)).toBeUndefined(); + }) it('litTabsTest06', ()=>{ expect(litTabs.activePane('Key')).toBeFalsy(); }) - it('litTabsTest07', ()=>{ + it('litTabsTest007', ()=>{ expect(litTabs.connectedCallback()).toBeUndefined() }) it('litTabsTest8', ()=>{ - expect(litTabs.attributeChangedCallback('disabled', 'disabled', '')).toBeUndefined() + expect(litTabs.attributeChangedCallback('activekey', 'disabled', 'activekey')).toBeUndefined() }) it('litTabsTest9', ()=>{ expect(litTabs.adoptedCallback()).toBeUndefined(); }) + it('litTabsTest09', ()=>{ + expect(litTabs.disconnectedCallback()).toBeUndefined(); + }) it('litTabsTest10', ()=>{ expect(litTabs.position).toBe('position'); }) @@ -113,4 +131,387 @@ describe('LitSwitch Test', ()=>{ it('litTabsTest11', ()=>{ expect(litTabs.mode).toBe('mode'); }) + + it('litTabsTest12', ()=>{ + expect(litTabs.shadowRoot.innerHTML).toMatchInlineSnapshot(` +" + + +
      +
      + +
      +
      +
      +
      +
      + +
      +
      + NEED CONTENT +
      +
      + " +`); + }) }) diff --git a/host/ide/test/log/Log.test.ts b/host/ide/test/log/Log.test.ts new file mode 100644 index 0000000..f22e187 --- /dev/null +++ b/host/ide/test/log/Log.test.ts @@ -0,0 +1,24 @@ +// @ts-ignore +import {debug, error, info, log, trace, warn} from "../../dist/log/Log.js"; + +describe(' logTest', () => { + + it('LogTest01', () => { + error("111") + }) + it('LogTest02', () => { + warn("111") + }) + it('LogTest03', () => { + info("111") + }) + it('LogTest04', () => { + debug("111") + }) + it('LogTest05', () => { + trace("111") + }) + it('LogTest05', () => { + log("111") + }) +}); \ No newline at end of file diff --git a/host/ide/test/trace/SpApplication.test.ts b/host/ide/test/trace/SpApplication.test.ts index c4817f6..303d8dd 100644 --- a/host/ide/test/trace/SpApplication.test.ts +++ b/host/ide/test/trace/SpApplication.test.ts @@ -103,11 +103,269 @@ describe('spApplication Test', ()=>{ spApplication.vs = false; expect(spApplication.vs).toBeFalsy() }); + it('spApplicationTest20', function () { + let spApplication = new SpApplication(); + expect(spApplication.querySql).toBeFalsy() + }); it('spApplicationTest15',function (){ let spApplication = new SpApplication(); - expect(spApplication.freshMenuDisable).toBeTruthy() + expect(spApplication.freshMenuDisable()).toBeUndefined() + }) + + it('spApplicationTest16',function (){ + let spApplication = new SpApplication(); + expect(spApplication.addSkinListener()).toBeUndefined() + }) + + it('spApplicationTest17',function (){ + let spApplication = new SpApplication(); + expect(spApplication.removeSkinListener()).toBeUndefined() }) + it('spApplicationTest18',function (){ + document.body.innerHTML= "" + let element = document.querySelector("#sp") as SpApplication; + element.dispatchEvent(new Event("dragleave")) + }) + + it('spApplicationTest19',function (){ + document.body.innerHTML= "" + let element = document.querySelector("#sp") as SpApplication; + element.dispatchEvent(new Event("drop")) + //expect(SpApplication.removeSkinListener()).toBeUndefined() + }) + + it('spApplicationTest19',function (){ + document.body.innerHTML= "" + let element = document.querySelector("#sp") as SpApplication; + element.dispatchEvent(new Event("drop")) + //expect(SpApplication.removeSkinListener()).toBeUndefined() + }) + it('spApplicationTest21', function () { + let spApplication = new SpApplication(); + spApplication.showContent = true; + expect(spApplication.showContent).toBeTruthy() + }); + + it('spApplicationTest22', function () { + let spApplication = new SpApplication(); + spApplication.showConten = false; + expect(spApplication.showContent).toBeFalsy() + }); + + it('spApplicationTest23', function () { + let spApplication = new SpApplication(); + spApplication.openTraceFile = true; + expect(spApplication.openTraceFile).toBeTruthy() + }); + + it('spApplicationTest24', function () { + let spApplication = new SpApplication(); + spApplication.openTraceFile = false; + expect(spApplication.openTraceFile).toBeFalsy() + }); + + it('spApplicationTest25', function () { + let spApplication = new SpApplication(); + expect(spApplication.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      +
      +
      + + + +
      + +
      + +
      +
      + + + + + + + + + +
      +
      + " +`); + }); }) diff --git a/host/ide/test/trace/bean/AbilityMonitor.test.ts b/host/ide/test/trace/bean/AbilityMonitor.test.ts new file mode 100644 index 0000000..86b1823 --- /dev/null +++ b/host/ide/test/trace/bean/AbilityMonitor.test.ts @@ -0,0 +1,390 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {SystemCpuSummary, SystemDiskIOSummary, ProcessHistory, LiveProcess, SystemNetworkSummary, SystemMemorySummary} from "../../../dist/trace/bean/AbilityMonitor.js" + +describe('AbilityMonitor Test', ()=>{ + let systemCpuSummary = new SystemCpuSummary(); + let systemDiskIOSummary = new SystemDiskIOSummary(); + let processHistory = new ProcessHistory(); + let liveProcess = new LiveProcess(); + let systemNetworkSummary = new SystemNetworkSummary(); + let systemMemorySummary = new SystemMemorySummary(); + + it('SystemCpuSummaryTest', function () { + systemCpuSummary = { + startTime: -1, + startTimeStr: "startTimeStr", + duration: -1, + durationStr: "durationStr", + totalLoad: -1, + totalLoadStr: "totalLoadStr", + userLoad: -1, + userLoadStr: "userLoadStr", + systemLoad: -1, + systemLoadStr: "systemLoadStr", + threads: -1, + threadsStr: "threadsStr", + }; + + expect(systemCpuSummary).not.toBeUndefined() + expect(systemCpuSummary).toMatchInlineSnapshot({ + startTime: expect.any(Number), + startTimeStr: expect.any(String), + duration: expect.any(Number), + durationStr: expect.any(String), + totalLoad: expect.any(Number), + totalLoadStr: expect.any(String), + userLoad: expect.any(Number), + userLoadStr: expect.any(String), + systemLoad: expect.any(Number), + systemLoadStr: expect.any(String), + threads: expect.any(Number), + threadsStr: expect.any(String) }, ` + Object { + "duration": Any, + "durationStr": Any, + "startTime": Any, + "startTimeStr": Any, + "systemLoad": Any, + "systemLoadStr": Any, + "threads": Any, + "threadsStr": Any, + "totalLoad": Any, + "totalLoadStr": Any, + "userLoad": Any, + "userLoadStr": Any, + } + `); + }); + + it('SystemCpuSummaryTest', function () { + systemDiskIOSummary = { + startTime: 1, + startTimeStr: "startTimeStr", + duration: 1, + durationStr: "durationStr", + dataRead: 1, + dataReadStr: "dataReadStr", + dataReadSec: 1, + dataReadSecStr: "dataReadSecStr", + dataWrite: 1, + dataWriteStr: "dataWriteStr", + dataWriteSec: 1, + dataWriteSecStr: "dataWriteSecStr", + readsIn: 1, + readsInStr: "readsInStr", + readsInSec: 1, + readsInSecStr: "readsInSecStr", + writeOut: 1, + writeOutStr: "writeOutStr", + writeOutSec: 1, + writeOutSecStr: "writeOutSecStr", + } + expect(systemDiskIOSummary).not.toBeUndefined(); + expect(systemDiskIOSummary).toMatchInlineSnapshot({ + startTime: expect.any(Number), + startTimeStr: expect.any(String), + duration: expect.any(Number), + durationStr: expect.any(String), + dataRead: expect.any(Number), + dataReadStr: expect.any(String), + dataReadSec: expect.any(Number), + dataReadSecStr: expect.any(String), + dataWrite: expect.any(Number), + dataWriteStr: expect.any(String), + dataWriteSec: expect.any(Number), + dataWriteSecStr: expect.any(String), + readsIn: expect.any(Number), + readsInStr: expect.any(String), + readsInSec: expect.any(Number), + readsInSecStr: expect.any(String), + writeOut: expect.any(Number), + writeOutStr: expect.any(String), + writeOutSec: expect.any(Number), + writeOutSecStr: expect.any(String) }, ` + Object { + "dataRead": Any, + "dataReadSec": Any, + "dataReadSecStr": Any, + "dataReadStr": Any, + "dataWrite": Any, + "dataWriteSec": Any, + "dataWriteSecStr": Any, + "dataWriteStr": Any, + "duration": Any, + "durationStr": Any, + "readsIn": Any, + "readsInSec": Any, + "readsInSecStr": Any, + "readsInStr": Any, + "startTime": Any, + "startTimeStr": Any, + "writeOut": Any, + "writeOutSec": Any, + "writeOutSecStr": Any, + "writeOutStr": Any, + } + `); + }); + + it('SystemCpuSummaryTest', function () { + systemDiskIOSummary = { + startTime: 1, + startTimeStr: "startTimeStr", + duration: 1, + durationStr: "durationStr", + dataRead: 1, + dataReadStr: "dataReadStr", + dataReadSec: 1, + dataReadSecStr: "dataReadSecStr", + dataWrite: 1, + dataWriteStr: "dataWriteStr", + dataWriteSec: 1, + dataWriteSecStr: "dataWriteSecStr", + readsIn: 1, + readsInStr: "readsInStr", + readsInSec: 1, + readsInSecStr: "readsInSecStr", + writeOut: 1, + writeOutStr: "writeOutStr", + writeOutSec: 1, + writeOutSecStr: "writeOutSecStr", + } + expect(systemDiskIOSummary).not.toBeUndefined(); + expect(systemDiskIOSummary).toMatchInlineSnapshot({ + startTime: expect.any(Number), + startTimeStr: expect.any(String), + duration: expect.any(Number), + durationStr: expect.any(String), + dataRead: expect.any(Number), + dataReadStr: expect.any(String), + dataReadSec: expect.any(Number), + dataReadSecStr: expect.any(String), + dataWrite: expect.any(Number), + dataWriteStr: expect.any(String), + dataWriteSec: expect.any(Number), + dataWriteSecStr: expect.any(String), + readsIn: expect.any(Number), + readsInStr: expect.any(String), + readsInSec: expect.any(Number), + readsInSecStr: expect.any(String), + writeOut: expect.any(Number), + writeOutStr: expect.any(String), + writeOutSec: expect.any(Number), + writeOutSecStr: expect.any(String) }, ` + Object { + "dataRead": Any, + "dataReadSec": Any, + "dataReadSecStr": Any, + "dataReadStr": Any, + "dataWrite": Any, + "dataWriteSec": Any, + "dataWriteSecStr": Any, + "dataWriteStr": Any, + "duration": Any, + "durationStr": Any, + "readsIn": Any, + "readsInSec": Any, + "readsInSecStr": Any, + "readsInStr": Any, + "startTime": Any, + "startTimeStr": Any, + "writeOut": Any, + "writeOutSec": Any, + "writeOutSecStr": Any, + "writeOutStr": Any, + } + `); + }); + + it('ProcessHistoryTest', function () { + processHistory = { + processId: -1, + alive: '', + firstSeen: '', + lastSeen: '', + processName: "", + responsibleProcess: "", + userName: "", + cpuTime: '', + } + expect(processHistory).not.toBeUndefined(); + expect(processHistory).toMatchInlineSnapshot({ + processId: expect.any(Number), + alive: expect.any(String), + firstSeen: expect.any(String), + lastSeen: expect.any(String), + processName: expect.any(String), + responsibleProcess: expect.any(String), + userName: expect.any(String), + cpuTime: expect.any(String) }, ` + Object { + "alive": Any, + "cpuTime": Any, + "firstSeen": Any, + "lastSeen": Any, + "processId": Any, + "processName": Any, + "responsibleProcess": Any, + "userName": Any, + } + `); + }); + + it('LiveProcessTest', function () { + liveProcess = { + processId: -1, + processName: "", + responsibleProcess: "", + userName: "", + cpu: '', + threads: -1, + } + expect(liveProcess).not.toBeUndefined(); + expect(liveProcess).toMatchInlineSnapshot({ + processId: expect.any(Number), + processName: expect.any(String), + responsibleProcess: expect.any(String), + userName: expect.any(String), + cpu: expect.any(String), + threads: expect.any(Number) }, ` + Object { + "cpu": Any, + "processId": Any, + "processName": Any, + "responsibleProcess": Any, + "threads": Any, + "userName": Any, + } + `) + }); + + it('SystemNetworkSummaryTest', function () { + systemNetworkSummary = { + startTime: -1, + startTimeStr: "", + duration: -1, + durationStr: "", + dataReceived: -1, + dataReceivedStr: "", + dataReceivedSec: -1, + dataReceivedSecStr: "", + dataSend: -1, + dataSendStr: "", + dataSendSec: -1, + dataSendSecStr: "", + packetsIn: -1, + packetsInSec: -1, + packetsOut: -1, + packetsOutSec: -1, + } + expect(systemNetworkSummary).not.toBeUndefined(); + expect(systemNetworkSummary).toMatchInlineSnapshot({ + startTime: expect.any(Number), + startTimeStr: expect.any(String), + duration: expect.any(Number), + durationStr: expect.any(String), + dataReceived: expect.any(Number), + dataReceivedStr: expect.any(String), + dataReceivedSec: expect.any(Number), + dataReceivedSecStr: expect.any(String), + dataSend: expect.any(Number), + dataSendStr: expect.any(String), + dataSendSec: expect.any(Number), + dataSendSecStr: expect.any(String), + packetsIn: expect.any(Number), + packetsInSec: expect.any(Number), + packetsOut: expect.any(Number), + packetsOutSec: expect.any(Number) }, ` + Object { + "dataReceived": Any, + "dataReceivedSec": Any, + "dataReceivedSecStr": Any, + "dataReceivedStr": Any, + "dataSend": Any, + "dataSendSec": Any, + "dataSendSecStr": Any, + "dataSendStr": Any, + "duration": Any, + "durationStr": Any, + "packetsIn": Any, + "packetsInSec": Any, + "packetsOut": Any, + "packetsOutSec": Any, + "startTime": Any, + "startTimeStr": Any, + } + `) + }); + + it('systemMemorySummaryTest', function () { + systemMemorySummary = { + startTime: -1, + startTimeStr: "", + duration: -1, + durationStr: "", + memoryTotal: -1, + memoryTotalStr: "", + cached: -1, + cachedStr: "", + swapTotal: -1, + swapTotalStr: "", + appMemory: -1, + cachedFiles: -1, + compressed: -1, + memoryUsed: -1, + wiredMemory: -1, + swapUsed: -1, + } + expect(systemMemorySummary).not.toBeUndefined(); + expect(systemMemorySummary).toMatchInlineSnapshot({ + startTime: expect.any(Number), + startTimeStr: expect.any(String), + duration: expect.any(Number), + durationStr: expect.any(String), + memoryTotal: expect.any(Number), + memoryTotalStr: expect.any(String), + cached: expect.any(Number), + cachedStr: expect.any(String), + swapTotal: expect.any(Number), + swapTotalStr: expect.any(String), + appMemory: expect.any(Number), + cachedFiles: expect.any(Number), + compressed: expect.any(Number), + memoryUsed: expect.any(Number), + wiredMemory: expect.any(Number), + swapUsed: expect.any(Number) }, ` + Object { + "appMemory": Any, + "cached": Any, + "cachedFiles": Any, + "cachedStr": Any, + "compressed": Any, + "duration": Any, + "durationStr": Any, + "memoryTotal": Any, + "memoryTotalStr": Any, + "memoryUsed": Any, + "startTime": Any, + "startTimeStr": Any, + "swapTotal": Any, + "swapTotalStr": Any, + "swapUsed": Any, + "wiredMemory": Any, + } + `) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/BaseStruct.test.ts b/host/ide/test/trace/bean/BaseStruct.test.ts new file mode 100644 index 0000000..c08660f --- /dev/null +++ b/host/ide/test/trace/bean/BaseStruct.test.ts @@ -0,0 +1 @@ +/* * Copyright (C) 2022 Huawei Device Co., Ltd. * 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. */ //@ts-ignore import { BaseStruct} from "../../../dist/trace/bean/BaseStruct.js" describe('BaseStruct Test', ()=>{ let baseStruct = new BaseStruct(); it('BaseStructTest01', function () { baseStruct = { isHover : false, }; expect(baseStruct).not.toBeUndefined() expect(baseStruct).toMatchInlineSnapshot({ isHover: expect.any(Boolean) }, ` Object { "isHover": Any, } `); })}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/BoxSelection.test.ts b/host/ide/test/trace/bean/BoxSelection.test.ts index 1171184..bbfae61 100644 --- a/host/ide/test/trace/bean/BoxSelection.test.ts +++ b/host/ide/test/trace/bean/BoxSelection.test.ts @@ -14,27 +14,188 @@ */ // @ts-ignore -import {SelectionParam, SelectionData, Counter, Fps} from "../../../dist/trace/bean/BoxSelection.js" +import {SelectionParam, BoxJumpParam, SelectionData, Counter, Fps} from "../../../dist/trace/bean/BoxSelection.js" describe('BoxSelection Test', ()=>{ let selectionParam = new SelectionParam(); + let boxJumpParam = new BoxJumpParam(); let selectionData = new SelectionData(); let counter = new Counter(); let fps = new Fps(); - it('BoxSelectionTest01', function () { + selectionParam = { + cpus: 1, + threadIds: 2, + trackIds: 1, + funTids: 2, + heapIds: 1, + nativeMemory: 3, + leftNs: 1, + rightNs: 1, + hasFps: true, + statisticsSelectData: 1, + }; + expect(selectionParam).not.toBeUndefined() + expect(selectionParam).toMatchInlineSnapshot({ + cpus: expect.any(Number), + threadIds: expect.any(Number), + trackIds: expect.any(Number), + funTids: expect.any(Number), + heapIds: expect.any(Number), + nativeMemory: expect.any(Number), + leftNs: expect.any(Number), + rightNs: expect.any(Number), + hasFps: expect.any(Boolean) + }, + ` + Object { + "cpus": Any, + "funTids": Any, + "hasFps": Any, + "heapIds": Any, + "leftNs": Any, + "nativeMemory": Any, + "rightNs": Any, + "statisticsSelectData": 1, + "threadIds": Any, + "trackIds": Any, + } + `); }); it('BoxSelectionTest02', function () { - expect(selectionData).not.toBeUndefined() - }); + boxJumpParam = { + leftNs: 0, + rightNs: 0, + state: "", + processId: 0, + threadId: 0, + }; + expect(boxJumpParam).not.toBeUndefined() + expect(boxJumpParam).toMatchInlineSnapshot({ + leftNs: expect.any(Number), + rightNs: expect.any(Number), + state: expect.any(String), + processId: expect.any(Number), + threadId: expect.any(Number) }, ` + Object { + "leftNs": Any, + "processId": Any, + "rightNs": Any, + "state": Any, + "threadId": Any, + } + `); + }); it('BoxSelectionTest03', function () { + selectionData = { + name: "name", + process: "process", + pid: "pid", + thread: "thread", + tid: "tid", + wallDuration: 0, + avgDuration: "avgDuration", + occurrences: 0, + state: "state", + trackId: 0, + delta: "delta", + rate: "rate", + avgWeight: "avgWeight", + count: "count", + first: "first", + last: "last", + min: "min", + max: "max", + stateJX: "stateJX", + }; + expect(selectionData).not.toBeUndefined() + expect(selectionData).toMatchInlineSnapshot({ + process: expect.any(String), + pid: expect.any(String), + thread: expect.any(String), + tid: expect.any(String), + wallDuration: expect.any(Number), + avgDuration: expect.any(String), + occurrences: expect.any(Number), + state: expect.any(String), + trackId: expect.any(Number), + delta: expect.any(String), + rate: expect.any(String), + avgWeight: expect.any(String), + count: expect.any(String), + first: expect.any(String), + last: expect.any(String), + min: expect.any(String), + max: expect.any(String), + stateJX: expect.any(String) }, ` + Object { + "avgDuration": Any, + "avgWeight": Any, + "count": Any, + "delta": Any, + "first": Any, + "last": Any, + "max": Any, + "min": Any, + "name": "name", + "occurrences": Any, + "pid": Any, + "process": Any, + "rate": Any, + "state": Any, + "stateJX": Any, + "thread": Any, + "tid": Any, + "trackId": Any, + "wallDuration": Any, + } + `); + }); + + it('BoxSelectionTest04', function () { + counter = { + id: 0, + trackId: 0, + name: "", + value: 0, + startTime: 0, + }; expect(counter).not.toBeUndefined() + expect(counter).toMatchInlineSnapshot({ + id: expect.any(Number), + trackId: expect.any(Number), + name: expect.any(String), + value: expect.any(Number), + startTime: expect.any(Number) }, ` + Object { + "id": Any, + "name": Any, + "startTime": Any, + "trackId": Any, + "value": Any, + } + `) }); - it('BoxSelectionTest04', function () { + it('BoxSelectionTest05', function () { + fps = { + startNS: 0, + timeStr: "", + fps: 0, + }; expect(fps).not.toBeUndefined() + expect(fps).toMatchInlineSnapshot({ + startNS: expect.any(Number), + timeStr: expect.any(String), + fps: expect.any(Number) }, ` + Object { + "fps": Any, + "startNS": Any, + "timeStr": Any, + } + `); }); }) diff --git a/host/ide/test/trace/bean/CpuFreqStruct.test.ts b/host/ide/test/trace/bean/CpuFreqStruct.test.ts index 1d716aa..42b00f0 100644 --- a/host/ide/test/trace/bean/CpuFreqStruct.test.ts +++ b/host/ide/test/trace/bean/CpuFreqStruct.test.ts @@ -33,7 +33,42 @@ describe('CpuFreqStruct Test', ()=>{ startNS: 200, value: 50 } + + const dataSource = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + value: 50, + maxFreq: 50 + } + it('CpuFreqStructTest01', function () { expect(CpuFreqStruct.draw(ctx, data)).toBeUndefined() + expect(data).toMatchInlineSnapshot({ + startNS: expect.any(Number), + value: expect.any(Number) }, ` + Object { + "frame": Object { + "height": 100, + "width": 100, + "x": 20, + "y": 20, + }, + "startNS": Any, + "value": Any, + } + `); + }); + + it('CpuFreqStructTest02', function () { + expect(CpuFreqStruct.draw(ctx, {startNS:1})).toBeUndefined() + }); + + it('CpuFreqStructTest03 ', function () { + expect(CpuFreqStruct.draw(ctx,dataSource)).toBeUndefined() + }); }) diff --git a/host/ide/test/trace/bean/CpuStruct.test.ts b/host/ide/test/trace/bean/CpuStruct.test.ts index 266521c..a9358d8 100644 --- a/host/ide/test/trace/bean/CpuStruct.test.ts +++ b/host/ide/test/trace/bean/CpuStruct.test.ts @@ -32,11 +32,30 @@ describe('CpuStruct Test', ()=>{ startNS: 200, value: 50 } + + it('CpuStructTest01', function () { expect(CpuStruct.draw(ctx, data)).toBeUndefined() + expect(data).toMatchInlineSnapshot({ + startNS: expect.any(Number), + value: expect.any(Number) }, ` + Object { + "frame": Object { + "height": 100, + "width": 100, + "x": 20, + "y": 20, + }, + "startNS": Any, + "value": Any, + } + `); }); it('CpuStructTest02', function () { expect(CpuStruct.equals({}, data)).toBeTruthy(); }); + + + }) diff --git a/host/ide/test/trace/bean/CpuUsage.test.ts b/host/ide/test/trace/bean/CpuUsage.test.ts index 920f4fc..0f3e886 100644 --- a/host/ide/test/trace/bean/CpuUsage.test.ts +++ b/host/ide/test/trace/bean/CpuUsage.test.ts @@ -21,10 +21,70 @@ describe('CpuUsage Test', ()=>{ let freq = new Freq(); it('CpuUsageTest01', function () { + cpuUsage = { + cpu: 0, + usage: 0, + usageStr: "", + top1: 0, + top2: 0, + top3: 0, + top1Percent: 0, + top1PercentStr: "", + top2Percent: 0, + top2PercentStr: "", + top3Percent: 0, + top3PercentStr: "", + } expect(cpuUsage).not.toBeUndefined() + expect(cpuUsage).toMatchInlineSnapshot({ + cpu: expect.any(Number), + usage: expect.any(Number), + usageStr: expect.any(String), + top1: expect.any(Number), + top2: expect.any(Number), + top3: expect.any(Number), + top1Percent: expect.any(Number), + top1PercentStr: expect.any(String), + top2Percent: expect.any(Number), + top2PercentStr: expect.any(String), + top3Percent: expect.any(Number), + top3PercentStr: expect.any(String) }, ` + Object { + "cpu": Any, + "top1": Any, + "top1Percent": Any, + "top1PercentStr": Any, + "top2": Any, + "top2Percent": Any, + "top2PercentStr": Any, + "top3": Any, + "top3Percent": Any, + "top3PercentStr": Any, + "usage": Any, + "usageStr": Any, + } + `); }); it('CpuUsageTest02', function () { + cpuUsage = { + cpu: 0, + value: 0, + startNs: 0, + dur: 0, + } expect(freq).not.toBeUndefined() + expect(cpuUsage).toMatchInlineSnapshot({ + cpu: expect.any(Number), + value: expect.any(Number), + startNs: expect.any(Number), + dur: expect.any(Number) }, ` + Object { + "cpu": Any, + "dur": Any, + "startNs": Any, + "value": Any, + } + `); }); }) diff --git a/host/ide/test/trace/bean/DiskAbilityMonitorStruct.test.ts b/host/ide/test/trace/bean/DiskAbilityMonitorStruct.test.ts new file mode 100644 index 0000000..5131ad5 --- /dev/null +++ b/host/ide/test/trace/bean/DiskAbilityMonitorStruct.test.ts @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {DiskAbilityMonitorStruct} from "../../../dist/trace/bean/DiskAbilityMonitorStruct.js" + +describe('DiskAbilityMonitorStruct Test', ()=> { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + + }, + value: 50, + maxDiskRate: 50 + + } + + it('DiskAbilityMonitorStructTest01', function () { + expect(DiskAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + + it('DiskAbilityMonitorStructTest02', function () { + expect(DiskAbilityMonitorStruct.draw(ctx, Sourcedata)).toBeUndefined() + }); + +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/FpsStruct.test.ts b/host/ide/test/trace/bean/FpsStruct.test.ts index 568a5a5..92d7ae3 100644 --- a/host/ide/test/trace/bean/FpsStruct.test.ts +++ b/host/ide/test/trace/bean/FpsStruct.test.ts @@ -32,7 +32,51 @@ describe('FpsStruct Test', ()=>{ startNS: 200, value: 50 } + const node = { + startNS: 200, + frame:2, + dur:3, + } + const padding = 1 + const startNs = 1 + const endNS = 1 + const totalNS = 1 + const frame = { + x: 20, + y: 20, + width: 100, + height: 100 + } + const dataSource = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + value: 50, + maxFps: 50 + } + + it('FpsStructTest01', function () { expect(FpsStruct.draw(ctx, data)).toBeUndefined() }); + + it('FpsStructTest04 ', function () { + expect(FpsStruct.draw(ctx,dataSource)).toBeUndefined() + + }); + + it('FpsStructTest02', function () { + let fpsStruct = new FpsStruct(); + expect(fpsStruct).not.toBeUndefined() + }); + + it('FpsStructTest03', function () { + expect(FpsStruct.setFrame(node,padding,startNs,endNS,totalNS,frame)).toBeUndefined() + }); + + + }) diff --git a/host/ide/test/trace/bean/FuncStruct.test.ts b/host/ide/test/trace/bean/FuncStruct.test.ts index f2ac0d7..a58bd5e 100644 --- a/host/ide/test/trace/bean/FuncStruct.test.ts +++ b/host/ide/test/trace/bean/FuncStruct.test.ts @@ -51,6 +51,10 @@ describe('FuncStruct Test', ()=>{ it('FuncStructTest03', function () { expect(FuncStruct.drawString(ctx, 2, durData, durData.frame)).toBeUndefined() }); + it('FuncStructTest06 ', function () { + expect(FuncStruct.drawString(ctx,3,durData,durData.frame)).toBeUndefined() + + }); it('FuncStructTest04', function () { expect(FuncStruct.isSelected({ @@ -60,11 +64,13 @@ describe('FuncStruct Test', ()=>{ })).toBeTruthy(); }); + it('FuncStructTest05', function () { expect(FuncStruct.isBinder({ startTs: 10, dur: 10, - funName: '' + funName: null })).toBeFalsy(); }); + }) diff --git a/host/ide/test/trace/bean/HeapBean.test.ts b/host/ide/test/trace/bean/HeapBean.test.ts new file mode 100644 index 0000000..ee020fa --- /dev/null +++ b/host/ide/test/trace/bean/HeapBean.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {HeapBean} from "../../../dist/trace/bean/HeapBean.js" + +describe('HeapBean Test', ()=>{ + let heapBean = new HeapBean(); + + it('HeapBeanTest01', function () { + heapBean = { + MoudleName: "MoudleName", + AllocationFunction: "AllocationFunction", + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + depth: 0, + } + expect(heapBean).not.toBeUndefined() + expect(heapBean).toMatchInlineSnapshot({ + MoudleName: expect.any(String), + AllocationFunction: expect.any(String), + Allocations: expect.any(Number), + Deallocations: expect.any(Number), + AllocationSize: expect.any(Number), + DeAllocationSize: expect.any(Number), + Total: expect.any(Number), + RemainingSize: expect.any(Number), + depth: expect.any(Number) }, ` + Object { + "AllocationFunction": Any, + "AllocationSize": Any, + "Allocations": Any, + "DeAllocationSize": Any, + "Deallocations": Any, + "MoudleName": Any, + "RemainingSize": Any, + "Total": Any, + "depth": Any, + } + `) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/HeapTreeDataBean.test.ts b/host/ide/test/trace/bean/HeapTreeDataBean.test.ts new file mode 100644 index 0000000..9f859d1 --- /dev/null +++ b/host/ide/test/trace/bean/HeapTreeDataBean.test.ts @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {HeapTreeDataBean} from "../../../dist/trace/bean/HeapTreeDataBean.js" + +describe('HeapTreeDataBean Test', ()=>{ + let heapTreeDataBean = new HeapTreeDataBean(); + + it('HeapTreeDataBeanTest01', function () { + heapTreeDataBean = { + MoudleName: "MoudleName", + AllocationFunction: "AllocationFunction", + startTs: 0, + endTs: 0, + eventType: "eventType", + depth: 0, + heapSize: 0, + eventId: "eventId", + } + expect(heapTreeDataBean).not.toBeUndefined() + expect(heapTreeDataBean).toMatchInlineSnapshot({ + MoudleName: expect.any(String), + AllocationFunction: expect.any(String), + startTs: expect.any(Number), + endTs: expect.any(Number), + eventType: expect.any(String), + depth: expect.any(Number), + heapSize: expect.any(Number), + eventId: expect.any(String) }, ` + Object { + "AllocationFunction": Any, + "MoudleName": Any, + "depth": Any, + "endTs": Any, + "eventId": Any, + "eventType": Any, + "heapSize": Any, + "startTs": Any, + } + `) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/MemoryAbilityMonitorStruct.test.ts b/host/ide/test/trace/bean/MemoryAbilityMonitorStruct.test.ts new file mode 100644 index 0000000..1e74d9a --- /dev/null +++ b/host/ide/test/trace/bean/MemoryAbilityMonitorStruct.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {MemoryAbilityMonitorStruct} from "../../../dist/trace/bean/MemoryAbilityMonitorStruct.js" + +describe('MemoryAbilityMonitorStruct Test', ()=> { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxMemoryByte: 200, + value: 50 + } + + it('MemoryAbilityMonitorStructTest01', function () { + expect(MemoryAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + + it('MemoryAbilityMonitorStructTest02', function () { + expect(MemoryAbilityMonitorStruct.draw(ctx, Sourcedata)).toBeUndefined() + }); + + + +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/NativeHook.test.ts b/host/ide/test/trace/bean/NativeHook.test.ts new file mode 100644 index 0000000..5b872a2 --- /dev/null +++ b/host/ide/test/trace/bean/NativeHook.test.ts @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {NativeHookStatistics, NativeHookMalloc, NativeEventHeap, NativeHookProcess, NativeHookStatisticsTableData, NativeMemory, NativeHookSamplerInfo, NativeHookSampleQueryInfo, NativeHookCallInfo} from "../../../dist/trace/bean/NativeHook.js" + +describe('NativeHook Test', ()=>{ + + it('NativeHookStatisticsTest01', function () { + let nativeHookStatistics = new NativeHookStatistics(); + nativeHookStatistics = { + eventId: 0, + eventType: "eventType", + subType: "subType", + heapSize: 0, + addr: "addr", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 0, + count: 0, + tid: 0, + isSelected: false, + } + expect(nativeHookStatistics).not.toBeUndefined() + expect(nativeHookStatistics).toMatchInlineSnapshot({ + eventId: expect.any(Number), + eventType: expect.any(String), + subType: expect.any(String), + heapSize: expect.any(Number), + addr: expect.any(String), + startTs: expect.any(Number), + endTs: expect.any(Number), + sumHeapSize: expect.any(Number), + max: expect.any(Number), + count: expect.any(Number), + tid: expect.any(Number), + isSelected: expect.any(Boolean) }, ` + Object { + "addr": Any, + "count": Any, + "endTs": Any, + "eventId": Any, + "eventType": Any, + "heapSize": Any, + "isSelected": Any, + "max": Any, + "startTs": Any, + "subType": Any, + "sumHeapSize": Any, + "tid": Any, + } + `) + }); + + it('NativeEventHeapTest02', function () { + let nativeHookMalloc = new NativeHookMalloc(); + nativeHookMalloc = { + eventType: "eventType", + subType: "subType", + heapSize: 0, + allocByte: 0, + allocCount: 0, + freeByte: 0, + freeCount: 0, + } + expect(nativeHookMalloc).not.toBeUndefined() + expect(nativeHookMalloc).toMatchInlineSnapshot({ + eventType: expect.any(String), + subType: expect.any(String), + heapSize: expect.any(Number), + allocByte: expect.any(Number), + allocCount: expect.any(Number), + freeByte: expect.any(Number), + freeCount: expect.any(Number) }, ` + Object { + "allocByte": Any, + "allocCount": Any, + "eventType": Any, + "freeByte": Any, + "freeCount": Any, + "heapSize": Any, + "subType": Any, + } + `) + }); + + it('NativeEventHeapTest03', function () { + let nativeEventHeap = new NativeEventHeap(); + nativeEventHeap = { + eventType: "eventType", + sumHeapSize: 0, + } + expect(nativeEventHeap).not.toBeUndefined() + expect(nativeEventHeap).toMatchInlineSnapshot({ + eventType: expect.any(String), + sumHeapSize: expect.any(Number) }, ` + Object { + "eventType": Any, + "sumHeapSize": Any, + } + `) + }); + + it('NativeHookProcessTest04', function () { + let nativeHookProcess = new NativeHookProcess(); + nativeHookProcess = { + ipid: 0, + pid: 0, + name: "name", + } + expect(nativeHookProcess).not.toBeUndefined() + expect(nativeHookProcess).toMatchInlineSnapshot({ + ipid: expect.any(Number), + pid: expect.any(Number), + name: expect.any(String) }, ` + Object { + "ipid": Any, + "name": Any, + "pid": Any, + } + `) + }); + + it('NativeHookStatisticsTableDataTest05', function () { + let nativeHookStatisticsTableData = new NativeHookStatisticsTableData(); + nativeHookStatisticsTableData = { + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + } + expect(nativeHookStatisticsTableData).not.toBeUndefined() + expect(nativeHookStatisticsTableData).toMatchInlineSnapshot({ + memoryTap: expect.any(String), + existing: expect.any(Number), + existingString: expect.any(String), + allocCount: expect.any(Number), + freeCount: expect.any(Number), + totalBytes: expect.any(Number), + totalBytesString: expect.any(String), + maxStr: expect.any(String), + max: expect.any(Number), + totalCount: expect.any(Number) }, ` + Object { + "allocCount": Any, + "existing": Any, + "existingString": Any, + "freeCount": Any, + "max": Any, + "maxStr": Any, + "memoryTap": Any, + "totalBytes": Any, + "totalBytesString": Any, + "totalCount": Any, + } + `) + }); + + it('NativeMemoryTest06', function () { + let nativeMemory = new NativeMemory(); + nativeMemory = { + index: 0, + eventId: 0, + eventType: "eventType", + subType: "subType", + addr: "addr", + startTs: 0, + timestamp: "timestamp", + heapSize: 0, + heapSizeUnit: "heapSizeUnit", + symbol: "symbol", + library: "library", + isSelected: false, + } + expect(nativeMemory).not.toBeUndefined() + expect(nativeMemory).toMatchInlineSnapshot({ + index: expect.any(Number), + eventId: expect.any(Number), + eventType: expect.any(String), + subType: expect.any(String), + addr: expect.any(String), + startTs: expect.any(Number), + timestamp: expect.any(String), + heapSize: expect.any(Number), + heapSizeUnit: expect.any(String), + symbol: expect.any(String), + library: expect.any(String), + isSelected: expect.any(Boolean) }, ` + Object { + "addr": Any, + "eventId": Any, + "eventType": Any, + "heapSize": Any, + "heapSizeUnit": Any, + "index": Any, + "isSelected": Any, + "library": Any, + "startTs": Any, + "subType": Any, + "symbol": Any, + "timestamp": Any, + } + `) + }); + + it('NativeHookCallInfoTest07', function () { + let nativeHookSamplerInfo = new NativeHookSamplerInfo(); + nativeHookSamplerInfo = { + current: "current", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "snapshot", + growth: "growth", + total: 0, + totalGrowth: "totalGrowth", + existing: 0, + timestamp: "timestamp", + eventId: -1, + } + expect(nativeHookSamplerInfo).not.toBeUndefined() + expect(nativeHookSamplerInfo).toMatchInlineSnapshot({ + current: expect.any(String), + currentSize: expect.any(Number), + startTs: expect.any(Number), + heapSize: expect.any(Number), + snapshot: expect.any(String), + growth: expect.any(String), + total: expect.any(Number), + totalGrowth: expect.any(String), + existing: expect.any(Number), + timestamp: expect.any(String), + eventId: expect.any(Number) }, ` + Object { + "current": Any, + "currentSize": Any, + "eventId": Any, + "existing": Any, + "growth": Any, + "heapSize": Any, + "snapshot": Any, + "startTs": Any, + "timestamp": Any, + "total": Any, + "totalGrowth": Any, + } + `) + }); + + it('NativeHookCallInfoTest08', function () { + let nativeHookSampleQueryInfo = new NativeHookSampleQueryInfo(); + nativeHookSampleQueryInfo = { + eventId: -1, + current: 0, + eventType: "eventType", + subType: "subType", + growth: 0, + existing: 0, + addr: "addr", + startTs: 0, + endTs: 0, + total: 0, + } + + expect(nativeHookSampleQueryInfo).not.toBeUndefined() + expect(nativeHookSampleQueryInfo).toMatchInlineSnapshot({ + eventId: expect.any(Number), + current: expect.any(Number), + eventType: expect.any(String), + subType: expect.any(String), + growth: expect.any(Number), + existing: expect.any(Number), + addr: expect.any(String), + startTs: expect.any(Number), + endTs: expect.any(Number), + total: expect.any(Number) }, ` + Object { + "addr": Any, + "current": Any, + "endTs": Any, + "eventId": Any, + "eventType": Any, + "existing": Any, + "growth": Any, + "startTs": Any, + "subType": Any, + "total": Any, + } + `) + }); + + it('NativeHookCallInfoTest09', function () { + let nativeHookCallInfo = new NativeHookCallInfo(); + nativeHookCallInfo = { + id: "id", + pid: "pid", + library: "library", + title: "title", + count: 0, + type: 0, + heapSize: 0, + heapSizeStr: "heapSizeStr", + eventId: 0, + threadId: 0, + isSelected: false, + } + expect(nativeHookCallInfo).not.toBeUndefined() + expect(nativeHookCallInfo).toMatchInlineSnapshot({ + id: expect.any(String), + pid: expect.any(String), + library: expect.any(String), + title: expect.any(String), + count: expect.any(Number), + type: expect.any(Number), + heapSize: expect.any(Number), + heapSizeStr: expect.any(String), + eventId: expect.any(Number), + threadId: expect.any(Number), + isSelected: expect.any(Boolean) }, ` + Object { + "count": Any, + "eventId": Any, + "heapSize": Any, + "heapSizeStr": Any, + "id": Any, + "isSelected": Any, + "library": Any, + "pid": Any, + "threadId": Any, + "title": Any, + "type": Any, + } + `) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/NetworkAbilityMonitorStruct.test.ts b/host/ide/test/trace/bean/NetworkAbilityMonitorStruct.test.ts new file mode 100644 index 0000000..c221584 --- /dev/null +++ b/host/ide/test/trace/bean/NetworkAbilityMonitorStruct.test.ts @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {NetworkAbilityMonitorStruct} from "../../../dist/trace/bean/NetworkAbilityMonitorStruct.js" + +describe('NetworkAbilityMonitorStruct Test', ()=> { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + const Sourcedate = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + value: 50, + maxNetworkRate: 50 + + } + + it('NetworkAbilityMonitorStructTest01', function () { + expect(NetworkAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + + it('NetworkAbilityMonitorStructTest02', function () { + expect(NetworkAbilityMonitorStruct.draw(ctx, Sourcedate)).toBeUndefined() + }); + +}) \ No newline at end of file diff --git a/host/ide/test/trace/bean/PerfProfile.test.ts b/host/ide/test/trace/bean/PerfProfile.test.ts new file mode 100644 index 0000000..f4332f5 --- /dev/null +++ b/host/ide/test/trace/bean/PerfProfile.test.ts @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {PerfFile, PerfThread, PerfCallChain, PerfCallChainMerageData, PerfSample, PerfStack} from "../../../dist/trace/bean/PerfProfile.js" + +describe('PerfProfile Test', ()=>{ + let perfFile = new PerfFile(); + let perfThread = new PerfThread(); + let perfCallChain = new PerfCallChain(); + let perfCallChainMerageData = new PerfCallChainMerageData(); + let perfSample = new PerfSample(); + let perfStack = new PerfStack(); + + it('PerfFile Test', function () { + perfFile = { + fileId: 0, + symbol: "symbol", + path: "path", + fileName: "fileName", + }; + + expect(perfFile).not.toBeUndefined() + expect(perfFile).toMatchInlineSnapshot({ + fileId: expect.any(Number), + symbol: expect.any(String), + path: expect.any(String), + fileName: expect.any(String) }, ` + Object { + "fileId": Any, + "fileName": Any, + "path": Any, + "symbol": Any, + } + `); + }); + + it('PerfThread Test', function () { + perfThread = { + tid: 0, + pid: 0, + threadName: "threadName", + processName: "processName", + } + + expect(perfThread).not.toBeUndefined() + expect(perfThread).toMatchInlineSnapshot({ + tid: expect.any(Number), + pid: expect.any(Number), + threadName: expect.any(String), + processName: expect.any(String) }, ` + Object { + "pid": Any, + "processName": Any, + "threadName": Any, + "tid": Any, + } + `); + }); + + it('perfCallChain Test', function () { + perfCallChain = { + tid: 0, + pid: 0, + name: "name", + fileName: "fileName", + threadState: "threadState", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + parentId: "parentId", + id: "id", + topDownMerageId: "topDownMerageId", + topDownMerageParentId: "topDownMerageParentId", + bottomUpMerageId: "bottomUpMerageId", + bottomUpMerageParentId: "bottomUpMerageParentId", + depth: 0, + } + + expect(perfCallChain).not.toBeUndefined() + expect(perfCallChain).toMatchInlineSnapshot({ + tid: expect.any(Number), + pid: expect.any(Number), + name: expect.any(String), + fileName: expect.any(String), + threadState: expect.any(String), + startNS: expect.any(Number), + dur: expect.any(Number), + sampleId: expect.any(Number), + callChainId: expect.any(Number), + vaddrInFile: expect.any(Number), + fileId: expect.any(Number), + symbolId: expect.any(Number), + parentId: expect.any(String), + id: expect.any(String), + topDownMerageId: expect.any(String), + topDownMerageParentId: expect.any(String), + bottomUpMerageId: expect.any(String), + bottomUpMerageParentId: expect.any(String), + depth: expect.any(Number) }, ` + Object { + "bottomUpMerageId": Any, + "bottomUpMerageParentId": Any, + "callChainId": Any, + "depth": Any, + "dur": Any, + "fileId": Any, + "fileName": Any, + "id": Any, + "name": Any, + "parentId": Any, + "pid": Any, + "sampleId": Any, + "startNS": Any, + "symbolId": Any, + "threadState": Any, + "tid": Any, + "topDownMerageId": Any, + "topDownMerageParentId": Any, + "vaddrInFile": Any, + } + `) + }) + + it('perfCallChain Test', function () { + perfCallChainMerageData = { + id: "id", + parentId: "parentId", + symbolName: "symbolName", + symbol: "symbol", + libName: "libName", + self: "self", + weight: "weight", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + type: 0, + isSelected: false, + } + + expect(perfCallChainMerageData).not.toBeUndefined() + expect(perfCallChainMerageData).toMatchInlineSnapshot({ + id: expect.any(String), + parentId: expect.any(String), + symbolName: expect.any(String), + symbol: expect.any(String), + libName: expect.any(String), + self: expect.any(String), + weight: expect.any(String), + selfDur: expect.any(Number), + dur: expect.any(Number), + tid: expect.any(Number), + pid: expect.any(Number), + type: expect.any(Number), + isSelected: expect.any(Boolean) }, ` + Object { + "dur": Any, + "id": Any, + "isSelected": Any, + "libName": Any, + "parentId": Any, + "pid": Any, + "self": Any, + "selfDur": Any, + "symbol": Any, + "symbolName": Any, + "tid": Any, + "type": Any, + "weight": Any, + } + `) + }) + + it('perfSample Test', function () { + perfSample = { + sampleId: 0, + time: 0, + timeString: "timeString", + core: 0, + coreName: "coreName", + state: "state", + pid: 0, + processName: "processName", + tid: 0, + threadName: "threadName", + depth: 0, + addr: "addr", + fileId: 0, + symbolId: 0, + } + expect(perfSample).not.toBeUndefined() + expect(perfSample).toMatchInlineSnapshot({ + sampleId: expect.any(Number), + time: expect.any(Number), + timeString: expect.any(String), + core: expect.any(Number), + coreName: expect.any(String), + state: expect.any(String), + pid: expect.any(Number), + processName: expect.any(String), + tid: expect.any(Number), + threadName: expect.any(String), + depth: expect.any(Number), + addr: expect.any(String), + fileId: expect.any(Number), + symbolId: expect.any(Number) }, ` + Object { + "addr": Any, + "core": Any, + "coreName": Any, + "depth": Any, + "fileId": Any, + "pid": Any, + "processName": Any, + "sampleId": Any, + "state": Any, + "symbolId": Any, + "threadName": Any, + "tid": Any, + "time": Any, + "timeString": Any, + } + `) + }) + + it('perfStack Test', function () { + perfStack = { + symbol: "", + path: "", + fileId: 0, + type: 0, + } + expect(perfStack).not.toBeUndefined() + expect(perfStack).toMatchInlineSnapshot({ + symbol: expect.any(String), + path: expect.any(String), + fileId: expect.any(Number), + type: expect.any(Number) }, ` + Object { + "fileId": Any, + "path": Any, + "symbol": Any, + "type": Any, + } + `) + }) +}) diff --git a/host/ide/test/trace/bean/StateProcessThread.test.ts b/host/ide/test/trace/bean/StateProcessThread.test.ts index 83be7ef..b641d42 100644 --- a/host/ide/test/trace/bean/StateProcessThread.test.ts +++ b/host/ide/test/trace/bean/StateProcessThread.test.ts @@ -14,12 +14,159 @@ */ // @ts-ignore -import {StateProcessThread} from "../../../dist/trace/bean/StateProcessThread.js" +import {StateProcessThread,SPTChild,SPT} from "../../../dist/trace/bean/StateProcessThread.js" describe('StateProcessThread Test', ()=>{ - let stateProcessThread = new StateProcessThread(); it('StateProcessThreadTest01', function () { + let stateProcessThread = new StateProcessThread(); + stateProcessThread = { + id: "id", + pid: "pid", + title: "title", + process: "process", + processId: -1, + thread: "thread", + threadId: -1, + state: "state", + wallDuration: 0, + avgDuration: "avgDuration", + count: 0, + minDuration: 0, + maxDuration: 0, + stdDuration: "stdDuration", + } expect(stateProcessThread).not.toBeUndefined() + expect(stateProcessThread).toMatchInlineSnapshot({ + id: expect.any(String), + pid: expect.any(String), + title: expect.any(String), + process: expect.any(String), + processId: expect.any(Number), + thread: expect.any(String), + threadId: expect.any(Number), + wallDuration: expect.any(Number), + avgDuration: expect.any(String), + count: expect.any(Number), + minDuration: expect.any(Number), + maxDuration: expect.any(Number), + stdDuration: expect.any(String) }, ` + Object { + "avgDuration": Any, + "count": Any, + "id": Any, + "maxDuration": Any, + "minDuration": Any, + "pid": Any, + "process": Any, + "processId": Any, + "state": "state", + "stdDuration": Any, + "thread": Any, + "threadId": Any, + "title": Any, + "wallDuration": Any, + } + `) + }); + + it('SPTChildTest02', function () { + let sptChild = new SPTChild(); + sptChild = { + process: "process", + processId: 0, + processName: "processName", + thread: "thread", + threadId: 0, + threadName: "threadName", + state: "state", + startNs: 0, + startTime: "startTime", + duration: 0, + cpu: 1, + core: "core", + priority: 0, + prior: "prior", + note: "note", + } + expect(sptChild).not.toBeUndefined() + expect(sptChild).toMatchInlineSnapshot({ + process: expect.any(String), + processId: expect.any(Number), + processName: expect.any(String), + thread: expect.any(String), + threadId: expect.any(Number), + threadName: expect.any(String), + state: expect.any(String), + startNs: expect.any(Number), + startTime: expect.any(String), + duration: expect.any(Number), + cpu: expect.any(Number), + core: expect.any(String), + priority: expect.any(Number), + prior: expect.any(String), + note: expect.any(String) }, ` + Object { + "core": Any, + "cpu": Any, + "duration": Any, + "note": Any, + "prior": Any, + "priority": Any, + "process": Any, + "processId": Any, + "processName": Any, + "startNs": Any, + "startTime": Any, + "state": Any, + "thread": Any, + "threadId": Any, + "threadName": Any, + } + `) + }); + + it('SPTTest03', function () { + let spt = new SPT(); + spt = { + process: "process", + processId: 0, + thread: "thread", + threadId: 0, + state: "state", + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "priority", + note: "note", + } + expect(spt).not.toBeUndefined() + expect(spt).toMatchInlineSnapshot({ + process: expect.any(String), + processId: expect.any(Number), + thread: expect.any(String), + threadId: expect.any(Number), + state: expect.any(String), + dur: expect.any(Number), + start_ts: expect.any(Number), + end_ts: expect.any(Number), + cpu: expect.any(Number), + priority: expect.any(String), + note: expect.any(String) }, ` + Object { + "cpu": Any, + "dur": Any, + "end_ts": Any, + "note": Any, + "priority": Any, + "process": Any, + "processId": Any, + "start_ts": Any, + "state": Any, + "thread": Any, + "threadId": Any, + } + `) }); }) diff --git a/host/ide/test/trace/bean/ThreadStruct.test.ts b/host/ide/test/trace/bean/ThreadStruct.test.ts index 82c8abf..18b16f1 100644 --- a/host/ide/test/trace/bean/ThreadStruct.test.ts +++ b/host/ide/test/trace/bean/ThreadStruct.test.ts @@ -64,6 +64,11 @@ describe('ThreadStruct Test', () => { expect(ThreadStruct.draw(ctx, dataSource)).toBeUndefined() }); + it('ThreadStructTest11', function () { + dataSource.state = "T"||"t" + expect(ThreadStruct.draw(ctx, dataSource)).toBeUndefined() + }); + it('ThreadStructTest06', function () { expect(ThreadStruct.drawString(ctx, '', 2, dataSource.frame)).toBeUndefined() }); diff --git a/host/ide/test/trace/component/DisassemblingWindow.test.ts b/host/ide/test/trace/component/DisassemblingWindow.test.ts new file mode 100644 index 0000000..f96a3a2 --- /dev/null +++ b/host/ide/test/trace/component/DisassemblingWindow.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {DisassemblingWindow,Disassembling} from "../../../dist/trace/component/DisassemblingWindow.js" + +describe('DisassemblingWindow Test', () => { + let disassemblingWindow = new DisassemblingWindow(); + + it('DisassemblingWindowTest01', function () { + expect(disassemblingWindow.getMap("","")).not.toBeUndefined(); + }); + + it('DisassemblingWindowTest02', function () { + expect(disassemblingWindow.resetCanvas(2,1,1,1)).toBeUndefined(); + }); + + it('DisassemblingWindowTest03', function () { + document.body.innerHTML = '
      ' + let disassemblingWindow = document.querySelector('#ccc') as DisassemblingWindow + expect(disassemblingWindow.showLoading()).toBeUndefined(); + }); +}) diff --git a/host/ide/test/trace/component/FrameChart.test.ts b/host/ide/test/trace/component/FrameChart.test.ts index 71c0410..08dbc72 100644 --- a/host/ide/test/trace/component/FrameChart.test.ts +++ b/host/ide/test/trace/component/FrameChart.test.ts @@ -16,62 +16,182 @@ // @ts-ignore import {FrameChart} from "../../../dist/trace/component/FrameChart.js" - describe('FrameChart Test', () => { let node= [ {children: ''}, {children:{length:1}} - ] - + ] + let selectData = [length=1] + document.body.innerHTML = '' + let frameChart = document.querySelector('#ccc') as FrameChart it('FrameChartTest01', function () { - let frameChart = new FrameChart(); - frameChart.data = false; - expect(frameChart.data).toBeFalsy(); + frameChart.tabPaneScrollTop = false; + expect(frameChart.tabPaneScrollTop).toBeFalsy(); }); it('FrameChartTest02', function () { + expect(frameChart.updateFloatHint()).toBeUndefined(); + }); + + it('FrameChartTest03', function () { + frameChart.calculateChartData = jest.fn(()=>true) + expect(frameChart.redrawChart(selectData)).toBeUndefined(); + }); + + it('FrameChartTest05', function () { + let index = frameChart.scale(2) + expect(index).toBe(undefined); + }); + + it('FrameChartTest08', function () { + frameChart.translationDraw = jest.fn(()=>true) + expect(frameChart.translation()).toBeUndefined(); + }); + + it('FrameChartTest14', function () { let frameChart = new FrameChart(); - expect(frameChart.data).toBeUndefined(); + frameChart.translationDraw = jest.fn(()=>true) + expect(frameChart.translation(-1)).toBeUndefined(); }); - it('FrameChartTest03', function () { + it('FrameChartTest09', function () { + frameChart.selectTotalCount = false; + expect(frameChart.selectTotalCount).toBeFalsy(); + }); + + it('FrameChartTest11', function () { let frameChart = new FrameChart(); - frameChart.selectTotalSize = true; - expect(frameChart.selectTotalSize).toBeUndefined(); + frameChart.drawScale = jest.fn(()=>true) + expect(frameChart.calculateChartData()).not.toBeUndefined(); }); - it('FrameChartTest04', function () { + it('FrameChartTest12', function () { + expect(frameChart.updateCanvas()).toBeUndefined(); + }); + + it('FrameChartTest13', function () { let frameChart = new FrameChart(); - frameChart.maxDepth = true; - expect(frameChart.maxDepth).toBeUndefined(); + frameChart.translationDraw = jest.fn(()=>true) + frameChart.lastCanvasXInScale = 0 + expect(frameChart.translationByScale()).toBe(undefined); }); - it('FrameChartTest05',function () { + it('FrameChartTest21', function () { let frameChart = new FrameChart(); - let result = frameChart.cavasContext.lineWidth ; - expect(result).toBe(1); - }) + frameChart.translationDraw = jest.fn(()=>true) + frameChart.canvasX = 4 + frameChart.lastCanvasXInScale = 1 + expect(frameChart.translationByScale()).toBe(undefined); + }); - it('FrameChartTest06', function () { + it('FrameChartTest22', function () { let frameChart = new FrameChart(); + frameChart.translationDraw = jest.fn(()=>true) + expect(frameChart.translationByScale(1)).toBe(undefined); + }); + it('FrameChartTest211', function () { + expect(frameChart.searchData([],2,2)).toBeNull(); + }); + + it('FrameChartTest15', function () { + let frameChart = new FrameChart(); + frameChart.calculateChartData = jest.fn(()=>true) + frameChart.xPoint = 1 + expect(frameChart.translationDraw()).toBe(undefined); + }); + + it('FrameChartTest16', function () { + expect(frameChart.onMouseClick({button:0})).toBeUndefined(); + }); + + it('FrameChartTest17', function () { + let frameChart = new FrameChart(); + expect(frameChart.initHtml()).toMatchInlineSnapshot(` +" + + +
      " +`); + }); + + it('FrameChartTest18', function () { + let frameChart = new FrameChart(); + expect(frameChart.drawFrameChart(node)).toBeUndefined(); + }); + + it('FrameChartTest19', function () { + let frameChart = new FrameChart(); + frameChart.searchData = jest.fn(()=>true) + frameChart.calculateChartData = jest.fn(()=>true) + expect(frameChart.onMouseMove()).toBeUndefined(); + }); + + it('FrameChartTest20', function () { + expect(frameChart.searchData([],1,1)).toBeNull(); + }); + + it('FrameChartTest23', function () { + expect(frameChart.onMouseClick({button:2})).toBeUndefined(); + }); + + it('FrameChartTest24', function () { + document.body.innerHTML = `` expect(frameChart.drawScale()).toBeUndefined(); }); - it('FrameChartTest07', function () { + it('FrameChartTest25', function () { let frameChart = new FrameChart(); - expect(frameChart.calculateChartData()).toBeUndefined(); + frameChart.selectTotalSize = false; + expect(frameChart.selectTotalSize).toBeFalsy(); }); - it('FrameChartTest08', function () { + it('FrameChartTest26', function () { let frameChart = new FrameChart(); - expect(frameChart.darwTypeChart(node)).toBeUndefined(); + frameChart.maxDepth = false; + expect(frameChart.maxDepth).toBeFalsy(); }); - it('FrameChartTest09', function () { + + it('FrameChartTest27 ', function () { + let frameChart = new FrameChart(); + expect(frameChart.calMaxDepth(node,1)).toBeUndefined() + }); + + it('FrameChartTest28 ', function () { + let frameChart = new FrameChart(); + expect(frameChart.mode).toBeUndefined() + }); + + it('FrameChartTest29', function () { let frameChart = new FrameChart(); - frameChart.mode = true; - expect(frameChart.mode).toBeTruthy(); + frameChart.mode =false + expect(frameChart.mode).toBeFalsy() + }); + + it('FrameChartTest30', function () { + frameChart.caldrawArgs = jest.fn(()=>true) + expect(frameChart.caldrawArgs()).toBeTruthy() }); -}) \ No newline at end of file +}) diff --git a/host/ide/test/trace/component/SpFilter.test.ts b/host/ide/test/trace/component/SpFilter.test.ts new file mode 100644 index 0000000..78d78ce --- /dev/null +++ b/host/ide/test/trace/component/SpFilter.test.ts @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpFilter} from "../../../dist/trace/component/SpFilter.js" + +describe('SpFilter Test', () => { + + let spFilter = new SpFilter(); + + it('SpFilterTest01', function () { + expect(spFilter.initElements()).toBeUndefined() + }); + + it('SSpFilterTest01', function () { + expect(spFilter.initHtml()).toMatchInlineSnapshot(` +" + +
      + Input Filter +
      + + +
      +
      + " +`) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/SpInfoAndStas.test.ts b/host/ide/test/trace/component/SpInfoAndStas.test.ts new file mode 100644 index 0000000..9790267 --- /dev/null +++ b/host/ide/test/trace/component/SpInfoAndStas.test.ts @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpInfoAndStats} from "../../../dist/trace/component/SpInfoAndStas.js" + +describe('SpInfoAndStasTest', ()=> { + document.body.innerHTML = `` + let spInfoAndStats = document.querySelector('#ddd') as SpInfoAndStats + it('SpInfoAndStasTest01', function () { + let spInfoAndStats =new SpInfoAndStats(); + expect(spInfoAndStats.initElements()).toBeUndefined() + }); + + it('SpInfoAndStasTest03', function () { + spInfoAndStats.initMetricItemData = jest.fn(()=>true) + expect(spInfoAndStats.initMetricItemData()).toBeTruthy() + }); + + it('SpInfoAndStasTest04', function () { + let spInfoAndStats =new SpInfoAndStats(); + expect(spInfoAndStats.initDataTableStyle({children: + [{length:1,style:{backgroundColor:'var(--dark-background5,#F6F6F6)'}}] + })).toBeUndefined() + }); + + it('SpInfoAndStasTest06 ', function () { + expect(spInfoAndStats.connectedCallback()).toBeUndefined() + + }); + + it('SpInfoAndStasTest07 ', function () { + expect(spInfoAndStats.disconnectedCallback()).toBeUndefined() + + }); + + it('SpInfoAndStasTest08 ', function () { + expect(spInfoAndStats.attributeChangedCallback([],[],[])).toBeUndefined() + + }); + + it('SpInfoAndStasTest05', function () { + expect(spInfoAndStats.initHtml()).toMatchInlineSnapshot(` +" + + +
      + + +
      + " +`); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/SpMetrics.test.ts b/host/ide/test/trace/component/SpMetrics.test.ts new file mode 100644 index 0000000..fee996b --- /dev/null +++ b/host/ide/test/trace/component/SpMetrics.test.ts @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpMetrics} from "../../../dist/trace/component/SpMetrics.js" + +describe('SpMetrics Test', () => { + let spMetrics = new SpMetrics(); + it('SpMetricsTest01', function () { + expect(SpMetrics.initElements).toBeUndefined() + }); + it('SpMetricsTest02', function () { + expect(spMetrics.metric).toBe("") + }); + it('SpMetricsTest03', function () { + spMetrics.metric = true; + expect(spMetrics.metric).toBe("") + }); + it('SpMetricsTest04', function () { + expect(spMetrics.metricResult).toBe("") + + }); + it('SpMetricsTest05', function () { + spMetrics.metricResult = true; + expect(spMetrics.metricResult).toBeTruthy() + }); + + it('SpMetricsTest06', function () { + expect(spMetrics.attributeChangedCallback("metric")).toBeUndefined() + }); + + it('SpMetricsTest07', function () { + expect(spMetrics.attributeChangedCallback("metricResult")).toBeUndefined() + }); + + it('SpMetricsTest08', function () { + expect(spMetrics.initHtml()).toMatchInlineSnapshot(` +" + + +
      +
      +

      Select a metric

      + + +
      +
      + +
      +
      + " +`); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/SpQuerySQL.test.ts b/host/ide/test/trace/component/SpQuerySQL.test.ts new file mode 100644 index 0000000..7cd0176 --- /dev/null +++ b/host/ide/test/trace/component/SpQuerySQL.test.ts @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpQuerySQL} from "../../../dist/trace/component/SpQuerySQL.js" + +describe('SpQuerySQL Test', () => { + let spQuerySQL= new SpQuerySQL(); + + it('SpQuerySQLTest01', function () { + expect(spQuerySQL.checkSupportSqlAbility()).toBeFalsy() + }); + + it('SpQuerySQLTest02', function () { + expect(spQuerySQL.checkSafetySelectSql()).toBeTruthy() + }); + + it('SpQuerySQLTest03', function () { + expect(spQuerySQL.getSelectSqlField()).toBe("") + }); + + it('SpQuerySQLTest04', function () { + expect(spQuerySQL.getSelectSqlTableName()).not.toBeUndefined() + }); + + it('SpQuerySQLTest05', function () { + expect(spQuerySQL.initDataElement()).toBeUndefined() + }); + + it('SpQuerySQLTest06', function () { + spQuerySQL.statDataArray.length = 1 + expect(spQuerySQL.initData()).toBeUndefined() + }); + + it('SpQuerySQLTest07', function () { + expect(spQuerySQL.attributeChangedCallback()).toBeUndefined() + }); + + it('SpQuerySQLTest08', function () { + expect(spQuerySQL.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +

      Enter query and press cmd/ctrl + Enter

      + +
      +
      +

      Query result - 0 counts

      +
      +
      +
      + " +`); + }); + + it('SpQuerySQLTest09', function () { + expect(spQuerySQL.initDataTableStyle({children:[{length:3,style:{backgroundColor:'var(--dark-background5,#F6F6F6)'}}]})).toBeUndefined() + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/SpRecordTrace.test.ts b/host/ide/test/trace/component/SpRecordTrace.test.ts index 0a396a7..75d5a94 100644 --- a/host/ide/test/trace/component/SpRecordTrace.test.ts +++ b/host/ide/test/trace/component/SpRecordTrace.test.ts @@ -15,30 +15,40 @@ // @ts-ignore import {SpRecordTrace} from "../../../dist/trace/component/SpRecordTrace.js" +// @ts-ignore +import {SpAllocations} from "../../../dist/trace/component/setting/SpAllocations"; + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), observe: jest.fn(), unobserve: jest.fn(), })); -describe('SpRecordTrace Test', () => { - - let spRecordTrace = new SpRecordTrace(); +describe('SpRecordTrace Test', () => { + document.body.innerHTML = `` + let spRecordTrace = document.querySelector('#aaa') as SpRecordTrace it('SpRecordTraceTest01', function () { - expect(spRecordTrace.initHtml()).not.toBe('') + expect(SpRecordTrace.initHtml).not.toBe('') }); + it('SpRecordTraceTest02', function () { - expect(spRecordTrace.initElements()).toBeUndefined() - }); - it('SpRecordTraceTest03', function () { - let toReturnWith = spRecordTrace.createFpsPluginConfig(); - expect(toReturnWith.sampleInterval).toBe(1000); + SpRecordTrace.patentNode=jest.fn(()=>true); + expect(SpRecordTrace.initElements).toBeUndefined() }); + it('SpRecordTraceTest04', function () { - let traceEvents = spRecordTrace.createTraceEvents(['Scheduling details', 'CPU Frequency and idle states', - 'High frequency memory', 'Advanced ftrace config', 'Syscalls']); + let traceEvents = SpRecordTrace.createTraceEvents = ['Scheduling details', 'CPU Frequency and idle states', + 'High frequency memory', 'Advanced ftrace config', 'Syscalls' , 'Board voltages & frequency']; expect(traceEvents[0].indexOf('binder/binder_lock')).toBe(-1) }); + it('SpRecordTraceTest05', function () { + SpAllocations.appProcess = jest.fn(()=>"") + expect(spRecordTrace.createNativePluginConfig({},1)).not.toBeUndefined() + }); + + it('SpRecordTraceTest06', function () { + expect(spRecordTrace.createFpsPluginConfig()).not.toBeUndefined() + }); }) diff --git a/host/ide/test/trace/component/SpRecyclerSystemTrace.test.ts b/host/ide/test/trace/component/SpRecyclerSystemTrace.test.ts index 140f8b6..004625b 100644 --- a/host/ide/test/trace/component/SpRecyclerSystemTrace.test.ts +++ b/host/ide/test/trace/component/SpRecyclerSystemTrace.test.ts @@ -26,6 +26,11 @@ import {SpRecyclerSystemTrace} from "../../../dist/trace/component/SpRecyclerSys describe('SpRecyclerSystemTrace Test', ()=>{ let spRecyclerSystemTrace = new SpRecyclerSystemTrace(); + const newEl=1; + const targetEl = { + parentNode:1, + nextSibling:1 + } spRecyclerSystemTrace.initElements = jest.fn(()=> true) @@ -86,9 +91,58 @@ describe('SpRecyclerSystemTrace Test', ()=>{ it('SpRecyclerSystemTraceTest13', function () { expect(spRecyclerSystemTrace.init).toBeTruthy() }); - it('SpRecyclerSystemTraceTest14', function () { - let spRecyclerSystemTrace = new SpRecyclerSystemTrace; - expect(spRecyclerSystemTrace.insertAfter).toBeTruthy() + + it('SpRecyclerSystemTraceTest15', function () { + spRecyclerSystemTrace.loadDatabaseUrl = jest.fn(()=>true) + expect(spRecyclerSystemTrace.loadDatabaseUrl()).toBeTruthy() + }); + + it('SpRecyclerSystemTraceTest16', function () { + spRecyclerSystemTrace.loadDatabaseArrayBuffer = jest.fn(()=>true) + expect(spRecyclerSystemTrace.loadDatabaseArrayBuffer()).toBeTruthy() }); + it('SpRecyclerSystemTraceTest17', function () { + expect(spRecyclerSystemTrace.initHtml()).toMatchInlineSnapshot(` +" + +
      + + + + + + +
      + " +`) + }); }) diff --git a/host/ide/test/trace/component/SpSystemTrace.test.ts b/host/ide/test/trace/component/SpSystemTrace.test.ts index 10e6d11..f13f0fa 100644 --- a/host/ide/test/trace/component/SpSystemTrace.test.ts +++ b/host/ide/test/trace/component/SpSystemTrace.test.ts @@ -14,7 +14,11 @@ */ // @ts-ignore -import {SpSystemTrace} from "../../../dist/trace/component/SpSystemTrace.js" +import {SpSystemTrace} from "../../../dist/trace/component/SpSystemTrace.js"; +// @ts-ignore +import {TraceRow} from "../../../dist/trace/component/trace/base/TraceRow"; +// @ts-ignore +import {procedurePool} from "../../../dist/trace/database/Procedure.js" window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ @@ -25,6 +29,12 @@ window.ResizeObserver = window.ResizeObserver || describe('SpSystemTrace Test', ()=>{ let spSystemTrace = new SpSystemTrace(); + const offset = 1 + const callback=true + const rowId="" + const rowParentId="" + const rowType="" + const smooth=true spSystemTrace.initElements = jest.fn(()=> true) @@ -51,12 +61,19 @@ describe('SpSystemTrace Test', ()=>{ }); it('SpSystemTraceTest06', function () { - expect(spSystemTrace.documentOnMouseUp('MouseUp')).toBeUndefined() + spSystemTrace.timerShaftEL = jest.fn(()=>null) + spSystemTrace.timerShaftEL.sportRuler = jest.fn(()=>undefined) + spSystemTrace.timerShaftEL.sportRuler.frame = jest.fn(()=>"") + spSystemTrace.timerShaftEL.canvas = jest.fn(()=> undefined) + spSystemTrace.timerShaftEL.canvas.offsetLeft = jest.fn(()=>1) + spSystemTrace.timerShaftEL.sportRuler.frame.contains = jest.fn(()=>true) + spSystemTrace.documentOnMouseUp = jest.fn(()=>true) + expect(spSystemTrace.documentOnMouseUp('MouseUp')).toBeTruthy() }); it('SpSystemTraceTest07', function () { - spSystemTrace.rangeSelect = jest.fn(()=>true) - spSystemTrace.rangeSelect.mouseMove = jest.fn(()=>true) + spSystemTrace.timerShaftEL = jest.fn(()=>undefined) + spSystemTrace.timerShaftEL.isScaling = jest.fn(()=>true) expect(spSystemTrace.documentOnMouseMove('MouseMove')).toBeUndefined() }); @@ -68,23 +85,117 @@ describe('SpSystemTrace Test', ()=>{ expect(spSystemTrace.selectStructNull('')).toBeUndefined() }); - it('SpSystemTraceTest10', function () { - expect(spSystemTrace.documentOnClick('OnClick')).toBeUndefined() - }); - it('SpSystemTraceTest11', function () { expect(spSystemTrace.connectedCallback()).toBeUndefined() }); it('SpSystemTraceTest12', function () { + spSystemTrace.timerShaftEL.removeEventListener = jest.fn(()=>true) expect(spSystemTrace.disconnectedCallback()).toBeUndefined() }); - it('SpSystemTraceTest13', function () { - expect(spSystemTrace.goProcess).toBeTruthy() - }); - it('SpSystemTraceTest14', function () { expect(spSystemTrace.loadDatabaseUrl).toBeTruthy() }); + + it('SpSystemTraceTest15', function () { + spSystemTrace.rowsEL = jest.fn(()=>true) + spSystemTrace.rowsEL.scrollTo = jest.fn(()=>true) + spSystemTrace.rowsEL.removeEventListener = jest.fn(()=>true) + spSystemTrace.rowsEL.addEventListener = jest.fn(()=>true) + expect(spSystemTrace.rowScrollTo(offset,callback)).toBeUndefined() + }); + + it('SpSystemTraceTest16', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(spSystemTrace.onClickHandler()).toBeUndefined() + }); + + it('SpSystemTraceTest17', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(spSystemTrace.search()).toBeUndefined() + }); + + it('SpSystemTraceTest18', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(spSystemTrace.searchCPU()).not.toBeUndefined() + }); + + it('SpSystemTraceTest19', function () { + expect(spSystemTrace.initHtml()).toMatchInlineSnapshot(` +" + +
      + + +
      +
      + + +
      + " +`); + }); + + it('SpSystemTraceTest20', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + // @ts-ignore + TraceRow.range = jest.fn(()=>undefined) + TraceRow.range.startNS = jest.fn(()=>1) + spSystemTrace.onClickHandler = jest.fn(()=>true) + expect(spSystemTrace.showPreCpuStruct(1,[{length:0}])).toBe(0) + }); + + it('SpSystemTraceTest21', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + // @ts-ignore + TraceRow.range = jest.fn(()=>undefined) + TraceRow.range.startNS = jest.fn(()=>1) + spSystemTrace.onClickHandler = jest.fn(()=>true) + expect(spSystemTrace.showNextCpuStruct(1,[{length:0}])).toBe(0) + }); + + it('SpSystemTraceTest22', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + procedurePool.clearCache = jest.fn(()=>true) + expect(spSystemTrace.reset()).toBeUndefined() + }); + + it('SpSystemTraceTest23', function () { + let spSystemTrace = new SpSystemTrace({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + + expect(spSystemTrace.hasTable([],"")).toBeUndefined() + }); }) diff --git a/host/ide/test/trace/component/SpWelcomePage.test.ts b/host/ide/test/trace/component/SpWelcomePage.test.ts new file mode 100644 index 0000000..a905503 --- /dev/null +++ b/host/ide/test/trace/component/SpWelcomePage.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpWelcomePage} from "../../../dist/trace/component/SpWelcomePage.js" + +describe('SpWelcomePage Test', () => { + + let spWelcomePage = new SpWelcomePage(); + + it('SpWelcomePageTest01', function () { + expect(spWelcomePage.initElements()).toBeUndefined() + }); + + it('SpWelcomePageTest01', function () { + expect(spWelcomePage.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + " +`) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/Sptext.test.ts b/host/ide/test/trace/component/Sptext.test.ts new file mode 100644 index 0000000..f4484d4 --- /dev/null +++ b/host/ide/test/trace/component/Sptext.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {Sptext} from "../../../dist/trace/component/Sptext.js" + +describe('Sptext Test', () => { + + let sptext = new Sptext(); + + it('SptextTest01', function () { + expect(sptext.initElements()).toBeUndefined() + }); + + it('SptextTest01', function () { + expect(sptext.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + + + + +
      +
      + " +`) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/StackBar.test.ts b/host/ide/test/trace/component/StackBar.test.ts index 271c3b5..d43eb0c 100644 --- a/host/ide/test/trace/component/StackBar.test.ts +++ b/host/ide/test/trace/component/StackBar.test.ts @@ -23,14 +23,17 @@ describe('StackBar Test', () => { it('StackBarTest01', function () { expect(stackBar.initHtml()).not.toBe('') }); + it('StackBarTest02', function () { expect(stackBar.initElements()).toBeUndefined() }); + it('StackBarTest03', function () { let stateWidth = stackBar.getStateWidth('state'); let hasWidth = stateWidth > 0; expect(hasWidth).toBeTruthy(); }); + it('StackBarTest04', function () { let htmlDivElement = stackBar.createBarElement({ state: "", @@ -40,4 +43,25 @@ describe('StackBar Test', () => { let hasDivEl = htmlDivElement.toLocaleString().length > 5; expect(hasDivEl).toBeTruthy(); }); + + it('StackBarTest05', function () { + expect(stackBar.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + " +`); + }); }) diff --git a/host/ide/test/trace/component/hiperf/PerfDataQuery.test.ts b/host/ide/test/trace/component/hiperf/PerfDataQuery.test.ts new file mode 100644 index 0000000..3ed187d --- /dev/null +++ b/host/ide/test/trace/component/hiperf/PerfDataQuery.test.ts @@ -0,0 +1,548 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +//@ts-ignore +import {PerfDataQuery, perfDataQuery} from "../../../../dist/trace/component/hiperf/PerfDataQuery.js" + +describe('perfDataQuery Test',()=>{ + + it('perfDataQueryTest01 ', function () { + let callChain = { + symbolId:-1, + fileId:1, + fileName:"unkown", + vaddrInFile:1, + } + expect(perfDataQuery.setCallChainName(callChain)).toBe("+0x1"); + }); + + it('perfDataQueryTest15 ', function () { + let callChain = { + symbolId:0, + fileId:1, + fileName:"unkown", + vaddrInFile:1, + } + expect(perfDataQuery.setCallChainName(callChain)).toBe("+0x1"); + }); + + it('perfDataQueryTest02 ', function () { + let callChain = { + tid:1, + threadState:"", + bottomUpMerageId:"1", + } + perfDataQuery.threadData[callChain.tid] = jest.fn(()=>[]) + perfDataQuery.threadData[callChain.tid].threadName = jest.fn(()=>"") + expect(perfDataQuery.addProcessThreadStateData(callChain)).toBeUndefined(); + }); + + it('perfDataQueryTest03 ', function () { + perfDataQuery.groupNewTreeNoId = jest.fn(()=>true) + expect(perfDataQuery.getCallChainsBySampleIds([{length:1}],true)).not.toBeUndefined(); + }); + + it('perfDataQueryTest04 ', function () { + perfDataQuery.mapGroupBy = jest.fn(()=>true) + expect(perfDataQuery.recursionCreateData("","",true)).toBeUndefined(); + }); + + it('perfDataQueryTest05 ', function () { + let merageData = { + parentId:1, + parentNode:"", + } + expect(perfDataQuery.recursionCreateTree(merageData)).toBeUndefined(); + }); + + it('perfDataQueryTest06 ', function () { + let callChain = [{name:""}] + let currentNode = { + initChildren:[], + id:"", + children:[], + } + expect(perfDataQuery.merageChildren(currentNode,callChain,true)).toBeUndefined(); + }); + + it('perfDataQueryTest07 ', function () { + perfDataQuery.perfDataQuery = jest.fn(()=>true) + expect(perfDataQuery.splitTree([],"",true,true)).toBeUndefined(); + }); + + it('perfDataQueryTest08 ', function () { + expect(perfDataQuery.clearSplitMapData("name")).toBeUndefined(); + }); + + it('perfDataQueryTest09 ', function () { + expect(perfDataQuery.resetAllNode([])).toBeUndefined(); + }); + + it('perfDataQueryTest10 ', function () { + expect(perfDataQuery.searchData([],'')).toBeUndefined(); + }); + + it('perfDataQueryTest11 ', function () { + expect(perfDataQuery.findSearchNode([],'')).toBeUndefined(); + }); + + it('perfDataQueryTest12 ', function () { + expect(perfDataQuery.initPrefData()).toBeUndefined(); + }); + + it('perfDataQueryTest13 ', function () { + expect(perfDataQuery.initCallChain([])).toBeUndefined(); + }); + + it('perfDataQueryTest14 ', function () { + expect(perfDataQuery.initCallChainBottomUp([])).toBeUndefined(); + }); + + it('perfDataQueryTest16 ', function () { + expect(perfDataQuery.groupByCallChain([],true)).not.toBeUndefined(); + }); + + it('perfDataQueryTest17 ', function () { + let callChainsData = [{ + tid: 0, + pid: 0, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + },{ + tid: 1, + pid: 1, + name: "", + fileName: "", + threadState: "", + startNS: 1, + dur: 1, + sampleId: 1, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + expect(perfDataQuery.initCallChain(callChainsData)).toBeUndefined(); + }); + + it('perfDataQueryTest18 ', function () { + let callChainsData = [{ + tid: 100, + pid: 100, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + },{ + tid: 111, + pid: 111, + name: "", + fileName: "", + threadState: "", + startNS: 11, + dur: 11, + sampleId: 11, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + },{ + tid: 222, + pid: 222, + name: "", + fileName: "", + threadState: "", + startNS: 22, + dur: 22, + sampleId: 22, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: 0, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + expect(perfDataQuery.initCallChainBottomUp(callChainsData)).toBeUndefined(); + }); + + it('perfDataQueryTest19 ', function () { + let callChainsData = [{ + tid: 100, + pid: 100, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: -1, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + expect(perfDataQuery.setCallChainName(callChainsData)).not.toBeUndefined(); + }); + + it('perfDataQueryTest20 ', function () { + let callChainsData = [{ + tid: 100, + pid: 100, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: -1, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + expect(perfDataQuery.groupByCallChain(callChainsData, true)).not.toBeUndefined(); + }); + it('perfDataQueryTest21 ', function () { + perfDataQuery.groupNewTreeNoId = jest.fn(()=>true); + let sampleIds = [{ + tid: 10, + pid: 100, + length: 0, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: -1, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + expect(perfDataQuery.getCallChainsBySampleIds(sampleIds, true)).not.toBeUndefined(); + }); + + it('perfDataQueryTest12 ', function () { + let callChainsData = [{ + tid: 100, + pid: 100, + name: "", + fileName: "", + threadState: "", + startNS: 0, + dur: 0, + sampleId: 0, + callChainId: 0, + vaddrInFile: 0, + fileId: 0, + symbolId: -1, + path: "", + parentId: "", + id: "", + topDownMerageId: "", + topDownMerageParentId: "", + bottomUpMerageId: "", + bottomUpMerageParentId: "", + depth: 0, + previousNode: undefined, + nextNode: undefined, + }] + + let currentData = { + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.merageChildren(currentData, callChainsData,true)).toBeUndefined(); + }); + it('perfDataQueryTest14 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.recursionChargeInitTree(node,'',true)).toBeUndefined(); + + }); + + it('perfDataQueryTest15 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.recursionChargeTree(node,'',true)).toBeUndefined(); + + }); + + it('perfDataQueryTest16 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.recursionPruneInitTree(node,'',true)).toBeUndefined(); + + }); + + it('perfDataQueryTest17 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.recursionPruneTree(node,'',true)).toBeUndefined(); + + }); + + it('perfDataQueryTest18 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.recursionChargeByRule(node,'',true)).toBeUndefined(); + + }); + + it('perfDataQueryTest19 ', function () { + let node ={ + id: "", + parentId: "", + currentTreeParentNode: undefined, + symbolName: "", + symbol: "", + libName: "", + path: "", + self: "0s", + weight: "", + selfDur: 0, + dur: 0, + tid: 0, + pid: 0, + isStore: 0, + children: [], + initChildren: [], + type: 0, + vaddrInFile: 0, + isSelected: false, + searchShow: true, + } + expect(perfDataQuery.pruneChildren(node,'')).toBeUndefined(); + + }); + + it('perfDataQueryTest20 ', function () { + + expect(perfDataQuery.clearSplitMapData('')).toBeUndefined(); + + }); + it('perfDataQueryTest21 ', function () { + expect(perfDataQuery.clearSearchNode()).toBeUndefined(); + }); + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/CpuStrategy.test.ts b/host/ide/test/trace/component/metrics/CpuStrategy.test.ts new file mode 100644 index 0000000..b8d6a5e --- /dev/null +++ b/host/ide/test/trace/component/metrics/CpuStrategy.test.ts @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initTest,initCpuStrategyData} from "../../../../dist/trace/component/metrics/CpuStrategy.js"; + +describe('CpuStrategy Test', () => { + const metricData=[{ + length:1, + event_name:"name", + stat_type:1, + count:1, + source:1, + serverity:0, + avg_frequency:null, + cpu:1, + min_freq:"", + max_freq:"", + duration:1, + process_name:"", + thread_name:"" + }] + + it('initTestTest01', () => { + expect(initTest(metricData)).toBeTruthy(); + }); + + it('initCpuStrategyDataTest02', () => { + expect(initCpuStrategyData(metricData)).toBeTruthy(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/DistributeTermStrategy.test.ts b/host/ide/test/trace/component/metrics/DistributeTermStrategy.test.ts new file mode 100644 index 0000000..f765314 --- /dev/null +++ b/host/ide/test/trace/component/metrics/DistributeTermStrategy.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initDistributedTermData} from "../../../../dist/trace/component/metrics/DistributeTermStrategy.js"; + +describe('DistributeTermStrategy Test', () => { + let metricData=[{ + length:1, + funName:"name", + ts:"ts", + dur:"", + flag: 'fd,fdsf.fds', + trace_name:"name1", + chainId:"1", + spanId:"span", + parentSpanId:"", + processId:"", + threadId:"", + threadName:"", + processName:"" + }] + it('initDistributedTermDataTest01', () => { + expect(initDistributedTermData(metricData)).toBeTruthy(); + }); + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/MemAggStrategy.test.ts b/host/ide/test/trace/component/metrics/MemAggStrategy.test.ts new file mode 100644 index 0000000..552f520 --- /dev/null +++ b/host/ide/test/trace/component/metrics/MemAggStrategy.test.ts @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initMemoryAggStrategy} from "../../../../dist/trace/component/metrics/MemAggStrategy.js"; + +describe('MemAggStrategy Test', () => { + + it('initMemoryAggStrategyTest01', () => { + const metricData=[{ + length:1, + processName:"name", + name:"oom_score_adj", + value:"", + ts:"" + }] + expect(initMemoryAggStrategy(metricData)).toBeTruthy(); + }); + + it('initMemoryAggStrategyTest02', () => { + const metricData=[{ + length:1, + processName:"name", + name:"mem.rss.anon", + value:"", + ts:"" + }] + expect(initMemoryAggStrategy(metricData)).toBeTruthy(); + }); + + it('initMemoryAggStrategyTest03', () => { + const metricData=[{ + length:1, + processName:"name", + name:"mem.swap", + value:"", + ts:"" + }] + expect(initMemoryAggStrategy(metricData)).toBeTruthy(); + }); + + it('initMemoryAggStrategyTest04', () => { + const metricData=[{ + length:1, + processName:"name", + name:"mem.rss.file", + value:"", + ts:"" + }] + expect(initMemoryAggStrategy(metricData)).toBeTruthy(); + }); + + it('initMemoryAggStrategyTest05', () => { + const metricData=[{ + length:1, + processName:"name", + name:"oom_score_adj", + value:"", + ts:"" + }] + expect(initMemoryAggStrategy(metricData)).toBeTruthy(); + }) +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/MemStrategy.test.ts b/host/ide/test/trace/component/metrics/MemStrategy.test.ts new file mode 100644 index 0000000..e701f50 --- /dev/null +++ b/host/ide/test/trace/component/metrics/MemStrategy.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initMemoryStrategy} from "../../../../dist/trace/component/metrics/MemStrategy.js"; + +describe('MemStrategy Test', () => { + const metricData=[{ + length:1, + minNum:"name", + maxNum:"", + avgNum:"", + processName:"" + }] + + it('initMemoryStrategyTest01', () => { + expect(initMemoryStrategy(metricData)).toBeTruthy(); + + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/MetaDataStrategy.test.ts b/host/ide/test/trace/component/metrics/MetaDataStrategy.test.ts new file mode 100644 index 0000000..7e81338 --- /dev/null +++ b/host/ide/test/trace/component/metrics/MetaDataStrategy.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initMetaDataStrategy} from "../../../../dist/trace/component/metrics/MetaDataStrategy.js"; + +describe('MetaDataStrategy Test', () => { + const metricData=[{ + length:1, + name:"name", + valueText:"", + }] + + it('initMetaDataStrategyTest01', () => { + expect(initMetaDataStrategy(metricData)).toBeTruthy(); + + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/SysCallsStrategy.test.ts b/host/ide/test/trace/component/metrics/SysCallsStrategy.test.ts new file mode 100644 index 0000000..eb8dd09 --- /dev/null +++ b/host/ide/test/trace/component/metrics/SysCallsStrategy.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initSysCallsStrategy} from "../../../../dist/trace/component/metrics/SysCallsStrategy.js"; + +describe('SysCallsStrategy Test', () => { + const metricData=[{ + length:1, + funName:"name", + maxDur:"", + minDur:"", + avgDur:"" + }] + + it('initMetaDataStrategyTest01', () => { + expect(initSysCallsStrategy(metricData)).toBeTruthy(); + + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/SysCallsTopStrategy.test.ts b/host/ide/test/trace/component/metrics/SysCallsTopStrategy.test.ts new file mode 100644 index 0000000..2e81216 --- /dev/null +++ b/host/ide/test/trace/component/metrics/SysCallsTopStrategy.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initSysCallsTopStrategy} from "../../../../dist/trace/component/metrics/SysCallsTopStrategy.js"; + +describe('SysCallsTopStrategy Test', () => { + const metricData=[{ + length:1, + pid:"pi", + tid:"ti", + process_name:"", + maxDur:"name", + minDur:"", + avgDur:"", + funName:"" + }] + + it('initSysCallsTopStrategyTest01', () => { + expect(initSysCallsTopStrategy(metricData)).toBeTruthy(); + + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/TraceStatsStrategy.test.ts b/host/ide/test/trace/component/metrics/TraceStatsStrategy.test.ts new file mode 100644 index 0000000..38c66a5 --- /dev/null +++ b/host/ide/test/trace/component/metrics/TraceStatsStrategy.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initTraceStateStrategy} from "../../../../dist/trace/component/metrics/TraceStatsStrategy.js"; + +describe('TraceTaskStrategy Test', () => { + let metricData=[{ + length:1, + event_name:"name", + count:1, + source:1, + serverity:0, + }] + it('initTraceStateStrategyTest01', () => { + expect(initTraceStateStrategy(metricData)).toBeTruthy(); + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/metrics/TraceTaskStrategy.test.ts b/host/ide/test/trace/component/metrics/TraceTaskStrategy.test.ts new file mode 100644 index 0000000..be12008 --- /dev/null +++ b/host/ide/test/trace/component/metrics/TraceTaskStrategy.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {initTraceTaskStrategy} from "../../../../dist/trace/component/metrics/TraceTaskStrategy.js"; + + +describe('TraceTaskStrategy Test', () => { + let metricData=[{ + length:1, + process_name:"", + thread_name:"", + pid:3 + + }] + it('initTraceTaskStrategyTest01', () => { + expect(initTraceTaskStrategy(metricData)).toBeTruthy(); + }) + +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpAllocations.test.ts b/host/ide/test/trace/component/setting/SpAllocations.test.ts index b4de0f6..98b98e9 100644 --- a/host/ide/test/trace/component/setting/SpAllocations.test.ts +++ b/host/ide/test/trace/component/setting/SpAllocations.test.ts @@ -45,7 +45,8 @@ describe('SpAllocations Test', ()=>{ expect(spEle.pid).toEqual(undefined) expect(spEle.unwind).toEqual(111) expect(spEle.shared).toEqual(0) - expect(spEle.filter).toEqual(28416) + expect(spEle.filter).toEqual(111) + }); it(' SpAllocations set attrValue', function () { @@ -75,7 +76,152 @@ describe('SpAllocations Test', ()=>{ expect(spEle.shared).toEqual(0) expect(spEle.filter).toEqual(111) }); - // it('CpuStructTest02', function () { - // expect(FpsStruct.equals({}, data)).toBeTruthy(); - // }); + + it('SpAllocations test04', function () { + let spEle = document.querySelector("#sp") as SpAllocations; + expect(spEle.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + Allocations +
      +
      + ProcessId or ProcessName : + 4194304) this.value = ''\\"> +
      +
      + Max unwind level : + 2147483647) this.value = ''\\" onkeyup=\\"this.value=this.value.replace(/\\\\D/g,'')\\" value=\\"10\\"> +
      +
      + Shared Memory Size (Must be a multiple of 4 KB) : +
      + 2147483647) this.value = ''\\" onkeyup=\\"this.value=this.value.replace(/\\\\D/g,'')\\" value=\\"8192\\"> + +
      +
      +
      + Filter Memory Size : +
      + 65535) this.value = ''\\" onkeyup=\\"this.value=this.value.replace(/\\\\\\\\D/g,'')\\" value=\\"0\\"> + +
      +
      +
      + " +`); + }); + + it('SpAllocations test05', function () { + let spAllocations = new SpAllocations(); + expect(spAllocations.appProcess).toBe("") + }); + + it('SpAllocations test06', function () { + let spAllocations = new SpAllocations(); + expect(spAllocations.convertToValue("","MB")).toBe(0) + }); + + it('SpAllocations test07', function () { + let spAllocations = new SpAllocations(); + expect(spAllocations.convertToValue("","KB")).toBe(0) + }) }) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpCheckDesBox.test.ts b/host/ide/test/trace/component/setting/SpCheckDesBox.test.ts new file mode 100644 index 0000000..31f72cb --- /dev/null +++ b/host/ide/test/trace/component/setting/SpCheckDesBox.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {SpCheckDesBox} from "../../../../dist/trace/component/setting/SpCheckDesBox.js"; + +describe('SpCheckDesBox Test', () => { + let spCheckDesBox = new SpCheckDesBox(); + + it('SpCheckDesBoxTest01', function () { + expect(spCheckDesBox.value).toBe(''); + }); + + it('SpCheckDesBoxTest02', function () { + expect(spCheckDesBox.attributeChangedCallback('checked',"","")).toBeUndefined(); + }); + + it('SpCheckDesBoxTest03', function () { + expect(spCheckDesBox.attributeChangedCallback('value',"","")).toBeUndefined(); + }); + + it('SpCheckDesBoxTest04', function () { + expect(spCheckDesBox.attributeChangedCallback('des',"","")).toBeUndefined(); + }); + + it('SpCheckDesBoxTest05', function () { + expect(spCheckDesBox.checked).toBe(false); + }); + + it('SpCheckDesBoxTest06 ', function () { + expect(spCheckDesBox.connectedCallback()).toBeUndefined() + + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpProbesConfig.test.ts b/host/ide/test/trace/component/setting/SpProbesConfig.test.ts index c105faf..3693cf6 100644 --- a/host/ide/test/trace/component/setting/SpProbesConfig.test.ts +++ b/host/ide/test/trace/component/setting/SpProbesConfig.test.ts @@ -26,10 +26,109 @@ describe('SpProbesConfig Test', ()=>{ expect(new SpProbesConfig()).not.toBeNull(); }); - it(' SpProbesConfig get Default attrValue', function () { + it(' SpProbesConfig get Default attrValue', function () { let spEle = document.querySelector("#spconfig") as SpProbesConfig expect(spEle.traceConfig).toEqual([]) expect(spEle.traceEvents).toEqual([]) expect(spEle.memoryConfig).toEqual([]) }); + + it(' SpProbesConfig test', function () { + let spEle = document.querySelector("#spconfig") as SpProbesConfig + expect(spEle.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      Record mode
      +
      +
      +
      +
      + + +
      + +
      +
      +
      +
      +
      + Memory Config +
      +
      +
      +
      + " +`); + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpRecordPerf.test.ts b/host/ide/test/trace/component/setting/SpRecordPerf.test.ts new file mode 100644 index 0000000..583b477 --- /dev/null +++ b/host/ide/test/trace/component/setting/SpRecordPerf.test.ts @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {SpRecordPerf} from "../../../../dist/trace/component/setting/SpRecordPerf.js"; + +describe('SpRecordPerf Test', ()=>{ + + let spRecordPerf = new SpRecordPerf(); + it('SpRecordPerfTest01', function () { + expect(spRecordPerf).not.toBeUndefined(); + }); + + it('SpRecordPerfTest02', function () { + expect(spRecordPerf.show).toBeFalsy(); + }); + + it('SpRecordPerfTest03', function () { + spRecordPerf.show = true; + expect(spRecordPerf.show).toBeTruthy(); + }); + + it('SpRecordPerfTest05', function () { + expect(spRecordPerf.unDisable()).toBeUndefined(); + }); + + + it('SpRecordPerfTest04', function () { + expect(spRecordPerf.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +
      + +
      + " +`); + }); + + it('SpRecordPerfTest06', function () { + expect(spRecordPerf.startSamp).toBeFalsy(); + }); + + it('SpRecordPerfTest07', function () { + spRecordPerf.startSamp = true + expect(spRecordPerf.startSamp).toBeTruthy(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpRecordSetting.test.ts b/host/ide/test/trace/component/setting/SpRecordSetting.test.ts index 0832660..71d233b 100644 --- a/host/ide/test/trace/component/setting/SpRecordSetting.test.ts +++ b/host/ide/test/trace/component/setting/SpRecordSetting.test.ts @@ -33,4 +33,127 @@ describe('SpRecordSetting Test', ()=>{ expect(spEle.maxDur).toEqual(50) }); + it(' SpRecordSetting test', function () { + let spEle = document.querySelector("#setting") as SpRecordSetting + expect(spEle.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + Record mode + Stop when full +
      +
      + In-memory buffer size + + + +
      +
      + Max duration + + + +
      +
      + " +`); + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/SpTraceCommand.test.ts b/host/ide/test/trace/component/setting/SpTraceCommand.test.ts index 6695556..54bc8d0 100644 --- a/host/ide/test/trace/component/setting/SpTraceCommand.test.ts +++ b/host/ide/test/trace/component/setting/SpTraceCommand.test.ts @@ -14,7 +14,6 @@ */ // @ts-ignore - import {SpTraceCommand} from "../../../../dist/trace/component/setting/SpTraceCommand.js"; describe('SPTraceCommand Test', ()=>{ @@ -34,8 +33,101 @@ describe('SPTraceCommand Test', ()=>{ it(' SpAllocations set attrValue', function () { let spEle = document.querySelector("#command") as SpTraceCommand - spEle.hdcCommon = "aaaaaaaaaa" - expect(spEle.hdcCommon).toEqual("aaaaaaaaaa"); + spEle.hdcCommon = "test" + expect(spEle.hdcCommon).toEqual("test"); }); + it(' SpTraceCommand test', function () { + let spEle = document.querySelector("#command") as SpTraceCommand + expect(spEle.initHtml()).toMatchInlineSnapshot(` +" + +
      + + +
      + " +`) + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/setting/utils/PluginConvertUtils.test.ts b/host/ide/test/trace/component/setting/utils/PluginConvertUtils.test.ts index 1a3a73a..aa34285 100644 --- a/host/ide/test/trace/component/setting/utils/PluginConvertUtils.test.ts +++ b/host/ide/test/trace/component/setting/utils/PluginConvertUtils.test.ts @@ -109,7 +109,7 @@ describe('PlugConvertUtils Test', ()=>{ }); it('PlugConvertUtils03', function () { - expect(PluginConvertUtils.BeanToCmdTxt(request, false)).not.toBeNull() + expect(PluginConvertUtils.BeanToCmdTxtWithObjName(request, false,'',1)).not.toBeNull() }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/TimerShaftElement.test.ts b/host/ide/test/trace/component/trace/TimerShaftElement.test.ts index d4f37f4..c7e017e 100644 --- a/host/ide/test/trace/component/trace/TimerShaftElement.test.ts +++ b/host/ide/test/trace/component/trace/TimerShaftElement.test.ts @@ -14,8 +14,9 @@ */ // @ts-ignore -import {TimerShaftElement} from "../../../../dist/trace/component/trace/TimerShaftElement.js" - +import {TimerShaftElement,ns2s,ns2x} from "../../../../dist/trace/component/trace/TimerShaftElement.js"; +// @ts-ignore +import {Rect} from "../../../../dist/trace/database/ProcedureWorkerCommon"; describe('TimerShaftElement Test', () => { let timerShaftElement = new TimerShaftElement(); @@ -28,68 +29,18 @@ describe('TimerShaftElement Test', () => { expect(timerShaftElement.cpuUsage).toBeUndefined(); }); - it('TimerShaftElementTest02', function () { - timerShaftElement.rangeRuler = jest.fn(() => false) - timerShaftElement.loadComplete = jest.fn(() => false) - timerShaftElement.rangeRuler.markA = jest.fn(() => true) - timerShaftElement.rangeRuler.markB = jest.fn(() => true) - timerShaftElement.rangeRuler.markA.frame = jest.fn(() => true) - timerShaftElement.rangeRuler.markB.frame = jest.fn(() => true) - timerShaftElement.rangeRuler.markA.frame.x = jest.fn(() => 0) - timerShaftElement.rangeRuler.markB.frame.x = jest.fn(() => true) - timerShaftElement.rangeRuler.frame = jest.fn(() => true) - timerShaftElement.rangeRuler.frame.width = jest.fn(() => 8) - timerShaftElement.rangeRuler.cpuUsage = jest.fn(() => []) - timerShaftElement.sportRuler = jest.fn(() => true) - timerShaftElement.sportRuler.flagList = jest.fn(() => false) - timerShaftElement.sportRuler.flagList.length = jest.fn(() =>0) - timerShaftElement.totalNS =jest.fn(()=>false); - timerShaftElement.sportRuler.isRangeSelect = jest.fn(() => false) - expect(timerShaftElement.reset()).toBeUndefined(); - }); - - it('spApplicationTest10',function (){ - expect(timerShaftElement.reset()).not.toBeUndefined() - }); - - it('TimerShaftElementTest03', function () { timerShaftElement.timeRuler = jest.fn(() => false) - timerShaftElement.sportRuler = jest.fn(() => false) timerShaftElement.rangeRuler = jest.fn(() => false) timerShaftElement.timeRuler.frame = jest.fn(() => { return document.createElement('canvas') as HTMLCanvasElement }) - - timerShaftElement.sportRuler.frame = jest.fn(() => { - return document.createElement('canvas') as HTMLCanvasElement - }) - timerShaftElement.rangeRuler.frame = jest.fn(() => { return document.createElement('canvas') as HTMLCanvasElement }) expect(timerShaftElement.connectedCallback()).toBeUndefined(); }); - it('TimerShaftElementTest04', function () { - timerShaftElement.canvas = jest.fn(()=> { - return { - width: 20, - height: 20, - style: { - width: 30, - height: 30, - } - } - }) - timerShaftElement.canvas.style = jest.fn(() => true) - timerShaftElement.rangeRuler.fillX = jest.fn(() => true) - timerShaftElement.timeRuler.draw = jest.fn(() => true) - timerShaftElement.rangeRuler.draw = jest.fn(() => true) - timerShaftElement.sportRuler.draw = jest.fn(() => true) - expect(timerShaftElement.updateWidth(2)).toBeUndefined(); - }); - it('TimerShaftElementTest05', function () { expect(timerShaftElement.disconnectedCallback()).toBeUndefined(); }); @@ -97,15 +48,6 @@ describe('TimerShaftElement Test', () => { it('TimerShaftElementTest06', function () { expect(timerShaftElement.totalNS).toBe(10000000000); }); - it('TimerShaftElementTest10', function () { - timerShaftElement.totalNS = 10000000000; - expect(timerShaftElement.totalNS).toBe(10000000000); - }); - - it('TimerShaftElementTest07', function () { - // timerShaftElement._sportRuler.modifyFlagList = jest.fn(() => true) - expect(timerShaftElement.modifyFlagList()).toBeUndefined(); - }); it('TimerShaftElementTest08', function () { timerShaftElement.startNS = 'startNS' @@ -117,14 +59,151 @@ describe('TimerShaftElement Test', () => { expect(timerShaftElement.endNS).toBe('endNS'); }); - it('TimerShaftElementTest11', function () { - expect(timerShaftElement.render()).toBe(undefined); + it('TimerShaftElementTest14', function () { + expect(ns2s(1_000_0000)).toBe("10.0 ms"); + }); + + it('TimerShaftElementTest15', function () { + expect(timerShaftElement.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +
      +
      + 10 + 0 +
      +
      + +
      + " +`); + }); + + it('TimerShaftElementTest16', function () { + expect(ns2s(1)).toBe("1.0 ns"); + }); + + it('TimerShaftElementTest17', function () { + expect(ns2s(1_000)).toBe("1.0 μs"); + }); + + it('TimerShaftElementTest18', function () { + expect(ns2x(1,3,4,4,{width:1})).toBe(0); + }); + + it('TimerShaftElementTest19', function () { + expect(timerShaftElement.sportRuler).not.toBeUndefined(); + }); + + it('TimerShaftElementTest20', function () { + expect(timerShaftElement.isScaling()).toBeFalsy(); }); - it('TimerShaftElementTest12', function () { - timerShaftElement.ctx = jest.fn(()=>true) - timerShaftElement.ctx.fillStyle = jest.fn(()=>'transparent') - timerShaftElement.ctx.fillRect = jest.fn(()=>true) - expect(timerShaftElement.render()).toBe(undefined); + it('TimerShaftElementTest21', function () { + timerShaftElement.rangeRuler = jest.fn(()=>undefined) + timerShaftElement.rangeRuler.setRangeNS = jest.fn(()=>true) + expect(timerShaftElement.setRangeNS()).toBeFalsy(); }); + + it('TimerShaftElementTest22', function () { + timerShaftElement.rangeRuler = jest.fn(()=>undefined) + timerShaftElement.rangeRuler.getRange = jest.fn(()=>true) + expect(timerShaftElement.getRange()).toBeTruthy(); + }); + + it('TimerShaftElementTest23', function () { + timerShaftElement.rangeRuler = jest.fn(()=>undefined) + timerShaftElement.rangeRuler.frame = jest.fn(()=>Rect) + timerShaftElement.rangeRuler.frame.width = jest.fn(()=>1) + timerShaftElement._sportRuler = jest.fn(()=>undefined) + timerShaftElement._sportRuler.frame = jest.fn(()=>Rect) + timerShaftElement._sportRuler.frame.width = jest.fn(()=>1) + timerShaftElement.timeRuler = jest.fn(()=>undefined) + timerShaftElement.timeRuler.frame = jest.fn(()=>Rect) + timerShaftElement.timeRuler.frame.width = jest.fn(()=>1) + timerShaftElement.rangeRuler.fillX = jest.fn(()=>true) + timerShaftElement.render = jest.fn(()=>true) + expect(timerShaftElement.updateWidth()).toBeUndefined(); + }); + + it('TimerShaftElementTest24', function () { + timerShaftElement._sportRuler = jest.fn(()=>undefined) + timerShaftElement._sportRuler.modifyFlagList = jest.fn(()=>true) + expect(timerShaftElement.modifyFlagList()).toBeUndefined(); + }); + + it('TimerShaftElementTest25', function () { + timerShaftElement._sportRuler = jest.fn(()=>undefined) + timerShaftElement._sportRuler.drawTriangle = jest.fn(()=>true) + expect(timerShaftElement.drawTriangle()).toBeTruthy(); + }); + + it('TimerShaftElementTest26', function () { + timerShaftElement._sportRuler = jest.fn(()=>undefined) + timerShaftElement._sportRuler.removeTriangle = jest.fn(()=>true) + expect(timerShaftElement.removeTriangle()).toBeUndefined(); + }); + + it('TimerShaftElementTest27', function () { + timerShaftElement._sportRuler = jest.fn(()=>undefined) + timerShaftElement._sportRuler.setSlicesMark = jest.fn(()=>true) + expect(timerShaftElement.setSlicesMark()).toBeUndefined(); + }); + + + it('TimerShaftElementTest28', function () { + timerShaftElement.rangeRuler = jest.fn(()=>undefined) + timerShaftElement.rangeRuler.render = jest.fn(()=>true) + expect(timerShaftElement.render()).not.toBeUndefined(); + }); + + }) diff --git a/host/ide/test/trace/component/trace/base/RangeSelect.test.ts b/host/ide/test/trace/component/trace/base/RangeSelect.test.ts index 2e84cc0..3e10798 100644 --- a/host/ide/test/trace/component/trace/base/RangeSelect.test.ts +++ b/host/ide/test/trace/component/trace/base/RangeSelect.test.ts @@ -147,6 +147,11 @@ describe("RangeSelect Test", () => { rangeSelect.timerShaftDragEL.timerShaftDragEL = jest.fn(()=>0) rangeSelect.spacerEL = jest.fn(()=>true) rangeSelect.spacerEL.offsetTop = jest.fn(()=>1) + rangeSelect.ns2x = jest.fn(()=> 1) + rangeSelect.mouseX = jest.fn(()=> 10) + rangeSelect.markA = jest.fn( ()=> 8) + rangeSelect.markB = jest.fn( ()=> 9) + expect(rangeSelect.mouseMove(rowsEL,mouseEvent)).toBeUndefined(); }); diff --git a/host/ide/test/trace/component/trace/base/TraceRow.test.ts b/host/ide/test/trace/component/trace/base/TraceRow.test.ts index da8ecac..6626e3f 100644 --- a/host/ide/test/trace/component/trace/base/TraceRow.test.ts +++ b/host/ide/test/trace/component/trace/base/TraceRow.test.ts @@ -15,111 +15,56 @@ // @ts-ignore import {TraceRow} from "../../../../../dist/trace/component/trace/base/TraceRow.js"; +// @ts-ignore +import {Sptext} from "../../../../../dist/trace/component/Sptext.js"; + describe("TraceRow Test", () => { beforeAll(() => { }) + const ctx = { + lineWidth:1, + strokeStyle:true + } it('TraceRow Test01', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow).not.toBeUndefined(); }); it('TraceRow Test02', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.sleeping).toBeFalsy(); }); it('TraceRow Test03', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.sleeping = true expect(traceRow.sleeping).toBeTruthy(); }); it('TraceRow Test04', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.sleeping = false expect(traceRow.sleeping).toBeFalsy(); }); it('TraceRow Test05', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.rangeSelect).toBeFalsy(); }); it('TraceRow Test06', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.rangeSelect = true expect(traceRow.rangeSelect).toBeTruthy(); }); - it('TraceRow Test07', () => { - const canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); - //transferControlToOffscreen() - traceRow.canvas = jest.fn(()=>true) - traceRow.args = jest.fn(()=>true) - traceRow.args.isOffScreen = jest.fn(()=>true) - // @ts-ignore - traceRow.canvas.transferControlToOffscreen = jest.fn(()=>true) - traceRow.dataList = { - supplier:true, - isLoading:false, - } - traceRow.args={ - isOffScreen:true, - } - traceRow.supplier = true; - traceRow.isLoading = false; - traceRow.name = "111" - traceRow.height = 20 - traceRow.height = 30 - expect(traceRow.initCanvas()).toBeUndefined(); - }); - - it('TraceRow Test08', () => { - const canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); - traceRow.dataList = { - supplier:true, - isLoading:false, - } - traceRow.supplier = true; - traceRow.isLoading = false; - traceRow.name = "111" - traceRow.height = 20 - traceRow.height = 30 - expect(traceRow.drawObject()).toBeUndefined(); - }); - - it('TraceRow Test09', () => { - const canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); - traceRow.dataList = { - supplier:true, - isLoading:false, - } - traceRow.supplier = true; - traceRow.isLoading = false; - traceRow.name = "111" - traceRow.height = 20 - traceRow.height = 30 - expect(traceRow.drawObject()).toBeUndefined(); - }); it('TraceRow Test10', () => { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.dataList = { supplier:true, isLoading:false, @@ -137,7 +82,7 @@ describe("TraceRow Test", () => { canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.dataList = { supplier:true, isLoading:false, @@ -155,7 +100,7 @@ describe("TraceRow Test", () => { canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.dataList = { supplier:true, isLoading:false, @@ -169,152 +114,499 @@ describe("TraceRow Test", () => { }); it('TraceRow Test13', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.collect).toBeFalsy(); }); it('TraceRow Test14', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.collect = true; expect(traceRow.collect).toBeTruthy(); }); it('TraceRow Test15', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.rowType).toBeFalsy(); }); it('TraceRow Test16', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.rowType = true; expect(traceRow.rowType).toBeTruthy(); }); it('TraceRow Test17', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.rowId).toBeFalsy(); }); it('TraceRow Test18', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.rowId = true; expect(traceRow.rowId).toBeTruthy(); }); it('TraceRow Test19', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.rowParentId).toBeFalsy(); }); it('TraceRow Test20', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.rowParentId = true; expect(traceRow.rowParentId).toBeTruthy(); }); it('TraceRow Test21', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.rowHidden = true; expect(traceRow.rowHidden).toBeUndefined(); }); + it('TraceRow Test22', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.name).toBeFalsy(); }); it('TraceRow Test23', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.folder = false; expect(traceRow.folder).toBeFalsy(); }); it('TraceRow Test24', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.folder = true; expect(traceRow.folder).toBeTruthy(); }); it('TraceRow Test25', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.expansion = false; expect(traceRow.expansion).toBeFalsy(); }); it('TraceRow Test26', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.expansion = true; expect(traceRow.expansion).toBeTruthy(); }); it('TraceRow Test27', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.tip = true; expect(traceRow.tip).toBeUndefined(); }); it('TraceRow Test28', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.frame).not.toBeUndefined(); }); it('TraceRow Test29', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.frame = [0,0,0]; expect(traceRow.frame).toBeTruthy(); }); + it('TraceRow Test60', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.disabledCheck).not.toBeUndefined(); + }); + + it('TraceRow Test61', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.disabledCheck = true; + expect(traceRow.disabledCheck).toBeTruthy(); + }); + + it('TraceRow Test62', () => { + let traceRow = new TraceRow({canvasNumber: 1, alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.folderPaddingLeft).toBeUndefined(); + }); + + it('TraceRow Test63', () => { + document.body.innerHTML = '
      ' + let traceRow = document.querySelector('.ccc') as TraceRow + expect(traceRow.setCheckBox()).toBeUndefined(); + }); + it('TraceRow Test30', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.checkType).not.toBeUndefined(); }); it('TraceRow Test31', () => { - let traceRow = new TraceRow(); - traceRow.checkType = true; + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.checkType = "-1"; expect(traceRow.checkType).toBeTruthy(); }); it('TraceRow Test32', () => { - let traceRow = new TraceRow(); - expect(traceRow.drawType).toBeUndefined(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.drawType).toBe(0); }); it('TraceRow Test33', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.drawType = true; expect(traceRow.drawType).toBeTruthy(); }); it('TraceRow Test34', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); traceRow.args = jest.fn(()=>true) traceRow.args.isOffScreen = jest.fn(()=>null) expect(traceRow.updateWidth(1)).toBeUndefined(); }); - it('TraceRow Test35', () => { - let traceRow = new TraceRow(); - expect(traceRow.setCheckBox()).toBeUndefined(); - }); - it('TraceRow Test36', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.onMouseHover()).toBeFalsy(); }); it('TraceRow Test37', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.setTipLeft(1,null)).toBeFalsy(); }); it('TraceRow Test38', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.onMouseLeave(1,1)).toBeFalsy(); }); it('TraceRow Test39', () => { - let traceRow = new TraceRow(); + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); expect(traceRow.draw(false)).toBeFalsy(); }); + it('TraceRow Test40', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.collect = 1 + expect(traceRow.collect).toBeTruthy(); + }); + + it('TraceRow Test41', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.collect = 0 + expect(traceRow.collect).toBeFalsy(); + }); + + it('TraceRow Test42', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.checkType = "0"; + expect(traceRow.checkType).toBe("0"); + }); + + it('TraceRow Test43', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.checkType = "1"; + expect(traceRow.checkType).toBe("1"); + }); + + it('TraceRow Test44', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.checkType = "2"; + expect(traceRow.checkType).toBe("2"); + }); + + + it('TraceRow Test45', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.checkType = 0; + expect(traceRow.checkType).toBe(""); + }); + + it('TraceRow Test46', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.rowHidden = false; + expect(traceRow.rowHidden).toBeUndefined(); + }); + + it('TraceRow Test47', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.highlight = false; + expect(traceRow.highlight).toBeFalsy(); + }); + + it('TraceRow Test48', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.highlight = true; + expect(traceRow.highlight).toBeFalsy(); + }); + + it('TraceRow Test49', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.setCheckBox = true; + expect(traceRow.highlight).toBeFalsy(); + }); + + it('TraceRow Test50', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + traceRow.initCanvas = jest.fn(()=>null) + expect(traceRow.connectedCallback()).toBeUndefined(); + }); + + it('TraceRow Test51', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.isInTimeRange()).toBe(false); + }); + + it('TraceRow Test52', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.getLineColor()).toBe(""); + }); + + it('TraceRow Test53', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + let value = traceRow.attributeChangedCallback("name") + expect(value).toBe(undefined); + }); + + it('TraceRow Test54', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + let value = traceRow.attributeChangedCallback("height","1","2") + expect(value).toBe(undefined); + }); + + it('TraceRow Test55', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + let value = traceRow.attributeChangedCallback("check-type","1","check") + expect(value).toBe(undefined); + }); + + it('TraceRow Test56', () => { + let traceRow = new TraceRow({canvasNumber:1,alpha: true, contextId: '2d', isOffScreen: true}); + expect(traceRow.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + + + + +
      +
      + Current Bytes
      +
      + Native Memory Density
      +
      + +
      + +
      +
      +
      + P:process [1573]
      + T:Thread [675] +
      +
      +
      + " +`); + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/base/TraceRowRecyclerView.test.ts b/host/ide/test/trace/component/trace/base/TraceRowRecyclerView.test.ts index 6aa8c61..3185d3b 100644 --- a/host/ide/test/trace/component/trace/base/TraceRowRecyclerView.test.ts +++ b/host/ide/test/trace/component/trace/base/TraceRowRecyclerView.test.ts @@ -32,7 +32,8 @@ describe("TraceRow Test", () => { it('Test03', function () { let traceRow = new TraceRowRecyclerView(); - traceRow.dataSource=false + traceRow.measureHeight = jest.fn(()=>true) + traceRow.dataSource = true expect(traceRow.dataSource).toBeTruthy(); }); @@ -49,22 +50,84 @@ describe("TraceRow Test", () => { it('Test06', function () { let traceRow = new TraceRowRecyclerView(); - expect(traceRow.refreshRow()).toBeUndefined(); - }); + const obj={ + folder:false, + top:0, + name:"", + children:false, + rowId:"", + rowType:"", + rowParentId:"1", + expansion:false, + rowHidden:false, + rowHeight:40 + } + const el={ + obj:undefined, + style:{top:1,visibility:'visible'}, + name:"", + rowId:"", + rowType:"", + rowParentId:"1", + expansion:false, + rowHidden:false, + setAttribute:"", + removeAttribute:"" - it('Test07', function () { - let traceRow = new TraceRowRecyclerView(); - traceRow.dataSource = jest.fn(()=>true) - traceRow.dataSource.filter = jest.fn(()=>true) - expect(traceRow.measureHeight()).toBeUndefined(); + } + expect(traceRow.refreshRow(el,!obj)).toBeUndefined(); }); it('Test08', function () { let traceRow = new TraceRowRecyclerView(); expect(traceRow.initUI()).toBeUndefined(); }); + it('Test09', function () { let traceRow = new TraceRowRecyclerView(); expect(traceRow.initUI()).toBeUndefined(); }); + + it('Test09', function () { + let traceRow = new TraceRowRecyclerView(); + expect(traceRow.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +
      + + " +`) + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/base/TraceSheet.test.ts b/host/ide/test/trace/component/trace/base/TraceSheet.test.ts index 39ef4ca..23dd5fc 100644 --- a/host/ide/test/trace/component/trace/base/TraceSheet.test.ts +++ b/host/ide/test/trace/component/trace/base/TraceSheet.test.ts @@ -15,6 +15,7 @@ // @ts-ignore import {TraceSheet} from "../../../../../dist/trace/component/trace/base/TraceSheet.js"; + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), @@ -25,70 +26,266 @@ window.ResizeObserver = window.ResizeObserver || describe("TraceSheet Test", () => { beforeAll(() => { }) -let val=[{ - cpus:{length:1,}, - threadIds:{length: 2}, - funTids:{length: 2}, - trackIds:{length: 2}, - hasFps:0, - heapIds:{length: 0}, - nativeMemory:{length: 1} -}] + let val = { + hasFps: 1, + cpus:{length:1}, + threadIds:[{length:2}], + funTids:{length:1}, + trackIds: {length:1}, + heapIds: {length:1}, + nativeMemory: {length:1}, + cpuAbilityIds:{length:1}, + memoryAbilityIds:{length:1}, + diskAbilityIds:{length:1}, + networkAbilityIds:{length:1}, + } + let e = {detail:{ + title:1, + state:0, + threadId:1, + processId:2 + }} + let selection ={ + hasFps: 1, + cpus:{length:1}, + threadIds:[{length:2}], + funTids:{length:1}, + trackIds: {length:1}, + heapIds: {length:1}, + nativeMemory: {length:1}, + cpuAbilityIds:{length:0}, + memoryAbilityIds:{length:0}, + diskAbilityIds:{length:0}, + networkAbilityIds:{length:0}, + perfSampleIds:{length:0}, + + } it('TraceSheet Test01', () => { - let traceRow = new TraceSheet(); - expect(traceRow).not.toBeUndefined() + let traceSheet = new TraceSheet(); + expect(traceSheet).not.toBeUndefined() }); it('TraceSheet Test02', () => { - let traceRow = new TraceSheet(); - expect(traceRow.recoveryBoxSelection).not.toBeUndefined() + let traceSheet = new TraceSheet(); + expect(traceSheet.recoveryBoxSelection).not.toBeUndefined() }); - it('TraceSheet Test03', () => { - let traceRow = new TraceSheet(); - expect(traceRow.hideBoxTab()).toBeUndefined() + let traceSheet = new TraceSheet(); + expect(traceSheet.hideBoxTab()).toBeUndefined() }); - /* it('TraceSheet Test04', () => { - let traceRow = new TraceSheet(); - expect(traceRow.hideOtherBoxTab("11")).not.toBeUndefined() + it('TraceSheet Test08', () => { + let traceSheet = new TraceSheet(); + expect(traceSheet.connectedCallback()).toBeUndefined() + }); + it('TraceSheet Test09', () => { + let traceSheet = new TraceSheet(); + expect(traceSheet.loadTabPaneData()).toBeUndefined() }); + it('TraceSheet Test10', () => { + let traceSheet = new TraceSheet(); + expect(traceSheet.clear()).toBeUndefined() + }); - it('TraceSheet Test05', () => { - let traceRow = new TraceSheet(); - expect(traceRow.hideOtherBoxTab("12")).not.toBeUndefined() + it('TraceSheet Test12', () => { + let traceSheet = new TraceSheet(); + traceSheet.litTabs = jest.fn(()=>true) + traceSheet.litTabs.activeByKey = jest.fn(()=>true) + let value = traceSheet.hideOtherBoxTab("11") + expect(value).toBeUndefined() }); + it('TraceSheet Test13', () => { + let traceSheet = new TraceSheet(); + traceSheet.litTabs = jest.fn(()=>true) + traceSheet.litTabs.activeByKey = jest.fn(()=>true) + let value = traceSheet.hideOtherBoxTab("12") + expect(value).toBeUndefined() + }); - it('TraceSheet Test06', () => { - let traceRow = new TraceSheet(); - expect(traceRow.hideOtherBoxTab("13")).not.toBeUndefined() + it('TraceSheet Test14', () => { + let traceSheet = new TraceSheet(); + traceSheet.litTabs = jest.fn(()=>true) + traceSheet.litTabs.activeByKey = jest.fn(()=>true) + let value = traceSheet.hideOtherBoxTab("13") + expect(value).toBeUndefined() }); - it('TraceSheet Test07', () => { - let traceRow = new TraceSheet(); - expect(traceRow.hideOtherBoxTab("14")).not.toBeUndefined() - });*/ + it('TraceSheet Test16', () => { + let traceSheet = new TraceSheet(); + traceSheet.litTabs = jest.fn(()=>true) + traceSheet.litTabs.activeByKey = jest.fn(()=>true) + let value = traceSheet.hideOtherBoxTab("14") + expect(value).toBeUndefined() + }); - it('TraceSheet Test08', () => { - let traceRow = new TraceSheet(); - expect(traceRow.connectedCallback()).toBeUndefined() + it('TraceSheet Test15', () => { + let traceSheet = new TraceSheet(); + traceSheet.setBoxActiveKey = jest.fn(()=>true) + expect(traceSheet.boxSelection(selection)).toBeTruthy() }); - it('TraceSheet Test09', () => { - let traceRow = new TraceSheet(); - expect(traceRow.loadTabPaneData()).toBeUndefined() + + it('TraceSheet Test17', () => { + let traceSheet = new TraceSheet(); + traceSheet.selection = jest.fn(()=>undefined) + traceSheet.selection.cpus = jest.fn(()=>[1]) + traceSheet.selection.threadIds = jest.fn(()=>[1]) + traceSheet.selection.funTids = jest.fn(()=>[1]) + traceSheet.selection.trackIds = jest.fn(()=>[1]) + traceSheet.selection.heapIds = jest.fn(()=>[1]) + traceSheet.selection.nativeMemory = jest.fn(()=>[1]) + traceSheet.selection.perfSampleIds = jest.fn(()=>[1]) + expect(traceSheet.recoveryBoxSelection()).toBeUndefined() }); - it('TraceSheet Test10', () => { - let traceRow = new TraceSheet(); - expect(traceRow.clear()).toBeUndefined() + it('TraceSheet Test18', () => { + let traceSheet = new TraceSheet(); + traceSheet.litTabs = jest.fn(()=>undefined) + traceSheet.litTabs.activeByKey = jest.fn(()=>true) + traceSheet.loadTabPaneData = jest.fn(()=>"") + expect(traceSheet.setBoxActiveKey(val)).toBeUndefined() }); - it('TraceSheet Test11', () => { - let traceRow = new TraceSheet(); - expect(traceRow.boxSelection(val)).toBeUndefined() + it('TraceSheet Test19', () => { + let traceSheet = new TraceSheet(); + expect(traceSheet.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + " +`) }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/base/Utils.test.ts b/host/ide/test/trace/component/trace/base/Utils.test.ts index 0b70b4d..947632f 100644 --- a/host/ide/test/trace/component/trace/base/Utils.test.ts +++ b/host/ide/test/trace/component/trace/base/Utils.test.ts @@ -68,21 +68,124 @@ describe("Utils Test", () => { }); it('Utils Test11', () => { - expect(Utils.getByteWithUnit(1_000_000_001)).toBe("1.00 Gb") + expect(Utils.getByteWithUnit(2_000_000_000)).toBe("1.86 Gb") }); it('Utils Test12', () => { - expect(Utils.getByteWithUnit(1_000_000_000)).toBe("1000.00 Mb") + expect(Utils.getByteWithUnit(1_000_000_000)).toBe("953.67 Mb") + }); + + it('Utils Test13', () => { + expect(Utils.getByteWithUnit(1000_000)).toBe("976.56 Kb") + }); + + it('Utils Test23', () => { + expect(Utils.getByteWithUnit(-2_000)).toBe("-1.95 Kb") }); it('Utils Test14', () => { - expect(Utils.getByteWithUnit(1000_000)).toBe("1000.00 kb") + expect(Utils.getTimeString( 1_000_000_000_000)).toBe("16m 40s ") }); - it('Utils Test13', () => { + it('Utils Test15', () => { + expect(Utils.getTimeString( 2_000_000)).toBe("2ms ") + }); + + it('Utils Test16', () => { + expect(Utils.getTimeString( 3_000)).toBe("3μs ") + }); + + it('Utils Test17', () => { + expect(Utils.getTimeString( 300)).toBe("300ns ") + }); + + it('Utils Test18', () => { expect(Utils.getTimeStringHMS(5900_000_000_000)).toBe("1:38:") }); + it('Utils Test19', () => { + expect(Utils.getTimeStringHMS(3_000_000_000)).toBe("3:") + }); + + it('Utils Test20', () => { + expect(Utils.getTimeStringHMS(2_000_000)).toBe("2.") + }); + + it('Utils Test21', () => { + expect(Utils.getTimeStringHMS(5_000)).toBe("5.") + }); + + it('Utils Test22', () => { + expect(Utils.getTimeStringHMS(90)).toBe("90") + }); + + it('Utils Test24', () => { + expect(Utils.getBinaryByteWithUnit(0)).toBe("0Bytes") + }); + + it('Utils Test25', () => { + expect(Utils.getBinaryByteWithUnit(3_000_000_000)).toBe("2.79Gib") + }); + + it('Utils Test26', () => { + expect(Utils.getBinaryByteWithUnit(2_000_000)).toBe("1.91Mib") + }); + + it('Utils Test27', () => { + expect(Utils.getBinaryByteWithUnit(2_000)).toBe("1.95kib") + }); + + it('Utils Test28', () => { + expect(Utils.getTimeStampHMS(3900_000_000_000)).toBe("01:05:00:000.000") + }); + + it('Utils Test29', () => { + expect(Utils.getTimeStampHMS(70_000_000_000)).toBe("01:10:000.000") + }); + + it('Utils Test30', () => { + expect(Utils.getTimeStampHMS(2_000_000_000)).toBe("02:000.000") + }); + + it('Utils Test31', () => { + expect(Utils.getTimeStampHMS(2_000_000)).toBe("00:002.000") + }); + + it('Utils Test32', () => { + expect(Utils.getTimeStampHMS(2_000)).toBe("00:000.002.") + }); + + it('Utils Test33', () => { + expect(Utils.getTimeStampHMS(1)).toBe("00:000.000001") + }); + + it('Utils Test40', () => { + expect(Utils.getDurString(61_000_000_000)).toBe("1:1.0s ") + }); + + it('Utils Test34', () => { + expect(Utils.getDurString(2_000_000_000)).toBe("2.0s ") + }); + + it('Utils Test35', () => { + expect(Utils.getDurString(1_800_000)).toBe("1ms ") + }); + + it('Utils Test36', () => { + expect(Utils.timeMsFormat2p(3800_000)).toBe("1.00h") + }); + + it('Utils Test37', () => { + expect(Utils.timeMsFormat2p(90_000)).toBe("1.00min") + }); + + it('Utils Test38', () => { + expect(Utils.timeMsFormat2p(2_000)).toBe("2.00s") + }); + + it('Utils Test39', () => { + expect(Utils.timeMsFormat2p(1)).toBe("1.00ms") + }); afterAll(() => { // 后处理操作 diff --git a/host/ide/test/trace/component/trace/search/Search.test.ts b/host/ide/test/trace/component/trace/search/Search.test.ts new file mode 100644 index 0000000..c3febe3 --- /dev/null +++ b/host/ide/test/trace/component/trace/search/Search.test.ts @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {LitSearch} from "../../../../../dist/trace/component/trace/search/Search.js"; + +describe(" SearchTest", () => { + beforeAll(() => { + }) + it('Search Test01', () => { + let search = new LitSearch(); + expect(search).not.toBeUndefined() + }); + + it('Search Test02', () => { + let search = new LitSearch(); + search.list = ["1"]; + expect(search.list[0]).toBe("1"); + }); + + it('Search Test03', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.index).toBe(1); + }); + + it('Search Test04', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.total).toBe(0); + }); + + it('Search Test05', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.setPercent("1",2)).toBeUndefined(); + }); + + it('Search Test06', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.setPercent("1",101)).toBeUndefined(); + }); + + it('Search Test07', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.setPercent("1",-1)).toBeUndefined(); + }); + + it('Search Test08', () => { + let search = new LitSearch(); + search.index = 1; + expect(search.setPercent("1",-2)).toBeUndefined(); + }); + + it('Search Test09', () => { + let search = new LitSearch(); + expect(search.clear()).toBeUndefined(); + }); + + it('Search Test11', function () { + let search = new LitSearch(); + search.search = jest.fn(()=>undefined) + search.search.blur = jest.fn(()=>true) + expect(search.blur()).toBeUndefined(); + }); + + it('Search Test10', () => { + let search = new LitSearch(); + expect(search.initHtml()).toMatchInlineSnapshot(` +" + +
      + + + +
      + 0/0 + + + | + + +
      +
      + " +`); + }); +}); \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneBoxChild.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneBoxChild.test.ts index 8304782..155cacc 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneBoxChild.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneBoxChild.test.ts @@ -16,6 +16,8 @@ // @ts-ignore // import { it } from "mocha" import {TabPaneBoxChild} from "../../../../../dist/trace/component/trace/sheet/TabPaneBoxChild.js" +import {getTabBoxChildData} from "../../../../../src/trace/database/SqlLite"; + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), @@ -23,12 +25,13 @@ window.ResizeObserver = window.ResizeObserver || unobserve: jest.fn(), })); + describe('TabPaneBoxChild Test', () => { + document.body.innerHTML = `
      ` + let element = document.querySelector("#div") as HTMLDivElement; let tabPaneBoxChild = new TabPaneBoxChild(); - tabPaneBoxChild.parentElement= jest.fn(()=> { - return {clientHeight:56} - }) - tabPaneBoxChild.parentElement.clientHeight= jest.fn(()=>100) + element.appendChild(tabPaneBoxChild) + tabPaneBoxChild.loadDataInCache = true tabPaneBoxChild.data = { cpus: [], threadIds: [], @@ -38,28 +41,56 @@ describe('TabPaneBoxChild Test', () => { leftNs: 0, rightNs: 0, hasFps: false, - // parentElement:{ - // clientHeight:0, - // } } - // tabPaneBoxChild.parentElement = { - // clientHeight:0, - // } + let val={ + leftNs:2, + rightNs:1, + state:"1", + processId:0, + threadId:1 + } it('TabPaneBoxChildTest01', function () { + expect(tabPaneBoxChild.sortByColumn({ + key: 'number', + })).toBeUndefined(); + }); + it('TabPaneCounterTest02', function () { expect(tabPaneBoxChild.sortByColumn({ - key: 'name', sort: () => { } })).toBeUndefined(); }); - // it('TabPaneBoxChildTest02',function(){ - // TabPaneBoxChild.parentElement= jest.fn(()=> { - // return {clientHeight:56} - // }) - // // TabPaneBoxChild.parentElement.clientHeight= jest.fn(()=>100) - // expect(tabPaneBoxChild.data).toBeUndefined(); - // }) - + + it('TabPaneCounterTest03', function () { + expect(tabPaneBoxChild.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneContextSwitch.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneContextSwitch.test.ts index 3d3b8e7..5b3c769 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneContextSwitch.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneContextSwitch.test.ts @@ -55,4 +55,36 @@ describe('TabPaneContextSwitch Test', () => { let result = tabPaneContextSwitch.groupByThreadToMap(dataArray) expect(result.get(0).length).toBe(1); }); + + it('TabPaneContextSwitchTest04', function () { + expect(tabPaneContextSwitch).not.toBeUndefined(); + }); + + it('TabPaneContextSwitchTest05', function () { + expect(tabPaneContextSwitch.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + " +`); + }); + + it('TabPaneContextSwitchTest06', function () { + document.body.innerHTML = `` + let tabPaneContextSwitch = document.querySelector('#Switch') as TabPaneContextSwitch + tabPaneContextSwitch.data = false + expect(tabPaneContextSwitch.data).toBeFalsy(); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCounter.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCounter.test.ts index d720649..8ccc44e 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCounter.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCounter.test.ts @@ -45,9 +45,16 @@ describe('TabPaneCounter Test', () => { key: 'name', sort: () => { } - })) + })).toBeUndefined(); }); + it('TabPaneCounterTest06', function () { + expect(tabPaneCounter.sortByColumn({ + key: 'number', + sort: () => { + } + })).toBeUndefined(); + }); it('TabPaneCounterTest04', function () { let mockgetTabCounters = sqlit.getTabCounters @@ -65,7 +72,6 @@ describe('TabPaneCounter Test', () => { expect(tabPaneCounter.data = a).toBeTruthy(); }); - it('TabPaneCounterTest05', function () { let mockgetTabCounters = sqlit.getTabCounters mockgetTabCounters.mockResolvedValue([] @@ -73,4 +79,39 @@ describe('TabPaneCounter Test', () => { let a = {rightNs: 1, trackIds: [11, 12, 13]} expect(tabPaneCounter.data = a).toBeTruthy(); }); + + it('TabPaneCounterTest06', function () { + expect(tabPaneCounter.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCpu.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCpu.test.ts index fed58e8..dbf6062 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCpu.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCpu.test.ts @@ -23,7 +23,29 @@ describe('TabPaneCpu Test', ()=>{ it('TabPaneCpuTest01', function () { expect(tabPaneCpu.initHtml()).not.toBe('') }); + it('TabPaneCpuTest02', function () { expect(tabPaneCpu.initElements()).toBeUndefined() }); + + it('TabPaneCpuTest03', function () { + expect(tabPaneCpu.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + " +`) + }); }) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCpuAbility.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCpuAbility.test.ts new file mode 100644 index 0000000..f4e3cea --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCpuAbility.test.ts @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {TabPaneCpuAbility} from "../../../../../dist/trace/component/trace/sheet/TabPaneCpuAbility.js" + +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneCpuAbility Test', () => { + let tabPaneCpuAbility = new TabPaneCpuAbility(); + + it('TabPaneCpuAbilityTest01', function () { + tabPaneCpuAbility.queryResult.length = 2; + expect(tabPaneCpuAbility.filterData()).toBeUndefined(); + }); + + it('TabPaneCpuAbilityTest02', function () { + const systemCpuSummary = { + startTimeStr:"", + durationStr:"", + totalLoadStr:"", + userLoadStr:"", + systemLoadStr:"", + threadsStr:"" + } + expect(tabPaneCpuAbility.toCpuAbilityArray(systemCpuSummary)).not.toBeUndefined(); + }); + + it('TabPaneCpuAbilityTest03 ', function () { + expect(tabPaneCpuAbility.sortByColumn({ + key:'startTime', + })).toBeUndefined(); + }); + + it('TabPaneCpuAbilityTest04 ', function () { + expect(tabPaneCpuAbility.sortByColumn({ + key:!'startTime', + })).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCpuByProcess.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCpuByProcess.test.ts index 94fb290..25cf945 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCpuByProcess.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCpuByProcess.test.ts @@ -19,14 +19,25 @@ const sqlit = require("../../../../../dist/trace/database/SqlLite.js") jest.mock("../../../../../dist/trace/database/SqlLite.js"); describe('TabPaneCpuByProcess Test', () => { let tabPaneCpuByProcess = new TabPaneCpuByProcess(); - tabPaneCpuByProcess.sortByColumn = jest.fn(()=> true) + // tabPaneCpuByProcess.sortByColumn = jest.fn(()=> true) it('TabPaneCpuByProcessTest01', function () { expect(tabPaneCpuByProcess.sortByColumn({ - key: 'name', + key: 'number', + })).toBeUndefined(); + }); + + it('TabPaneCpuByProcessTest05', function () { + expect(tabPaneCpuByProcess.sortByColumn({ sort: () => { } - })).toBeTruthy(); + })).toBeUndefined(); + }); + + it('TabPaneCpuByProcessTest04', function () { + expect(tabPaneCpuByProcess.sortByColumn({ + key: 'pid'||'wallDuration'||'avgDuration'||'occurrences', + })).toBeUndefined(); }); it('TabPaneCpuByProcessTest02', function () { @@ -50,4 +61,31 @@ describe('TabPaneCpuByProcess Test', () => { let a = {rightNs: 1, cpus: [11, 12, 13]} expect(tabPaneCpuByProcess.data = a).toBeTruthy(); }); + + it('TabPaneCpuByProcessTest04', function () { + expect(tabPaneCpuByProcess.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + " +`) + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCpuByThread.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCpuByThread.test.ts index d01b6ec..4a2a2fe 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCpuByThread.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCpuByThread.test.ts @@ -15,15 +15,79 @@ // @ts-ignore import {TabPaneCpuByThread} from "../../../../../dist/trace/component/trace/sheet/TabPaneCpuByThread.js" +import {getTabCpuByThread} from "../../../../../src/trace/database/SqlLite"; +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); describe('TabPaneCpuByThread Test', () => { let tabPaneCpuByThread = new TabPaneCpuByThread(); it('TabPaneCpuByThreadTest01', function () { expect(tabPaneCpuByThread.sortByColumn({ - key: 'name', + key: 'number', sort: () => { } })).toBeUndefined(); }); + + it('TabPaneCpuByThreadTest02', function () { + expect(tabPaneCpuByThread.sortByColumn({ + key: 'pid'||'wallDuration'||'avgDuration'||'occurrences', + })).toBeUndefined(); + }); + + it('TabPaneCpuByThreadTest03', function () { + let mockgetTabCpuByThread = sqlit.getTabCpuByThread + mockgetTabCpuByThread.mockResolvedValue([{process : "test", + wallDuration: 10, + occurrences: 10, + thread:"" + }, + {process : "test2", + wallDuration: 11, + occurrences: 11, + thread:"" + }] + ) + let a = {rightNs: 1, cpus: [11, 12, 13]} + expect(tabPaneCpuByThread.data = a).toBeTruthy(); + }); + + it('TabPaneCpuByThreadTest04', function () { + let mockgetTabCpuByThread = sqlit.getTabCpuByThread + mockgetTabCpuByThread.mockResolvedValue([]) + let a = {rightNs: 1, cpus: [11, 12, 13]} + expect(tabPaneCpuByThread.data = a).toBeTruthy(); + }); + + it('TabPaneCpuByThreadTest05', function () { + expect(tabPaneCpuByThread.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCpuUsage.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCpuUsage.test.ts index d70e77f..dde0048 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCpuUsage.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCpuUsage.test.ts @@ -15,10 +15,44 @@ // @ts-ignore import {TabPaneCpuUsage} from "../../../../../dist/trace/component/trace/sheet/TabPaneCpuUsage.js" +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); + describe('TabPaneCpuUsage Test', () => { let tabPaneCpuUsage = new TabPaneCpuUsage(); + let mockGetTabCpuUsage = sqlit.getTabCpuUsage + let mockGetTabCpuFreq = sqlit.getTabCpuFreq + + mockGetTabCpuUsage.mockResolvedValue([]) + mockGetTabCpuFreq.mockResolvedValue([]) + + let selectionData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + + tabPaneCpuUsage.data = selectionData + + it('TabPaneCpuUsageTest02', function () { expect(tabPaneCpuUsage.sortTable([[1,2,3,9,6,4],[5,2,1,4,9,6]],1,true)).toBeUndefined(); }); @@ -70,4 +104,37 @@ describe('TabPaneCpuUsage Test', () => { }]) expect(result.get(0).length).toBe(1); }); + + it('TabPaneCurrentSelectionTest07',function(){ + expect(tabPaneCpuUsage.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneCurrentSelection.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneCurrentSelection.test.ts index 5ecf5f1..68be539 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneCurrentSelection.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneCurrentSelection.test.ts @@ -29,6 +29,7 @@ describe('TabPaneCurrentSelection Test', () => { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; + let context = canvas.getContext("2d"); let cpuData = [{ cpu: 1, @@ -149,8 +150,9 @@ describe('TabPaneCurrentSelection Test', () => { }); it('TabPaneCurrentSelectionTest04', function () { - let result = tabPaneCurrentSelection.drawRight(canvas, wakeupBean) - expect(result).toBeUndefined(); + // @ts-ignore + document.body.innerHTML = ` `; + expect(tabPaneCurrentSelection.drawRight(canvas, wakeupBean)).toBeUndefined(); }); it('TabPaneCurrentSelectionTest06', function () { @@ -183,4 +185,69 @@ describe('TabPaneCurrentSelection Test', () => { expect(result).toBe('101ns '); }); + it('TabPaneCurrentSelectionTest13',function(){ + tabPaneCurrentSelection.setCpuData = jest.fn(()=>true); + tabPaneCurrentSelection.data = jest.fn(()=>true); + expect(tabPaneCurrentSelection.data).toBeUndefined(); + }); + + it('TabPaneCurrentSelectionTest14',function(){ + expect(tabPaneCurrentSelection.setCpuData(cpuData,undefined,1)).not.toBeUndefined(); + }); + + it('TabPaneCurrentSelectionTest15',function(){ + expect(tabPaneCurrentSelection.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      +

      +

      Scheduling Latency

      +
      +
      +
      + + + + + + + + +
      +
      + +
      +
      +
      + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneDiskAbility.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneDiskAbility.test.ts new file mode 100644 index 0000000..745bd89 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneDiskAbility.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabPaneDiskAbility} from "../../../../../dist/trace/component/trace/sheet/TabPaneDiskAbility.js"; +window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(()=>({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), +})) + +describe('TabPaneDiskAbility Test', ()=>{ + + let tabPaneDiskAbility = new TabPaneDiskAbility(); + it('TabPaneDiskAbilityTest01',()=>{ + tabPaneDiskAbility.queryResult.length = 1; + expect(tabPaneDiskAbility.filterData()).toBeUndefined(); + }); + + it('TabPaneDiskAbilityTest02 ', function () { + const val = { + startTimeStr:"", + durationStr:"", + dataReadStr:"", + dataReadSecStr:"", + dataWriteStr:"", + readsInStr:"", + readsInSecStr:"", + writeOutStr:"", + writeOutSecStr:"" + } + expect(tabPaneDiskAbility.toDiskAbilityArray(val)).not.toBeUndefined(); + }); + + it('TabPaneDiskAbilityTest03 ', function () { + expect(tabPaneDiskAbility.sortByColumn({ + key:'startTime', + })).toBeUndefined(); + }); + + it('TabPaneDiskAbilityTest04 ', function () { + expect(tabPaneDiskAbility.sortByColumn({ + key:!'startTime', + })).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneFilter.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneFilter.test.ts new file mode 100644 index 0000000..69142be --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneFilter.test.ts @@ -0,0 +1,323 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {TabPaneFilter} from "../../../../../dist/trace/component/trace/sheet/TabPaneFilter.js" + +describe('TabPaneFilter Test', () => { + let tabPaneFilter = new TabPaneFilter(); + + it('TabPaneFilterTest01', function () { + expect(tabPaneFilter.firstSelect).toBe(""); + }); + + it('TabPaneFilterTest02', function () { + expect(tabPaneFilter.secondSelect).toBe(""); + }); + + it('TabPaneFilterTest03', function () { + expect(tabPaneFilter.filterValue).toBe(""); + }); + + it('TabPaneFilterTest04', function () { + tabPaneFilter.filterValue = true + expect(tabPaneFilter.filterValue).toBeTruthy(); + }); + + it('TabPaneFilterTest05', function () { + expect(tabPaneFilter.icon).toBe("tree"); + }); + + it('TabPaneFilterTest08', function () { + tabPaneFilter.iconEL.name = "menu" + expect(tabPaneFilter.icon).toBe("block"); + }); + + it('TabPaneFilterTest09', function () { + tabPaneFilter.iconEL.name = "" + expect(tabPaneFilter.icon).toBe(""); + }); + + it('TabPaneFilterTest06', function () { + tabPaneFilter.icon = true + expect(tabPaneFilter.icon).toBe(""); + }); + + it('TabPaneFilterTest07', function () { + expect(tabPaneFilter.initHtml()).toMatchInlineSnapshot(` +" + + + Input Filter + + +
      + +
      + +
      +
      Invert
      +
      Hide System so
      +
      + Options +
      + +
      + + + +
      +
      Constraints:Only enabled with data and while stopped;
      +
      filters data to thresholds.
      +
      + +
      +
      + Sample Count Filter +
      + +
      +
      + +
      +
      +
      Reset
      +
      +
      + Symbol Filter +
      + +
      +
      + +
      +
      +
      Reset
      +
      +
      + Library Filter +
      + " +`); + }); + + it('TabPaneFilterTest10', function () { + expect(tabPaneFilter.addDataMining({name:""},"")).toBe(-1); + }); + + it('TabPaneFilterTest11', function () { + expect(tabPaneFilter.getFilterTreeData()).not.toBeUndefined(); + }); + + it('TabPaneFilterTest12', function () { + expect(tabPaneFilter.initializeFilterTree(true,true,true)).toBeUndefined(); + }); + + it('TabPaneFilterTest13', function () { + expect(tabPaneFilter.disabledMining).toBeFalsy(); + }); + + it('TabPaneFilterTest14', function () { + tabPaneFilter.disabledMining = true + expect(tabPaneFilter.disabledMining).toBeTruthy(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneFps.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneFps.test.ts new file mode 100644 index 0000000..7fb7271 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneFps.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabPaneFps} from "../../../../../dist/trace/component/trace/sheet/TabPaneFps.js"; +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); + +describe('TabPaneFps Test', () => { + let tabPaneFps = new TabPaneFps(); + + it('TabPaneFpsTest01', function () { + let mockgetTabFps = sqlit.getTabFps + mockgetTabFps.mockResolvedValue( + [ + { leftNs : 10, + rightNs: 10, + }] + ) + let a = {rightNs: 1, leftNs:1} + expect(tabPaneFps.data = a).toBeTruthy(); + }); + + it('TabPaneFpsTest02', function () { + let mockgetTabFps = sqlit.getTabFps + mockgetTabFps.mockResolvedValue([]) + let a = {rightNs: 1, leftNs:1} + expect(tabPaneFps.data = a).toBeTruthy(); + }); + + it('TabPaneFpsTest03', function () { + expect(tabPaneFps.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + " +`) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneHeap.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneHeap.test.ts new file mode 100644 index 0000000..0f64de0 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneHeap.test.ts @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +//@ts-ignore +import {TabPaneHeap} from "../../../../../dist/trace/component/trace/sheet/TabPaneHeap.js"; +//@ts-ignore +import {HeapBean} from "../../../../../dist/trace/bean/HeapBean"; +//@ts-ignore +import {HeapTreeDataBean} from "../../../../../dist/trace/bean/HeapTreeDataBean"; +//@ts-ignore +import {queryHeapAllData} from "../../../../../dist/trace/database/SqlLite"; +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); + +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneHeap Test', () => { + document.body.innerHTML = `
      ` + let tabPane = document.querySelector('.heap') as TabPaneHeap; + + let tabPaneHeap = new TabPaneHeap(); + let list = [{ + AllocationSize:0, + DeAllocationSize:0, + RemainingSize:0, + children:[{ + length:1 + }] + }] + let selection = { + leftNs:1, + rightNs:1 + } + + let heapTreeDataBean: Array = [{ + MoudleName: 'abc', + AllocationFunction: 'ccc', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + }] + + let mockGetHeapAllData = sqlit.queryHeapAllData + mockGetHeapAllData.mockResolvedValue(heapTreeDataBean); + + tabPane.data = [{ + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + }] + + it('TabPaneHeapTest01', function () { + let listData: Array = [{ + MoudleName: '', + AllocationFunction: '', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + }] + expect(tabPaneHeap.setTreeDataSize(listData)).toBeUndefined(); + }); + + it('TabPaneHeapTest02', function () { + let beanList: Array = [{ + MoudleName: '', + AllocationFunction: '', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + },{ + MoudleName: '', + AllocationFunction: '', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + }] + + let heapTreeDataBean: Array = [{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + }] + + let selectionData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + expect(tabPaneHeap.merageTree(1, beanList,heapTreeDataBean,selectionData)).toBeUndefined(); + }); + + it('TabPaneHeapTest03', function () { + expect(tabPaneHeap.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + + + " +`); + }); + + it('TabPaneHeapTest04', function () { + let beanList: Array = [{ + MoudleName: 'abc', + AllocationFunction: 'ccc', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + },{ + MoudleName: 'abc', + AllocationFunction: 'ccc', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + }] + + let heapTreeDataBean: Array = [{ + MoudleName: 'abc', + AllocationFunction: 'ccc', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + },{ + MoudleName: '', + AllocationFunction: '', + startTs: 0, + endTs: 0, + eventType: '', + depth: 0, + heapSize: 0, + eventId: "", + }] + + let selectionData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + expect(tabPaneHeap.merageTree(1, beanList,heapTreeDataBean,selectionData)).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneHistoryProcesses.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneHistoryProcesses.test.ts new file mode 100644 index 0000000..ae51f80 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneHistoryProcesses.test.ts @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabPaneHistoryProcesses} from "../../../../../dist/trace/component/trace/sheet/TabPaneHistoryProcesses.js"; +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneHistoryProcesses Test', function () { + + let tabPaneHistoryProcesses = new TabPaneHistoryProcesses(); + it('TabPaneHistoryProcessesTest01 ', function () { + tabPaneHistoryProcesses.queryResult.length = 1; + expect(tabPaneHistoryProcesses.filterData()).toBeUndefined(); + }); + + it('TabPaneHistoryProcessesTest02 ', function () { + const val = { + processId:-1, + processName:"", + alive:"", + firstSeen:"", + lastSeen:"", + responsibleProcess:"", + userName:"", + cpuTime:"" + } + expect(tabPaneHistoryProcesses.toProcessHistoryArray(val)).not.toBeUndefined(); + }); + + it('TabPaneHistoryProcessesTest03 ', function () { + expect(tabPaneHistoryProcesses.sortByColumn({ + key:'startTime', + })).toBeUndefined(); + }); + + it('TabPaneHistoryProcessesTest04 ', function () { + expect(tabPaneHistoryProcesses.sortByColumn({ + key:'alive', + })).toBeUndefined(); + }); + + it('TabPaneHistoryProcessesTest05 ', function () { + expect(tabPaneHistoryProcesses.sortByColumn({ + key:!'startTime'&&!'alive', + })).toBeUndefined(); + }); + +}); \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneLiveProcesses.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneLiveProcesses.test.ts new file mode 100644 index 0000000..75cb063 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneLiveProcesses.test.ts @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabPaneLiveProcesses} from "../../../../../dist/trace/component/trace/sheet/TabPaneLiveProcesses.js"; +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneLiveProcesses Test',function (){ + let tabPaneLiveProcesses = new TabPaneLiveProcesses(); + + it('TabPaneLiveProcessesTest01 ', function () { + tabPaneLiveProcesses.queryResult.length = 1; + expect(tabPaneLiveProcesses.filterData()).toBeUndefined(); + }); + + it('TabPaneLiveProcessesTest02 ', function () { + const live={ + processId:1, + processName:"", + responsibleProcess:"", + userName:"", + cpu:"1", + threads:-1, + memory:'', + diskReads:-1, + diskWrite:-1 + } + expect(tabPaneLiveProcesses.toLiveProcessArray(live)).not.toBeUndefined(); + }); + + it('TabPaneLiveProcessesTest03 ', function () { + expect(tabPaneLiveProcesses.sortByColumn({ + key:'startTime', + })).toBeUndefined(); + }); + + it('TabPaneLiveProcessesTest07 ', function () { + expect(tabPaneLiveProcesses.sortByColumn({ + key:'cpuTime', + })).toBeUndefined(); + }); + + it('TabPaneLiveProcessesTest04 ', function () { + expect(tabPaneLiveProcesses.sortByColumn({ + key:!'startTime'|| !'cpuTime', + })).toBeUndefined(); + }); + + it('TabPaneLiveProcessesTest05', function () { + expect(tabPaneLiveProcesses.timeFormat(70000)).toBe("1:10.0s "); + }); + + it('TabPaneLiveProcessesTest06', function () { + expect(tabPaneLiveProcesses.timeFormat(2000)).toBe("2.0s "); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneMemoryAbility.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneMemoryAbility.test.ts new file mode 100644 index 0000000..2005fc5 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneMemoryAbility.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +//@ts-ignore +import {TabPaneMemoryAbility} from "../../../../../dist/trace/component/trace/sheet/TabPaneMemoryAbility.js"; +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneMemoryAbility Test', () => { + let tabPaneMemoryAbility = new TabPaneMemoryAbility(); + + it('TabPaneMemoryAbilityTest01', function () { + tabPaneMemoryAbility.queryResult.length = 1; + expect(tabPaneMemoryAbility.filterData()).toBeUndefined(); + }); + + it('TabPaneMemoryAbilityTest02', function () { + const systemMemorySummary = [{ + startTimeStr:"1", + durationStr:"1", + cached:"1", + swapTotal:"1" + }] + expect(tabPaneMemoryAbility.toMemoryAbilityArray(systemMemorySummary)).not.toBeUndefined(); + }); + + it('TabPaneMemoryAbilityTest03', function () { + expect(tabPaneMemoryAbility.sortByColumn({ + key:'startTime' + })).toBeUndefined(); + }); + + it('TabPaneMemoryAbilityTest04', function () { + expect(tabPaneMemoryAbility.sortByColumn({ + key:!'startTime' + })).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneNMCallInfo.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneNMCallInfo.test.ts new file mode 100644 index 0000000..4daa75e --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneNMCallInfo.test.ts @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {TabPaneNMCallInfo} from "../../../../../dist/trace/component/trace/sheet/TabPaneNMCallInfo.js" +// @ts-ignore +import {HeapBean} from "../../../../../dist/trace/bean/HeapBean.js"; +import {queryHeapAllData} from "../../../../../src/trace/database/SqlLite"; +import {NativeHookCallInfo} from "../../../../../src/trace/bean/NativeHook"; +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); + +window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), +})); + +describe('TabPaneNMCallInfo Test', () => { + document.body.innerHTML = '' + let tabPaneNMCallInfo = document.querySelector('#ddd') + + let mockGetNativeHookEventTid = sqlit.queryNativeHookEventTid + + let nativeHookData = [ + { + eventId: 0, + eventType: "", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 0, + count: 0, + tid: 0, + isSelected: false, + }, + { + eventId: 0, + eventType: "", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 0, + count: 0, + tid: 0, + isSelected: false, + }, + ] + + mockGetNativeHookEventTid.mockResolvedValue(nativeHookData); + tabPaneNMCallInfo.currentSelection = jest.fn(()=>true) + TabPaneNMCallInfo.data = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined + } + it('TabPaneNMCallInfoTest01', function () { + let array = new Array(); + array.push({ + MoudleName: '', + AllocationFunction: '', + Allocations: 0, + Deallocations: 0, + AllocationSize: 0, + DeAllocationSize: 0, + Total: 0, + RemainingSize: 0, + children: [], + depth: 0, + }) + tabPaneNMCallInfo.groupByWithTid = jest.fn(()=>true) + let handleQueryResult = tabPaneNMCallInfo.handleQueryResult(nativeHookData); + expect(handleQueryResult).toEqual(true) + }); + + it('TabPaneNMCallInfoTest02', function () { + tabPaneNMCallInfo.currentSelection = jest.fn(()=>true) + tabPaneNMCallInfo.queryResult = jest.fn(()=>nativeHookData) + expect(tabPaneNMCallInfo.filterQueryData()).toBeUndefined(); + }); + + it('TabPaneNMCallInfoTest03', function () { + let hookData = new Array(); + hookData.push({ + id: "", + pid: "", + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0, + isSelected:false + }) + + tabPaneNMCallInfo.frameChart = jest.fn(()=>undefined) + tabPaneNMCallInfo.frameChart.calculateChartData = jest.fn(()=>true) + tabPaneNMCallInfo.frameChart.updateCanvas = jest.fn(()=>true) + let groupByWithTid = tabPaneNMCallInfo.groupByWithTid(hookData); + expect(groupByWithTid.length).toEqual(undefined) + }); + + it('TabPaneNMCallInfoTest04', function () { + let hookLeft = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + + let hookRight = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 1, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let ListToTree = tabPaneNMCallInfo.listToTree(hookRight, hookLeft); + expect(ListToTree).toBeUndefined() + }); + + it('TabPaneNMCallInfoTest05', function () { + let hookLeft = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + + let hookRight = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [hookLeft], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let groupByWithTid = tabPaneNMCallInfo.listToTree(hookLeft, hookRight); + expect(groupByWithTid).toBeUndefined() + }); + + it('TabPaneNMCallInfoTest06', function () { + let target = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [{length:1}], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let src = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let groupByWithTid = tabPaneNMCallInfo.mergeTree(target,src); + expect(groupByWithTid).toBeUndefined() + }); + + it('TabPaneNMCallInfoTest07', function () { + let target = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0, + length:1 + } + + let src = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [target], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 0, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let groupByWithTid = tabPaneNMCallInfo.mergeTree(target, src); + expect(groupByWithTid).toBeUndefined() + }); + + it('TabPaneNMCallInfoTest08', function () { + let hookLeft = { + id: "", + pid: '', + library: "", + title: "", + count: 0, + children: [], + depth: 0, + frame: undefined, + isHover: false, + parent: undefined, + size: 2, + symbol: "", + type: 0, + heapSize: 0, + heapSizeStr: "", + eventId: 0, + threadId: 0 + } + let groupByWithTid = tabPaneNMCallInfo.setRightTableData(hookLeft); + expect(groupByWithTid).toBeUndefined() + }); + + it('TabPaneNMCallInfoTest10', function () { + expect(tabPaneNMCallInfo.sortTreeByColumn()).toBeUndefined(); + }); + + it('TabPaneNMCallInfoTest11', function () { + expect(tabPaneNMCallInfo.initHtml()).toMatchInlineSnapshot(` +" + +
      + +
      + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      + + + + +
      + " +`); + }); + +}) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneNMSampleList.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneNMSampleList.test.ts new file mode 100644 index 0000000..d889fa0 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneNMSampleList.test.ts @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {TabPaneNMSampleList} from "../../../../../dist/trace/component/trace/sheet/TabPaneNMSampleList.js" +// @ts-ignore +import {LitTable} from "../../../../../dist/base-ui/table/lit-table"; +const sqlit = require("../../../../../dist/trace/database/SqlLite.js") +jest.mock("../../../../../dist/trace/database/SqlLite.js"); + +window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), +})); +describe('TabPaneNMSampleList Test', () => { + document.body.innerHTML = '' + let tabPaneNMSampleList = document.querySelector('#ddt') + let mockGeTabCounters = sqlit.getTabCounters + let mockGetHookData = sqlit.queryAllHookData + let mockGetNativeHookEventId = sqlit.queryNativeHookEventId + let mockGetNativeHookSnapshot = sqlit.queryNativeHookSnapshot + let mockGetNativeHookSnapshotTypes = sqlit.queryNativeHookSnapshotTypes + + TabPaneNMSampleList.source = [{ + current: "", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "", + growth: "", + total: 0, + totalGrowth: "", + existing: 0, + children: [], + tempList: [], + timestamp: "", + eventId: -1, + }] + TabPaneNMSampleList.filterSelect = '0' + + tabPaneNMSampleList.currentSelection = jest.fn(()=>true) + let dat = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined + } + + let NativeHookSnapshotTypes = [{ + eventId: -1, + current: 0, + eventType: "", + subType: "", + growth: 0, + existing: 0, + addr: "", + startTs: 0, + endTs: 0, + total: 0, + children: [], + }] + + mockGetNativeHookSnapshotTypes.mockResolvedValue(NativeHookSnapshotTypes); + mockGetHookData.mockResolvedValue(NativeHookSnapshotTypes); + mockGetNativeHookSnapshot.mockResolvedValue([]); + + tabPaneNMSampleList.data = dat + it('TabPaneNMSampleListTest01', function () { + expect(TabPaneNMSampleList.serSelection(dat)).toBeUndefined() + }); + + it('TabPaneNMSampleListTest02', function () { + let sampleData = { + index: 0, + eventId: 0, + eventType: "", + subType: "", + addr: "", + startTs: 0, + timestamp: "", + heapSize: 0, + heapSizeUnit: "", + symbol: "", + library: "", + } + expect(TabPaneNMSampleList.addSampleData(sampleData)).toBeUndefined() + }); + + it('TabPaneNMSampleListTest03', function () { + let sampleData = { + index: 0, + eventId: 0, + eventType: "", + subType: "", + addr: "", + startTs: 0, + timestamp: "", + heapSize: 0, + heapSizeUnit: "", + symbol: "", + library: "", + } + + let snapshot = { + current: "", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "", + growth: "", + total: 0, + totalGrowth: "", + existing: 0, + children: [], + tempList: [], + timestamp: "", + eventId: -1, + } + + expect(TabPaneNMSampleList.querySnapshot(sampleData, snapshot)).toBeUndefined() + }); + + it('TabPaneNMSampleListTest04', function () { + let snapshot = { + current: "", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "", + growth: "", + total: 0, + totalGrowth: "", + existing: 0, + children: [], + tempList: [], + timestamp: "", + eventId: -1, + } + + let snapshotLeft = { + current: "", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "", + growth: "", + total: 0, + totalGrowth: "", + existing: 0, + children: [snapshot], + tempList: [], + timestamp: "", + eventId: -1, + } + + let snapshotRight = { + current: "", + currentSize: 0, + startTs: 0, + heapSize: 0, + snapshot: "", + growth: "", + total: 0, + totalGrowth: "", + existing: 0, + children: [snapshot], + tempList: [], + timestamp: "", + eventId: -1, + } + expect(TabPaneNMSampleList.prepChild(snapshotLeft, snapshotRight)).toBeUndefined() + }); + + it('TabPaneNMSampleListTest05', function () { + expect(tabPaneNMSampleList.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + + + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      + " +`); + }); + + it('TabPaneNMSampleListTest09', function () { + let rootSample ={ + growth:1, + existing:1, + children:[], + total:1 + } + + let merageSample ={ + growth:1, + endTs:2, + startTs:2, + addr:"1", + eventId:0, + } + expect(TabPaneNMSampleList.merageSampleData(1,1,rootSample,merageSample)).toBeUndefined() + }); +}) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneNMStatstics.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneNMStatstics.test.ts new file mode 100644 index 0000000..1edfb47 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneNMStatstics.test.ts @@ -0,0 +1,371 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {TabPaneNMStatstics} from "../../../../../dist/trace/component/trace/sheet/TabPaneNMStatstics.js" +// @ts-ignore +import {NativeHookMalloc, NativeHookStatistics, NativeHookStatisticsTableData} from "../../../../../dist/trace/bean/NativeHook"; + +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneNMStatstics Test', () => { + let tabPaneNMStatstics = new TabPaneNMStatstics(); + document.body.innerHTML = '
      ' + + it('TabPaneNMStatsticsTest01', function () { + expect(tabPaneNMStatstics.setMallocTableData([1],[1])).toBeUndefined(); + }); + it('TabPaneNMStatsticsTest09', function () { + expect(tabPaneNMStatstics.setSubTypeTableData([1],[1])).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest02', function () { + let nativeHookMalloc: Array = [{ + eventType: "", + subType: "", + heapSize: 0, + allocByte: 0, + allocCount: 0, + freeByte: 0, + freeCount: 0, + }] + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setSubTypeTableData(nativeHookMalloc,nativeHookStatisticsTableData)).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest03', function () { + expect(tabPaneNMStatstics.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + + + + + " +`); + }); + + it('TabPaneNMStatsticsTest04', function () { + let valData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let nativeHookStatistics: Array = [{ + eventId: 0, + eventType: "AllocEvent", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 100000, + count: 0, + tid: 0, + isSelected: false, + }] + + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setMemoryTypeData(valData,nativeHookStatistics, nativeHookStatisticsTableData)).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest05', function () { + let valData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: ["All Heap"], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let nativeHookStatistics: Array = [{ + eventId: 0, + eventType: "FreeEvent", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 100000, + count: 0, + tid: 0, + isSelected: false, + }] + + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setMemoryTypeData(valData,nativeHookStatistics, nativeHookStatisticsTableData)).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest06', function () { + let valData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: ["All Anonymous VM"], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let nativeHookStatistics: Array = [{ + eventId: 0, + eventType: "MmapEvent", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 100000, + count: 0, + tid: 0, + isSelected: false, + }] + + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setMemoryTypeData(valData,nativeHookStatistics, nativeHookStatisticsTableData)).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest07', function () { + let valData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: ["All Anonymous VM"], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let nativeHookStatistics: Array = [{ + eventId: 0, + eventType: "MunmapEvent", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 100000, + count: 0, + tid: 0, + isSelected: false, + }] + + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 0, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setMemoryTypeData(valData,nativeHookStatistics, nativeHookStatisticsTableData)).toBeUndefined(); + }); + + it('TabPaneNMStatsticsTest08', function () { + let valData = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: ["All Heap & Anonymous VM", "All Heap", "All Anonymous VM"], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let nativeHookStatistics: Array = [{ + eventId: 0, + eventType: "FreeEvent", + subType: "", + heapSize: 0, + addr: "", + startTs: 0, + endTs: 0, + sumHeapSize: 0, + max: 100000, + count: 0, + tid: 0, + isSelected: false, + }] + + let nativeHookStatisticsTableData: Array = [{ + memoryTap: "", + existing: 0, + existingString: "", + allocCount: 0, + freeCount: 0, + totalBytes: 0, + totalBytesString: "", + maxStr: "", + max: 100, + totalCount: 0, + existingValue: [], + }] + + expect(tabPaneNMStatstics.setMemoryTypeData(valData,nativeHookStatistics, nativeHookStatisticsTableData)).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneNMemory.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneNMemory.test.ts new file mode 100644 index 0000000..879c43b --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneNMemory.test.ts @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +//@ts-ignore +import {TabPaneNMemory} from "../../../../../dist/trace/component/trace/sheet/TabPaneNMemory.js" + +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPaneNMemory Test', () => { + let tabPaneNMemory = new TabPaneNMemory(); + let val={ + statisticsSelectData:{ + memoryTap:1 + } + } + let hook={eventId:1} + + it('TabPaneNMemoryTest01', function () { + expect(tabPaneNMemory.getTypeFromIndex(-1)).not.toBeUndefined(); + }); + + it('TabPaneNMemoryTest02', function () { + expect(tabPaneNMemory.getTypeFromIndex(0)).not.toBeUndefined(); + }); + + it('TabPaneNMemoryTest03', function () { + expect(tabPaneNMemory.getTypeFromIndex(1,{eventType:"AllocEvent"})).not.toBeUndefined(); + }); + + it('TabPaneNMemoryTest04', function () { + expect(tabPaneNMemory.getTypeFromIndex(2,{eventType:"MmapEvent"})).not.toBeUndefined(); + }); + + it('TabPaneNMemoryTest05', function () { + expect(tabPaneNMemory.handleQueryResult([1])).not.toBeUndefined(); + }); + + it('TabPaneNMemoryTest06', function () { + expect(tabPaneNMemory.initFilterTypes()).toBeUndefined(); + }); + + it('TabPaneNMemoryTest07', function () { + expect(tabPaneNMemory.filterQueryData()).toBeUndefined(); + }); + + it('TabPaneNMemoryTest08', function () { + expect(tabPaneNMemory.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + +
      +
      + " +`); + }); + + it('TabPaneNMemoryTest09', function () { + tabPaneNMemory.tblData = jest.fn(()=>undefined) + tabPaneNMemory.tblData.recycleDataSource = jest.fn(()=>true) + expect(tabPaneNMemory.setRightTableData()).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneNetworkAbility.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneNetworkAbility.test.ts new file mode 100644 index 0000000..b248143 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPaneNetworkAbility.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabPaneNetworkAbility} from "../../../../../dist/trace/component/trace/sheet/TabPaneNetworkAbility.js"; +window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(()=>({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), +})) + +describe('TabPaneNetworkAbility Test', ()=>{ + + let tabPaneNetworkAbility = new TabPaneNetworkAbility(); + it('TabPaneNetworkAbilityTest01',()=>{ + tabPaneNetworkAbility.queryResult.length = 1; + expect(tabPaneNetworkAbility.filterData()).toBeUndefined(); + }); + + it('TabPaneNetworkAbilityTest02 ', function () { + const val = { + startTimeStr:"", + durationStr:"", + dataReceivedStr:"", + dataReceivedSecStr:"", + dataSendSecStr:"", + dataSendStr:"", + packetsIn:-1, + packetsOut:-1, + packetsOutSec:-1 + } + expect(tabPaneNetworkAbility.toNetWorkAbilityArray(val)).not.toBeUndefined(); + }); + + it('TabPaneNetworkAbilityTest03 ', function () { + expect(tabPaneNetworkAbility.sortByColumn({ + key:'startTime', + })).toBeUndefined(); + }); + + it('TabPaneNetworkAbilityTest04 ', function () { + expect(tabPaneNetworkAbility.sortByColumn({ + key:!'startTime', + })).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/sheet/TabPanePTS.test.ts b/host/ide/test/trace/component/trace/sheet/TabPanePTS.test.ts index 76a843c..956e44b 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPanePTS.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPanePTS.test.ts @@ -15,14 +15,55 @@ // @ts-ignore import {TabPanePTS} from "../../../../../dist/trace/component/trace/sheet/TabPanePTS.js" +// @ts-ignore +import {SpSystemTrace} from "../../../../../dist/trace/component/SpSystemTrace.js"; window.ResizeObserver = window.ResizeObserver ||jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), observe: jest.fn(), unobserve: jest.fn(), })); describe('TabPanePTS Test', () => { + document.body.innerHTML = `
      ` + let tabPane = document.querySelector('.pts') as TabPanePTS; let tabPanePTS = new TabPanePTS(); - + + SpSystemTrace.SPT_DATA = [{ + process: "", + processId: 0, + thread: "", + threadId: 0, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + },{ + process: "", + processId: 1, + thread: "", + threadId: 1, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + },{ + process: "", + processId: 2, + thread: "", + threadId: 2, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + }] let dataArray = [{ id: "", @@ -56,4 +97,59 @@ describe('TabPanePTS Test', () => { let result = tabPanePTS.groupByThreadToMap(dataArray) expect(result.get(0).length).toBe(1); }); + + it('TabPanePTSTest05', function () { + let data = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let queryDataInCacheData = tabPanePTS.queryDataInCacheData(data); + expect(queryDataInCacheData.length).toBeUndefined() + }); + + it('TabPanePTSTest04', function () { + expect(tabPanePTS.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneSPT.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneSPT.test.ts index e6cdc3d..4458262 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneSPT.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneSPT.test.ts @@ -15,14 +15,74 @@ // @ts-ignore import {TabPaneSPT} from "../../../../../dist/trace/component/trace/sheet/TabPaneSPT.js" +// @ts-ignore +import {SpSystemTrace} from "../../../../../dist/trace/component/SpSystemTrace.js"; + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), observe: jest.fn(), unobserve: jest.fn(), })); + describe('TabPaneSPT Test', () => { let tabPaneSPT = new TabPaneSPT(); + + SpSystemTrace.SPT_DATA = [{ + process: "", + processId: 0, + thread: "", + threadId: 0, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + },{ + process: "", + processId: 1, + thread: "", + threadId: 1, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + },{ + process: "", + processId: 2, + thread: "", + threadId: 2, + state: '', + dur: 0, + start_ts: 0, + end_ts: 0, + cpu: 0, + priority: "-", + note: "-", + }] + + let dataList = [{ + id: "", + pid: "", + title: "", + children: [], + process: "", + processId: 0, + thread: "", + threadId: 0, + state: "", + wallDuration: 0, + avgDuration: "", + count: 0, + minDuration: 0, + maxDuration: 0, + stdDuration: "", + }] let dataArray = [{ id: "", @@ -56,4 +116,59 @@ describe('TabPaneSPT Test', () => { let result = tabPaneSPT.groupByStateProcessToMap(dataArray) expect(result.get('').get(0).length).toBe(1); }); + + it('TabPaneSPTTest05', function () { + let data = { + cpus: [], + threadIds: [], + trackIds: [], + funTids: [], + heapIds: [], + nativeMemory: [], + cpuAbilityIds: [], + memoryAbilityIds: [], + diskAbilityIds: [], + networkAbilityIds: [], + leftNs: 0, + rightNs: 0, + hasFps: false, + statisticsSelectData: undefined, + perfSampleIds: [], + perfCpus: [], + perfProcess: [], + perfThread: [], + perfAll: false, + } + let queryDataInCacheData = tabPaneSPT.queryDataByCacheData(data); + expect(queryDataInCacheData.length).toBeUndefined() + }); + + it('TabPaneSPTTest04', function () { + expect(tabPaneSPT.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneSlices.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneSlices.test.ts index d00e3b5..17a3a05 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneSlices.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneSlices.test.ts @@ -21,14 +21,20 @@ jest.mock("../../../../../dist/trace/database/SqlLite.js"); describe('TabPaneSlices Test', () => { let tabPaneSlices = new TabPaneSlices(); - tabPaneSlices.sortByColumn = jest.fn(()=> true) - it('TabPaneSlicesTest01', function () { expect(tabPaneSlices.sortByColumn({ key: 'name', sort: () => { } - })).toBeTruthy(); + })).toBeUndefined(); + }); + + it('TabPaneSlicesTest05', function () { + expect(tabPaneSlices.sortByColumn({ + key: !'name', + sort: () => { + } + })).toBeUndefined(); }); it('TabPaneSlicesTest02', function () { @@ -51,4 +57,29 @@ describe('TabPaneSlices Test', () => { let a = {rightNs: 1, leftNs: 0, funTids: [11, 12, 13]} expect(tabPaneSlices.data = a).toBeTruthy(); }); + + it('TabPaneSlicesTest04', function () { + expect(tabPaneSlices.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneThreadStates.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneThreadStates.test.ts index e2dcc09..53abf08 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneThreadStates.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneThreadStates.test.ts @@ -21,14 +21,20 @@ jest.mock("../../../../../dist/trace/database/SqlLite.js"); describe('TabPaneThreadStates Test', () => { let tabPaneThreadStates = new TabPaneThreadStates(); - tabPaneThreadStates.sortByColumn = jest.fn(() => true) - it('TabPaneThreadStatesTest01', function () { expect(tabPaneThreadStates.sortByColumn({ - key: 'name', + key: 'name' || "thread" || "state", + sort: () => { + } + })).toBeUndefined(); + }); + + it('TabPaneThreadStatesTest05', function () { + expect(tabPaneThreadStates.sortByColumn({ + key: !'name' || ! "thread" || !"state", sort: () => { } - })).toBeTruthy(); + })).toBeUndefined(); }); @@ -61,4 +67,40 @@ describe('TabPaneThreadStates Test', () => { let a = {rightNs: 1, leftNs: 0, threadIds: [11, 12, 13]} expect(tabPaneThreadStates.data = a).toBeTruthy(); }); + + it('TabPaneThreadStatesTest04', function () { + expect(tabPaneThreadStates.initHtml()).toMatchInlineSnapshot(` +" + +
      + + +
      + + + + + + + + + + + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPaneThreadSwitch.test.ts b/host/ide/test/trace/component/trace/sheet/TabPaneThreadSwitch.test.ts index cd1fce5..b7dc5b1 100644 --- a/host/ide/test/trace/component/trace/sheet/TabPaneThreadSwitch.test.ts +++ b/host/ide/test/trace/component/trace/sheet/TabPaneThreadSwitch.test.ts @@ -15,12 +15,14 @@ // @ts-ignore import {TabPaneThreadSwitch} from "../../../../../dist/trace/component/trace/sheet/TabPaneThreadSwitch.js" + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), observe: jest.fn(), unobserve: jest.fn(), })); + describe('TabPaneContextSwitch Test', () => { let tabPaneThreadSwitch = new TabPaneThreadSwitch(); let dataArray = [{ @@ -40,11 +42,12 @@ describe('TabPaneContextSwitch Test', () => { maxDuration: 0, stdDuration: "", }] -let val={ - leftNs:1, - rightNs:1, -} + let val={ + leftNs:1, + rightNs:1, + } + it('TabPaneThreadSwitchTest01', function () { let result = tabPaneThreadSwitch.groupByStateToMap(dataArray); expect(result.get('').length).toBe(1); @@ -60,14 +63,36 @@ let val={ expect(result.get('').get(0).length).toBe(1); }); + it('TabPaneThreadSwitchTest04', function () { - expect(tabPaneThreadSwitch.data).toBeUndefined(); + document.body.innerHTML = `` + let tabPaneThreadSwitch = document.querySelector('#ThreadSwitch') as TabPaneThreadSwitch + tabPaneThreadSwitch.data = false + expect(tabPaneThreadSwitch.data).toBeFalsy(); }); - it('TabPaneThreadSwitchTest05', function () { - expect(tabPaneThreadSwitch.queryDataByCacheData(val)).toBeUndefined(); + it('TabPaneThreadSwitchTest06', function () { + expect(tabPaneThreadSwitch.initElements()).toBeUndefined(); }); - - + it('TabPaneThreadSwitchTest07', function () { + expect(tabPaneThreadSwitch.initHtml()).toMatchInlineSnapshot(` +" + + + + + + + + + " +`); + }); }) diff --git a/host/ide/test/trace/component/trace/sheet/TabPerfProfile.test.ts b/host/ide/test/trace/component/trace/sheet/TabPerfProfile.test.ts new file mode 100644 index 0000000..f8da759 --- /dev/null +++ b/host/ide/test/trace/component/trace/sheet/TabPerfProfile.test.ts @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {TabpanePerfProfile} from "../../../../../dist/trace/component/trace/sheet/TabPerfProfile.js" +//@ts-ignore +import {perfDataQuery} from "../../../../../dist/trace/component/hiperf/PerfDataQuery.js"; + +window.ResizeObserver = window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + +describe('TabPerfProfile Test', () => { + + document.body.innerHTML = `` + let tabpanePerfProfile = document.querySelector('#perfprofile') as TabpanePerfProfile + + it('TabpanePerfProfileTest01 ', function () { + TabpanePerfProfile.getParentTree = jest.fn(()=>true) + expect(tabpanePerfProfile.getParentTree([],{},[])).not.toBeUndefined(); + }); + + it('TabpanePerfProfileTest02 ', function () { + expect(tabpanePerfProfile.getChildTree([],"1",[])).not.toBeUndefined(); + }); + + it('TabpanePerfProfileTest03 ', function () { + let call = { + id:"1", + dur:1, + children:[] + } + expect(tabpanePerfProfile.setRightTableData(call)).toBeUndefined(); + }); + + it('TabpanePerfProfileTest04 ', function () { + expect(tabpanePerfProfile.filterSampleIds(true,"1","112")).not.toBeUndefined(); + }); + + it('TabpanePerfProfileTest05 ', function () { + expect(tabpanePerfProfile.hideSystemLibrary()).toBeUndefined(); + }); + + it('TabpanePerfProfileTest06 ', function () { + let startNum = 1 + let endNum = "∞" + expect(tabpanePerfProfile.hideNumMaxAndMin(startNum,endNum)).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/component/trace/timer-shaft/Flag.test.ts b/host/ide/test/trace/component/trace/timer-shaft/Flag.test.ts new file mode 100644 index 0000000..965a7d6 --- /dev/null +++ b/host/ide/test/trace/component/trace/timer-shaft/Flag.test.ts @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {Flag} from "../../../../../dist/trace/component/trace/timer-shaft/Flag.js"; + +describe('Flag Test',()=>{ + + it('FlagTest01 ', function () { + let flag = new Flag(); + expect(flag).not.toBeUndefined(); + }); +}) diff --git a/host/ide/test/trace/component/trace/timer-shaft/Graph.test.ts b/host/ide/test/trace/component/trace/timer-shaft/Graph.test.ts new file mode 100644 index 0000000..0e6422c --- /dev/null +++ b/host/ide/test/trace/component/trace/timer-shaft/Graph.test.ts @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {Graph} from "../../../../../dist/trace/component/trace/timer-shaft/Graph.js"; + +describe('Flag Test',()=>{ + + it('FlagTest01 ', function () { + let graph = new Graph(); + expect(graph).not.toBeUndefined(); + }); +}) diff --git a/host/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts b/host/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts index 99775c9..d2fbb9e 100644 --- a/host/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts +++ b/host/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts @@ -17,14 +17,19 @@ import {RangeRuler} from "../../../../../dist/trace/component/trace/timer-shaft/RangeRuler.js" // @ts-ignore import {Mark} from "../../../../../dist/trace/component/trace/timer-shaft/RangeRuler.js"; +import {TimerShaftElement} from "../../../../../src/trace/component/trace/TimerShaftElement"; -describe('RangeRuler Test', ()=>{ +describe('RangeRuler Test', () => { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - let rangeRuler = new RangeRuler(canvas , ctx, { + document.body.innerHTML = '' + + let timerShaftElement = document.querySelector('#timerShaftEL') as TimerShaftElement; + + let rangeRuler = new RangeRuler(timerShaftElement, { x: 20, y: 20, width: 100, @@ -32,8 +37,9 @@ describe('RangeRuler Test', ()=>{ }, { startX: 10, endX: 30 + }, () => { }); - let mark = new Mark(canvas , ctx, '', { + let mark = new Mark(canvas, ctx, '', { x: 20, y: 20, width: 100, @@ -56,7 +62,33 @@ describe('RangeRuler Test', ()=>{ expect(rangeRuler.fillX()).toBeUndefined(); }); + it('RangeRulerTest21', function () { + rangeRuler.range.startNS =-1 + expect(rangeRuler.fillX()).toBe(undefined); + }); + + it('RangeRulerTest22', function () { + rangeRuler.range.endNS =-1 + expect(rangeRuler.fillX()).toBe(undefined); + }); + + it('RangeRulerTest23', function () { + rangeRuler.range.endNS =-1; + rangeRuler.range.totalNS =-2 + expect(rangeRuler.fillX()).toBe(undefined); + }); + + it('RangeRulerTest24', function () { + rangeRuler.range.startNS =-1; + rangeRuler.range.totalNS =-2 + expect(rangeRuler.fillX()).toBe(undefined); + }); + it('RangeRulerTest03', function () { + // window.requestAnimationFrame = window.requestAnimationFrame || + // jest.fn().mockImplementation(() => ({ + // + // })); expect(rangeRuler.keyPress({ key: 'w' })).toBeUndefined(); @@ -117,20 +149,20 @@ describe('RangeRuler Test', ()=>{ }); it('RangeRulerTest13', function () { - rangeRuler.markA = jest.fn(()=>true) - rangeRuler.rangeRect = jest.fn(()=>true) - rangeRuler.rangeRect.containsWithPadding = jest.fn(()=>true) + rangeRuler.markA = jest.fn(() => true) + rangeRuler.rangeRect = jest.fn(() => true) + rangeRuler.rangeRect.containsWithPadding = jest.fn(() => true) - rangeRuler.markA = jest.fn(()=> { + rangeRuler.markA = jest.fn(() => { return { frame: { x: 20 } } }) - rangeRuler.markA.isHover = jest.fn(()=> true) - rangeRuler.markA.frame = jest.fn(()=> []) - rangeRuler.markA.frame.x = jest.fn(()=>true) + rangeRuler.markA.isHover = jest.fn(() => true) + rangeRuler.markA.frame = jest.fn(() => []) + rangeRuler.markA.frame.x = jest.fn(() => true) expect(rangeRuler.mouseDown({ key: '' @@ -138,62 +170,75 @@ describe('RangeRuler Test', ()=>{ }); it('RangeRulerTest14', function () { - rangeRuler.markA = jest.fn(()=>true) - rangeRuler.rangeRect = jest.fn(()=>true) - rangeRuler.rangeRect.containsWithPadding = jest.fn(()=>false) - rangeRuler.frame = jest.fn(()=>false) - rangeRuler.frame.containsWithMargin = jest.fn(()=> true) - rangeRuler.rangeRect.containsWithMargin = jest.fn(()=> false) - rangeRuler.markB.isHover = jest.fn(()=> true) - rangeRuler.markB.frame = jest.fn(()=> true) - rangeRuler.markB.frame.x = jest.fn(()=>true) + rangeRuler.markA = jest.fn(() => true) + rangeRuler.rangeRect = jest.fn(() => true) + rangeRuler.rangeRect.containsWithPadding = jest.fn(() => false) + rangeRuler.frame = jest.fn(() => false) + rangeRuler.frame.containsWithMargin = jest.fn(() => true) + rangeRuler.rangeRect.containsWithMargin = jest.fn(() => false) + rangeRuler.markB.isHover = jest.fn(() => true) + rangeRuler.markB.frame = jest.fn(() => true) + rangeRuler.markB.frame.x = jest.fn(() => true) expect(rangeRuler.mouseDown({ key: '' })).toBeUndefined(); }); it('RangeRulerTest15', function () { - rangeRuler.markA = jest.fn(()=>true) - rangeRuler.markA.inspectionFrame = jest.fn(()=>true) - rangeRuler.markA.inspectionFrame.contains = jest.fn(()=>true) - rangeRuler.markA.frame = jest.fn(()=> true) - rangeRuler.markA.frame.x = jest.fn(()=>true) - rangeRuler.markA.draw = jest.fn(()=>true) + rangeRuler.markA = jest.fn(() => true) + rangeRuler.markA.inspectionFrame = jest.fn(() => true) + rangeRuler.markA.inspectionFrame.contains = jest.fn(() => true) + rangeRuler.markA.frame = jest.fn(() => true) + rangeRuler.markA.frame.x = jest.fn(() => true) + rangeRuler.markA.draw = jest.fn(() => true) + rangeRuler.centerXPercentage = jest.fn(() => -1) expect(rangeRuler.mouseMove({ key: '' })).toBeUndefined(); }); - it('RangeRulerTest16', ()=> { - rangeRuler.markA = jest.fn(()=>false) - rangeRuler.markA.draw = jest.fn(()=>true) - rangeRuler.markA.frame = jest.fn(()=> true) - rangeRuler.markA.frame.x = jest.fn(()=>true) - rangeRuler.markA.inspectionFrame = jest.fn(()=>false) - rangeRuler.markA.inspectionFrame.contains = jest.fn(()=>false) - rangeRuler.movingMark = jest.fn(()=>false) - rangeRuler.movingMark.frame = jest.fn(()=> false) - rangeRuler.movingMark.frame.x = jest.fn(()=>false) - rangeRuler.rangeRect = jest.fn(()=>true) - rangeRuler.rangeRect.containsWithPadding = jest.fn(()=>true) - rangeRuler.movingMark.inspectionFrame = jest.fn(()=>false) - rangeRuler.movingMark.inspectionFrame.x = jest.fn(()=>false) + it('RangeRulerTest16', () => { + rangeRuler.markA = jest.fn(() => false) + rangeRuler.markA.draw = jest.fn(() => true) + rangeRuler.markA.frame = jest.fn(() => true) + rangeRuler.markA.frame.x = jest.fn(() => true) + rangeRuler.markA.inspectionFrame = jest.fn(() => false) + rangeRuler.markA.inspectionFrame.contains = jest.fn(() => false) + rangeRuler.movingMark = jest.fn(() => false) + rangeRuler.movingMark.frame = jest.fn(() => false) + rangeRuler.movingMark.frame.x = jest.fn(() => false) + rangeRuler.rangeRect = jest.fn(() => true) + rangeRuler.rangeRect.containsWithPadding = jest.fn(() => true) + rangeRuler.movingMark.inspectionFrame = jest.fn(() => false) + rangeRuler.movingMark.inspectionFrame.x = jest.fn(() => false) expect(rangeRuler.mouseMove({ key: '' })).toBeUndefined(); }); - it('RangeRulerTest17', ()=> { - rangeRuler.notifyHandler = jest.fn(()=>true) - rangeRuler.movingMark.inspectionFrame.x = jest.fn(()=>false) - rangeRuler.c = jest.fn(()=>true) - rangeRuler.frame = jest.fn(()=>true) - rangeRuler.frame.x = jest.fn(()=>true) - rangeRuler.frame.y = jest.fn(()=>true) - rangeRuler.c.clearRect = jest.fn(()=>true) + + it('RangeRulerTest17', () => { + rangeRuler.notifyHandler = jest.fn(() => true) + rangeRuler.movingMark.inspectionFrame.x = jest.fn(() => false) + // rangeRuler.c = jest.fn(()=>true) + // rangeRuler.c.clearRect = jest.fn(()=>true) + rangeRuler.frame = jest.fn(() => true) + rangeRuler.frame.x = jest.fn(() => true) + rangeRuler.frame.y = jest.fn(() => true) expect(rangeRuler.draw()).toBeUndefined(); }); it('RangeRulerTest18', function () { expect(mark.isHover).toBeTruthy(); }); + it('RangeRulerTest19', function () { + rangeRuler.clearRect = jest.fn(() => true) + expect(rangeRuler.draw()).toBeUndefined(); + + }) + + it('RangeRulerTest20', function () { + rangeRuler.setRangeNS(0, 2000) + expect(rangeRuler.getRange().startX).toBe(0) + + }) }) diff --git a/host/ide/test/trace/component/trace/timer-shaft/SportRuler.test.ts b/host/ide/test/trace/component/trace/timer-shaft/SportRuler.test.ts index 41d3e83..3a9f48d 100644 --- a/host/ide/test/trace/component/trace/timer-shaft/SportRuler.test.ts +++ b/host/ide/test/trace/component/trace/timer-shaft/SportRuler.test.ts @@ -15,18 +15,30 @@ // @ts-ignore import {SportRuler} from "../../../../../dist/trace/component/trace/timer-shaft/SportRuler.js" +// @ts-ignore +import {TimerShaftElement} from "../../../../../dist/trace/component/trace/TimerShaftElement.js"; +// @ts-ignore +import {Flag} from "../../../../../dist/trace/component/trace/timer-shaft/Flag.js"; +// @ts-ignore +import {TraceRow, RangeSelectStruct} from "../../../../../dist/trace/component/trace/base/TraceRow.js"; -describe('SportRuler Test', ()=>{ +describe('SportRuler Test', () => { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - let sportRuler = new SportRuler(canvas, ctx, { + document.body.innerHTML = '' + + let timerShaftElement = document.querySelector('#timerShaftEL') as TimerShaftElement; + + let sportRuler = new SportRuler(timerShaftElement, { x: 20, y: 20, width: 100, height: 100, + }, () => { + }, () => { }); sportRuler.range = { @@ -39,29 +51,6 @@ describe('SportRuler Test', ()=>{ xsTxt: [], } - it('SportRulerTest01', function () { - expect(sportRuler.drawTheFlag(2, '#999999', false, 'text')).toBeUndefined(); - }); - - it('SportRulerTest02', function () { - let randomRgbColor = sportRuler.randomRgbColor(); - let isColor = randomRgbColor.length > 4; - expect(isColor).toBeTruthy() - }); - - it('SportRulerTest03', function () { - expect(sportRuler.onFlagRangeEvent({ - x: 0, - y: 0, - width: 0, - height: 0, - time: 0, - color: "", - selected: false, - text: "", - }, 2)).toBeUndefined(); - }); - it('SportRulerTest04', function () { expect(sportRuler.mouseMove({ offsetY: 20, @@ -74,31 +63,219 @@ describe('SportRuler Test', ()=>{ expect(ranges.endNS).toBe(20); }) - it('SportRulerTest06', function () { - sportRuler.flagListIdx = jest.fn(()=>"flagListIdx") - sportRuler.flagList = jest.fn(()=>true) - expect(sportRuler.modifyFlagList('amend', {})).toBeUndefined(); - }) + // it('SportRulerTest06', function () { + // sportRuler.flagListIdx = jest.fn(() => "flagListIdx") + // sportRuler.flagList = jest.fn(() => true) + // expect(sportRuler.modifyFlagList('amend', {})).toBeUndefined(); + // }) it('SportRulerTest07', function () { - sportRuler.flagList.splice = jest.fn(()=>true) - expect(sportRuler.modifyFlagList('remove', {})).toBeUndefined(); + sportRuler.flagList.splice = jest.fn(() => true) + expect(sportRuler.modifyFlagList('remove')).toBeUndefined(); }) it('SportRulerTest08', function () { + let numbers = Array(); + numbers.push(12) + numbers.push(56) + sportRuler.flagList = [{ + totalNS: 10000, + startX: 0, + endX: 1000, + startNS: 0, + endNS: 10000, + xs: numbers, + xsTxt: ['s', 'f'] + }] + sportRuler.flagList.xs = jest.fn(()=> numbers) + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 20, + color: "", + selected: false, + text: "", + hidden: false, + type: "", + }) + sportRuler.flagList = flags; + + let rangeSelectStruct = new RangeSelectStruct(); + rangeSelectStruct.startNS = 20 + rangeSelectStruct.endX = 1000 + rangeSelectStruct.startNS = 20 + rangeSelectStruct.endNS = 200 + // TraceRow.rangeSelectObject = rangeSelectStruct expect(sportRuler.draw()).toBeUndefined(); }) it('SportRulerTest09', function () { - expect(sportRuler.mouseUp()).toBeUndefined(); + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 20, + color: "", + selected: false, + text: "", + hidden: false, + type: "", + }) + sportRuler.flagList = flags; + sportRuler.edgeDetection = jest.fn(()=> true) + + expect(sportRuler.mouseUp({offsetX: 20})).toBeUndefined(); }) it('SportRulerTest10', function () { - sportRuler.draw = jest.fn(()=>true) + sportRuler.draw = jest.fn(() => true) expect(sportRuler.mouseMove({ offsetX: 10000, offsetY: 10000 })).toBeUndefined(); }); + it('SportRulerTest11', function () { + let range = sportRuler.range; + expect(sportRuler.range.endNS).toBe(20) + }) + + it('SportRulerTest12', function () { + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 0, + color: "", + selected: false, + text: "", + hidden: false, + type: "", + }) + sportRuler.flagList = flags; + sportRuler.drawTriangle(1000, 'triangle'); + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest13', function () { + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 1000, + color: "", + selected: false, + text: "", + hidden: false, + type: "triangle", + }) + sportRuler.flagList = flags; + sportRuler.drawTriangle(1000, 'triangle'); + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest14', function () { + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 0, + color: "", + selected: false, + text: "", + hidden: false, + type: "triangle", + }) + sportRuler.flagList = flags; + sportRuler.drawTriangle(1000, 'square'); + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest22', function () { + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 0, + color: "", + selected: false, + text: "", + hidden: false, + type: "triangle", + }) + sportRuler.flagList = flags; + sportRuler.drawTriangle(1000, 'inverted'); + + }) + + // it('SportRulerTest15', function () { + // sportRuler.flagList.findIndex = jest.fn(() => 0) + // sportRuler.drawTriangle(1000, 'square') + // expect(sportRuler.range()).toBeUndefined(); + // }) + + // it('SportRulerTest16', function () { + // sportRuler.flagList.findIndex = jest.fn(() => -1) + // sportRuler.drawTriangle(1000, 'inverted') + // expect(sportRuler.range()).toBeUndefined(); + // }) + + it('SportRulerTest17', function () { + sportRuler.removeTriangle('inverted') + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest18', function () { + sportRuler.flagList.findIndex = jest.fn(() => 0) + sportRuler.removeTriangle('square') + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest19', function () { + sportRuler.drawInvertedTriangle(100, '#000000') + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest20', function () { + sportRuler.drawFlag(100, '#000000', false, 'text', '') + // expect(sportRuler.range()).toBeUndefined(); + }) + + it('SportRulerTest23', function () { + sportRuler.drawFlag(100, '#000000', false, 'text', 'triangle') + }) + + it('SportRulerTest21', function () { + let flags = new Array() + flags.push({ + x: 0, + y: 0, + width: 0, + height: 0, + time: 20, + color: "", + selected: false, + text: "", + hidden: false, + type: "", + }) + sportRuler.flagList = flags; + sportRuler.flagList.find = jest.fn(()=> false) + expect(sportRuler.mouseUp({offsetX: 20})).toBeUndefined(); + }) + + }) diff --git a/host/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts b/host/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts index 88198fa..31483b8 100644 --- a/host/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts +++ b/host/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts @@ -21,23 +21,22 @@ describe('TabPaneFlag Test', ()=>{ canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - - let tabPaneFlag = new TabPaneFlag(canvas , ctx, { - x: 20, - y: 20, - width: 100, - height: 100 - }, 10000000000); + let tabPaneFlag = new TabPaneFlag() it('TabPaneFlagTest01', function () { + document.body.innerHTML = ' ' + tabPaneFlag = document.querySelector('#remove-flag') as TabPaneFlag; + let htmlButtonElement = document.createElement('button') as HTMLButtonElement; + document.body.appendChild(htmlButtonElement) + htmlButtonElement.dispatchEvent(new Event('click')) expect(tabPaneFlag.initElements()).toBeUndefined(); }); - it('TabPaneFlagTest01', function () { + it('TabPaneFlagTest02', function () { expect(tabPaneFlag.initHtml()).not.toBe('') }); - it('TabPaneFlagTest01', function () { + it('TabPaneFlagTest03', function () { expect(tabPaneFlag.setFlagObj({ x: 0, y: 0, @@ -47,6 +46,57 @@ describe('TabPaneFlag Test', ()=>{ color: "", selected: false, text: "", - }, 5)).toBeUndefined(); + })).toBeUndefined(); + }); + + it('TabPaneFlagTest04', function () { + expect(tabPaneFlag.initHtml()).toMatchInlineSnapshot(` +" + +
      +
      Annotation at
      + + Change color: + +
      + " +`); }); }) diff --git a/host/ide/test/trace/component/trace/timer-shaft/TimeRuler.test.ts b/host/ide/test/trace/component/trace/timer-shaft/TimeRuler.test.ts index cb3ae26..f910501 100644 --- a/host/ide/test/trace/component/trace/timer-shaft/TimeRuler.test.ts +++ b/host/ide/test/trace/component/trace/timer-shaft/TimeRuler.test.ts @@ -15,14 +15,19 @@ // @ts-ignore import {TimeRuler} from "../../../../../dist/trace/component/trace/timer-shaft/TimeRuler.js" +// @ts-ignore +import {TimerShaftElement} from "../../../../../dist/trace/component/trace/TimerShaftElement.js"; describe('TimeRuler Test', ()=>{ const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); + document.body.innerHTML = '' + + let timerShaftElement = document.querySelector('#timerShaftEL') as TimerShaftElement; - let timeRuler = new TimeRuler(canvas , ctx, { + let timeRuler = new TimeRuler(timerShaftElement ,{ x: 20, y: 20, width: 100, diff --git a/host/ide/test/trace/database/Procedure.test.ts b/host/ide/test/trace/database/Procedure.test.ts index c3cb4c9..d2d46e1 100644 --- a/host/ide/test/trace/database/Procedure.test.ts +++ b/host/ide/test/trace/database/Procedure.test.ts @@ -13,12 +13,16 @@ * limitations under the License. */ // @ts-ignore -import {procedurePool} from "../../../dist/trace/database/Procedure.js" +import {procedurePool,ProcedureThread} from "../../../dist/trace/database/Procedure.js" describe('procedure Test', () => { - // let procedure = new procedurePool(); + + it('ProfilerClientTest02', function () { + expect(procedurePool.isIdle()).not.toBeUndefined(); + }); + it('ProfilerClientTest01', function () { - expect(procedurePool.uuid).toBeUndefined(); + expect(procedurePool.submitWithName()).toBeUndefined(); }); - }) +}) diff --git a/host/ide/test/trace/database/ProcedureWorker.test.ts b/host/ide/test/trace/database/ProcedureWorker.test.ts new file mode 100644 index 0000000..e808f3b --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorker.test.ts @@ -0,0 +1,38 @@ +// @ts-ignore +import {ProcedureWorker,drawSelection} from "../../../dist/trace/database/ProcedureWorker.js"; + + +describe('ProcedureWorker Test', ()=>{ + + it('ProcedureWorkerTest01', function () { + const context = { + globalAlpha:0.5, + fillStyle:"#666666", + fillRect:'', + } + const params ={ + isRangeSelect:{}, + rangeSelectObject:{ + startX:"", + endX:"", + startNS:"", + endNS:"", + + }, + startNS:"", + endNS:"", + totalNS:1, + frame:{ + x:"", + y:"", + height:1, + width:1, + } + + } + let drawSelection = jest.fn(() => true) + // @ts-ignore + expect(drawSelection(context,params)).toBeTruthy(); + + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerCPU.test.ts b/host/ide/test/trace/database/ProcedureWorkerCPU.test.ts new file mode 100644 index 0000000..04f5768 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerCPU.test.ts @@ -0,0 +1,80 @@ +// @ts-ignore +import {cpu, CpuStruct} from "../../../dist/trace/database/ProcedureWorkerCPU.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' Test', () => { + const dataSource = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + processId : '' + } + + it('CPUTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + cpu(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('CPUTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + cpu(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('CPUTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + expect(CpuStruct.draw(ctx, data)).toBeUndefined() + }) + + it('CPUTest04', () => { + expect(CpuStruct.equals(new CpuStruct(),new CpuStruct())).toBeTruthy(); + }) + it('CPUTest06', () => { + expect(CpuStruct.equals([],dataSource)).toBeFalsy() + }) + + + it('CPUTest05', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + expect(CpuStruct.draw(ctx, data)).toBeUndefined() + }) + +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerCommon.test.ts b/host/ide/test/trace/database/ProcedureWorkerCommon.test.ts new file mode 100644 index 0000000..8247807 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerCommon.test.ts @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import { + ChartStruct, + ColorUtils, + drawFlagLine, + drawLines, + getFrameChartColor, + getHeatColor, + Point, + Rect, + ns2s + // @ts-ignore +} from "../../../dist/trace/database/ProcedureWorkerCommon.js" +// @ts-ignore +import {Flag} from "../../../dist/trace/database/ProcedureWorkerTimeline.js"; + +describe('ProcedureWorkerCommon Test', () => { + let rect = new Rect(); + + + it('ProcedureWorkerCommon01', function () { + expect(rect.contains(1, 2)).not.toBeUndefined(); + }); + + it('ProcedureWorkerCommon02', function () { + expect(rect.containsWithPadding()).not.toBeUndefined(); + }); + + it('ProcedureWorkerCommon03', function () { + let point = new Point(); + expect(point).not.toBeUndefined(); + }) + + + it('ProcedureWorkerCommon04', function () { + let rect = new Rect(); + expect(Rect.contains(rect, 1, 2)).toBe(false); + }) + + + it('ProcedureWorkerCommon05', function () { + let rect = new Rect(); + expect(Rect.containsWithPadding(rect, 1, 2, 1, 2)).toBe(false); + }) + + it('ProcedureWorkerCommon06', function () { + let rect = new Rect(); + expect(Rect.containsWithMargin(rect, 1, 2, 1, 2, 1, 1)).toBe(false); + }) + + + it('ProcedureWorkerCommon07', function () { + let rect = new Rect(); + let rect2 = new Rect(); + expect(Rect.intersect(rect, rect2)).toBe(false); + }) + + it('ProcedureWorkerCommon08', function () { + let rect = new Rect(); + expect(rect.containsWithMargin(1, 2, 3, 5, 4, 5)).toBe(false); + }) + + it('ProcedureWorkerCommon09', function () { + let rect = new Rect(); + expect(rect.containsWithPadding(1, 2, 3, 5)).toBe(false); + }) + + it('ProcedureWorkerCommon10', function () { + let rect = new Rect(); + let rect2 = new Rect(); + expect(rect.intersect(rect2)).toBe(false); + }) + + + it('ProcedureWorkerCommon011', function () { + expect(ColorUtils.formatNumberComma("11232")).toBe("11,232"); + }) + + it('ProcedureWorkerCommon012', function () { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let aaa = [1, 2, 3] + drawLines(ctx, aaa, 1, "#ffff") + expect(ColorUtils.formatNumberComma("11232")).toBe("11,232"); + }) + + it('ProcedureWorkerCommon013', function () { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let aaa = [1, 2, 3] + let flag = new Flag(1, 2, 3, 4, 5, "#FFF", false); + let rect2 = new Rect(); + drawFlagLine(ctx, aaa, flag, 1, 2, 2, rect2) + expect(ColorUtils.formatNumberComma("11232")).toBe("11,232"); + }) + + + it('ProcedureWorkerCommon014', function () { + expect(getHeatColor(1).b).toBe(100); + }) + + it('ProcedureWorkerCommon015', function () { + expect(getFrameChartColor(1,"").b).toBe(100); + }) + + it('ProcedureWorkerCommon016', function () { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + percent: 200, + value: 50 + }; + // @ts-ignore + document.body.innerHTML = ` `; + expect(ChartStruct.draw(ctx,Sourcedata,1)).toBeUndefined() + }) + + it('ProcedureWorkerCommon017', function () { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let rect2 = new Rect(); + let rect = new Rect(); + expect(ChartStruct.drawString(ctx,"111",1,rect)).toBe(false); + }) + + it('ProcedureWorkerCommon018', function () { + + expect(ChartStruct.isHover()).toBeTruthy() + }) + + it('ProcedureWorkerCommon019 ', function () { + const node = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100, + }, + total: 50, + size: 50, + count: 50, + parent: { + children:[{ + frame: { + x: 20, + y: 20, + width: 100, + height: 100, + }, + }], + frame: { + x: 20, + y: 20, + width: 100, + height: 100, + }, + } + + } + let frame = new Rect(0, 10, 10, 10); + expect(ChartStruct.setFuncFrame(node,frame,1,)).toBeUndefined() + }); + + it('ProcedureWorkerCommon20', function () { + expect(ns2s(2_000_000_000)).toBe("2.0 s"); + }); + + it('ProcedureWorkerCommon21', function () { + expect(ns2s(2_000_000)).toBe("2.0 ms"); + }); + + it('ProcedureWorkerCommon22', function () { + expect(ns2s(2_000)).toBe("2.0 μs"); + }); + + it('ProcedureWorkerCommon23', function () { + expect(ns2s(1)).toBe("1.0 ns"); + }); + + it('ProcedureWorkerCommon24', function () { + expect(ns2s(-1)).toBe("-1.0 s"); + }); +}) + diff --git a/host/ide/test/trace/database/ProcedureWorkerCpuAbility.test.ts b/host/ide/test/trace/database/ProcedureWorkerCpuAbility.test.ts new file mode 100644 index 0000000..08b1a76 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerCpuAbility.test.ts @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {CpuAbilityMonitorStruct,cpuAbility} from "../../../dist/trace/database/ProcedureWorkerCpuAbility.js"; +//@ts-ignore +import {Rect} from "../../../dist/trace/database/ProcedureWorkerCommon"; + +describe('CpuAbilityMonitorStruct Test', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxCpuUtilization: 200, + value: 50 + } + it('CpuAbilityMonitorStructTest01', function () { + expect(CpuAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + it('CpuAbilityMonitorStructTest03', function () { + expect(CpuAbilityMonitorStruct.draw(ctx, Sourcedata)).toBeUndefined() + }); + it('CpuAbilityMonitorStructTest02', function () { + let dataList = new Array(); + dataList.push({startNs: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNs: 1, dur: 111}) + cpuAbility(dataList, new Set(), 1, 100254, 100254, "") + }); + +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerDiskIoAbility.test.ts b/host/ide/test/trace/database/ProcedureWorkerDiskIoAbility.test.ts new file mode 100644 index 0000000..f339535 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerDiskIoAbility.test.ts @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {DiskAbilityMonitorStruct,diskIoAbility} from "../../../dist/trace/database/ProcedureWorkerDiskIoAbility.js"; +//@ts-ignore +import {Rect} from "../../../dist/trace/database/ProcedureWorkerCommon"; + +describe('ProcedureWorkerDiskIoAbility Test', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxDiskRate: 200, + value: 50 + } + + it('ProcedureWorkerDiskIoAbilityTest01', function () { + expect(DiskAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + + it('ProcedureWorkerDiskIoAbilityTest03', function () { + expect(DiskAbilityMonitorStruct.draw(ctx, Sourcedata)).toBeUndefined() + }); + it('CpuAbilityMonitorStructTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 111}) + diskIoAbility(dataList, new Set(), 1, 100254, 100254, "") + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerFPS.test.ts b/host/ide/test/trace/database/ProcedureWorkerFPS.test.ts new file mode 100644 index 0000000..2af6703 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerFPS.test.ts @@ -0,0 +1,86 @@ +// @ts-ignore +import {fps, FpsStruct} from "../../../dist/trace/database/ProcedureWorkerFps.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' FPSTest', () => { + + it('FpsTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + fps(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('FpsTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + fps(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('FpsTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + expect(FpsStruct.draw(ctx, data)).toBeUndefined() + }) + + + it('FpsTest04', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + new FpsStruct(1); + FpsStruct.hoverFpsStruct = jest.fn(() => {startNS:200}) + FpsStruct.a = jest.fn(() => data); + expect(FpsStruct.draw(ctx, data)).toBeUndefined() + }) + it('FpsTest05 ', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + const Sourcedate = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxFps: 200, + value: 50 + } + expect(FpsStruct.draw(ctx,Sourcedate)).toBeUndefined() + + + + }); +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerFreq.test.ts b/host/ide/test/trace/database/ProcedureWorkerFreq.test.ts new file mode 100644 index 0000000..224c429 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerFreq.test.ts @@ -0,0 +1,61 @@ +// @ts-ignore +import {CpuFreqStruct, freq} from "../../../dist/trace/database/ProcedureWorkerFreq.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe('freqTest', () => { + + it('freqTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + freq(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('freqTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + freq(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('freqTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + + expect(CpuFreqStruct.draw(ctx, data)).toBeUndefined() + + }) + it('freqTest04', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + const Sourcedata = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxFreq: 200, + value: 50 + } + expect(CpuFreqStruct.draw(ctx,Sourcedata)).toBeUndefined()}) + +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerFunc.test.ts b/host/ide/test/trace/database/ProcedureWorkerFunc.test.ts new file mode 100644 index 0000000..ca643a6 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerFunc.test.ts @@ -0,0 +1,66 @@ +// @ts-ignore +import {func, FuncStruct} from "../../../dist/trace/database/ProcedureWorkerFunc.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; +import {markAsUntransferable} from "worker_threads"; + +describe(' FPSTest', () => { + + it('FuncTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + func(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('FuncTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + func(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('FuncTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + dur:undefined || null || 0 + } + expect(FuncStruct.draw(ctx, data)).toBeUndefined() + }) + + + it('FuncTest04', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + FuncStruct.drawString(ctx, "1", 1,new Rect(0,0,100,100)); + }) + + it('FuncTest05', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + FuncStruct.drawString(ctx, "1", 2,new Rect(1,1,150,150)); + }); + + it('FuncTest06 ', function () { + let str = "" + expect(FuncStruct.getInt(str)).toBe(0); + }); +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerHeap.test.ts b/host/ide/test/trace/database/ProcedureWorkerHeap.test.ts new file mode 100644 index 0000000..6abf563 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerHeap.test.ts @@ -0,0 +1,60 @@ +// @ts-ignore +import {heap, HeapStruct} from "../../../dist/trace/database/ProcedureWorkerHeap.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' Test', () => { + + it('HeapTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + heap(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('HeapTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + heap(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('HeapTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + expect(HeapStruct.draw(ctx, data)).toBeUndefined() + }) + it('HeapTest04', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + maxHeapSize: 200, + value: 50 + } + expect(HeapStruct.draw(ctx, data)).toBeUndefined() + }) +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerHiPerfCPU.test.ts b/host/ide/test/trace/database/ProcedureWorkerHiPerfCPU.test.ts new file mode 100644 index 0000000..701c979 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerHiPerfCPU.test.ts @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {hiPerfCpu,HiPerfCpuStruct} from "../../../dist/trace/database/ProcedureWorkerHiPerfCPU.js"; + +describe('ProcedureWorkerHiPerfCPU Test', ()=>{ + + it('ProcedureWorkerHiPerfCPUTest01',()=>{ + const data = { + frame:undefined, + cpu:1, + startNs:1, + value:1, + } + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + expect(HiPerfCpuStruct.draw(ctx,'',data,true)).toBeUndefined(); + }); + + it('ProcedureWorkerHiPerfCPUTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfCpu(dataList, new Set(), 1, 8, 3, "",true) + }); + + it('ProcedureWorkerHiPerfCPUTest03', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfCpu(dataList, new Set(), 1, 8, 3, "",false) + }); + + it('ProcedureWorkerHiPerfCPUTest04',()=>{ + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + expect(HiPerfCpuStruct.drawRoundRectPath(ctx,1,1,1,1,1)).toBeUndefined(); + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerHiPerfProcess.test.ts b/host/ide/test/trace/database/ProcedureWorkerHiPerfProcess.test.ts new file mode 100644 index 0000000..d73a4c2 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerHiPerfProcess.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {hiPerfProcess,HiPerfProcessStruct} from "../../../dist/trace/database/ProcedureWorkerHiPerfProcess.js"; + +describe('ProcedureWorkerHiPerfCPU Test', ()=>{ + + it('ProcedureWorkerHiPerfCPUTest01',()=>{ + const data = { + frame:undefined, + cpu:1, + startNs:1, + value:1, + } + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + expect(HiPerfProcessStruct.draw(ctx,'',data,true)).toBeUndefined(); + }); + + it('ProcedureWorkerHiPerfCPUTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfProcess(dataList, new Set(), 1, 8, 3, "",true) + }); + + it('ProcedureWorkerHiPerfCPUTest03', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfProcess(dataList, new Set(), 1, 8, 3, "",false) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerHiPerfThread.test.ts b/host/ide/test/trace/database/ProcedureWorkerHiPerfThread.test.ts new file mode 100644 index 0000000..25a34b3 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerHiPerfThread.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {hiPerfThread,HiPerfThreadStruct} from "../../../dist/trace/database/ProcedureWorkerHiPerfThread.js"; + +describe('ProcedureWorkerHiPerfCPU Test', ()=>{ + + it('ProcedureWorkerHiPerfCPUTest01',()=>{ + const data = { + frame:undefined, + cpu:1, + startNs:1, + value:1, + } + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + expect(HiPerfThreadStruct.draw(ctx,'',data,true)).toBeUndefined(); + }); + + it('ProcedureWorkerHiPerfCPUTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfThread(dataList, new Set(), 1, 8, 3, "",true) + }); + + it('ProcedureWorkerHiPerfCPUTest03', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10,length:1, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2,length:1}) + hiPerfThread(dataList, new Set(), 1, 8, 3, "",false) + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerMem.test.ts b/host/ide/test/trace/database/ProcedureWorkerMem.test.ts new file mode 100644 index 0000000..996dda7 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerMem.test.ts @@ -0,0 +1,48 @@ +// @ts-ignore +import {mem, ProcessMemStruct} from "../../../dist/trace/database/ProcedureWorkerMem.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' Test', () => { + + it('MemTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, duration: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, duration: 111}) + let rect = new Rect(0, 10, 10, 10); + mem(dataList, new Set(), 1, 100254, 100256, rect) + }) + + it('MemTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, duration: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, duration: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + mem(dataList, new Set(), 2, 100254, 100254, rect) + }) + + it('MemTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + expect(ProcessMemStruct.draw(ctx, data)).toBeUndefined() + }) + + + // it('MemTest03', () => { + // setMemFrame(dataList, new Set(), 1, 100254, 100254, rect) + // }) + +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerMemoryAbility.test.ts b/host/ide/test/trace/database/ProcedureWorkerMemoryAbility.test.ts new file mode 100644 index 0000000..bbb5c0b --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerMemoryAbility.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {memoryAbility,MemoryAbilityMonitorStruct} from "../../../dist/trace/database/ProcedureWorkerMemoryAbility.js"; + +describe('ProcedureWorkerMemoryAbility Test', ()=>{ + + it('ProcedureWorkerMemoryAbilityTest01',()=>{ + const data = { + frame:{ + width:10, + height:10, + x:1, + y:1, + }, + cpu:1, + startNs:1, + value:1, + } + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + expect(MemoryAbilityMonitorStruct.draw(ctx,data)).toBeUndefined(); + }); + + it('ProcedureWorkerMemoryAbilityTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 2}) + memoryAbility(dataList, new Set(), 1, 8, 3, "") + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerNetworkAbility.test.ts b/host/ide/test/trace/database/ProcedureWorkerNetworkAbility.test.ts new file mode 100644 index 0000000..58d1e88 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerNetworkAbility.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +//@ts-ignore +import {NetworkAbilityMonitorStruct,networkAbility} from "../../../dist/trace/database/ProcedureWorkerNetworkAbility.js"; + +describe('ProcedureWorkerNetworkAbility Test', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 2, + y: 2, + width: 10, + height: 10 + }, + startNS: 21, + value: 5 + } + + it('ProcedureWorkerNetworkAbilityTest01', function () { + expect(NetworkAbilityMonitorStruct.draw(ctx, data)).toBeUndefined() + }); + + it('ProcedureWorkerNetworkAbilityTest02', function () { + let dataList = new Array(); + dataList.push({startNS: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startNS: 1, dur: 1}) + networkAbility(dataList, new Set(), 1, 9, 2, "") + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerProcess.test.ts b/host/ide/test/trace/database/ProcedureWorkerProcess.test.ts new file mode 100644 index 0000000..df36166 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerProcess.test.ts @@ -0,0 +1,43 @@ +// @ts-ignore +import {proc, ProcessStruct} from "../../../dist/trace/database/ProcedureWorkerProcess.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' ProcessTest', () => { + + it('ProcessTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + proc(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('ProcessTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + proc(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('ProcessTest04', () => { + const node = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + const frame = { + x: 20, + y: 20, + width: 100, + height: 100 + } + expect(ProcessStruct.setFrame(node, 1,1,1,frame)).toBeUndefined() + }) +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerThread.test.ts b/host/ide/test/trace/database/ProcedureWorkerThread.test.ts new file mode 100644 index 0000000..cdd5c86 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerThread.test.ts @@ -0,0 +1,160 @@ +// @ts-ignore +import {thread, ThreadStruct} from "../../../dist/trace/database/ProcedureWorkerThread.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' ThreadTest', () => { + + it('ThreadTest01', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + thread(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('ThreadTest02', () => { + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111, frame: {x:0, y:9, width:10, height:10}}) + let rect = new Rect(0, 10, 10, 10); + thread(dataList, new Set(), 1, 100254, 100254, rect) + }) + + it('ThreadTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50 + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest04', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + state:"S" + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest05', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + state:"R" + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest06', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + state:"D" + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest07', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + state:"Running" + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest08', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + + const data = { + frame: { + x: 20, + y: 20, + width: 100, + height: 100 + }, + startNS: 200, + value: 50, + state:"T" + } + expect(ThreadStruct.draw(ctx, data)).toBeUndefined() + }) + + it('ThreadTest09', () => { + const d1 = { + cpu:1, + tid:1, + state:"", + startTime:1, + dur:1 + } + const d2 = { + cpu:1, + tid:1, + state:"", + startTime:1, + dur:1 + } + expect(ThreadStruct.equals(d1, d2)).toBeTruthy() + }) +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/ProcedureWorkerTimeline.test.ts b/host/ide/test/trace/database/ProcedureWorkerTimeline.test.ts new file mode 100644 index 0000000..9f69dd7 --- /dev/null +++ b/host/ide/test/trace/database/ProcedureWorkerTimeline.test.ts @@ -0,0 +1,92 @@ +// @ts-ignore +import {RangeRuler, SportRuler, timeline} from "../../../dist/trace/database/ProcedureWorkerTimeline.js"; +// @ts-ignore +import {Rect} from "../../../dist/trace/component/trace/timer-shaft/Rect.js"; + +describe(' ProcedureWorkerTimelineTest', () => { + + it('timelineTest', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let dataList = new Array(); + dataList.push({startTime: 0, dur: 10, frame: {x:0, y:9, width:10, height:10}}) + dataList.push({startTime: 1, dur: 111}) + let rect = new Rect(0, 10, 10, 10); + timeline(canvas, ctx, 1, 100254, 100254, rect, null, null, null, null,null,null,0,0,(e:any) => { + }) + }) + + + it('SportRulerTest01', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let rect = new Rect(0, 10, 10, 10); + let sportRuler = new SportRuler(canvas,ctx,rect); + sportRuler.modifyFlagList("amend") + sportRuler.modifyFlagList("remove") + sportRuler.drawTheFlag(0,"#999999",false,!""); + sportRuler.randomRgbColor(); + sportRuler.mouseMove(new MouseEvent("")); + sportRuler.mouseUp(new MouseEvent("")); + sportRuler.onFlagRangeEvent('1',2); + }) + + it('SportRulerTest02', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let rect = new Rect(0, 10, 10, 10); + let rangeRuler = new RangeRuler(canvas,ctx,rect,{ + startX: 0, + endX: rect.width, + startNS: 0, + endNS: 111, + totalNS: 111, + xs: [], + xsTxt: [] + },(a:any) =>{}); + rangeRuler.draw(); + rangeRuler.drawCpuUsage(); + rangeRuler.mouseDown({offsetX:1,offsetY:1}) + rangeRuler.mouseUp(new MouseEvent("")) + rangeRuler.mouseMove(new MouseEvent("")) + rangeRuler.mouseOut(new MouseEvent("")) + rangeRuler.range.startNS=-2 + rangeRuler.range.endNS=-2 + rangeRuler.range.totalNS=-7 + rangeRuler.fillX(); + rangeRuler.keyPress(new KeyboardEvent("")); + rangeRuler.pressFrameId = !-1 + rangeRuler.keyUp(new KeyboardEvent("")); + rangeRuler.keyUp({key:'w'}); + rangeRuler.keyUp({key:'s'}); + rangeRuler.keyUp({key:'a'}); + rangeRuler.keyUp({key:'d'}); + + }) + + it('SportRulerTest03', () => { + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d'); + let rect = new Rect(0, 10, 10, 10); + let rangeRuler = new RangeRuler(canvas,ctx,rect,{ + startX: 0, + endX: rect.width, + startNS: 0, + endNS: 111, + totalNS: 111, + xs: [], + xsTxt: [] + },(a:any) =>{}); + rangeRuler.cpuUsage = true; + expect(rangeRuler.cpuUsage).toBeUndefined(); + }) + +}); \ No newline at end of file diff --git a/host/ide/test/trace/database/SqlLite.test.ts b/host/ide/test/trace/database/SqlLite.test.ts new file mode 100644 index 0000000..ad207dc --- /dev/null +++ b/host/ide/test/trace/database/SqlLite.test.ts @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ +// @ts-ignore +import {threadPool, DbThread,DbPool } from "../../../dist/trace/database/SqlLite.js"; +// import {DbPool} from "../../../src/trace/database/SqlLite"; + +describe('SqlLite Test', () => { + it('SqlLiteTest01', function () { + expect(DbThread).not.toBeTruthy(); + }); + it('SqlLiteTest02', function () { + expect(DbPool).not.toBeUndefined(); + + }); +}) \ No newline at end of file diff --git a/host/ide/test/trace/grpc/HiProfilerClient.test.ts b/host/ide/test/trace/grpc/HiProfilerClient.test.ts index cfe9dce..08c2a9e 100644 --- a/host/ide/test/trace/grpc/HiProfilerClient.test.ts +++ b/host/ide/test/trace/grpc/HiProfilerClient.test.ts @@ -37,7 +37,7 @@ describe('HiProfilerClient Test', ()=>{ }); it('HiProfilerClientTest05', function () { - expect(hiProfilerClient.getProfilerClient()).toBeUndefined(); + expect(hiProfilerClient.getProfilerClient()).toBeTruthy(); }); }) \ No newline at end of file diff --git a/host/ide/test/trace/grpc/ProfilerClient.test.ts b/host/ide/test/trace/grpc/ProfilerClient.test.ts index a4e00e7..0021ee1 100644 --- a/host/ide/test/trace/grpc/ProfilerClient.test.ts +++ b/host/ide/test/trace/grpc/ProfilerClient.test.ts @@ -17,14 +17,39 @@ import {ProfilerClient} from "../../../dist/trace/grpc/ProfilerClient.js" describe('HiProfilerClient Test', ()=>{ + it('HiProfilerClientTest01 ', function () { + expect(ProfilerClient.client).toBeUndefined() - - it('ProfilerClientTest01', function () { - expect(ProfilerClient.client).toBeUndefined(); }); - it('ProfilerClientTest01', function () { + it('HiProfilerClientTest02', function () { ProfilerClient.client = true; - expect(ProfilerClient.client).toBeTruthy(); + expect(ProfilerClient.client).toBeTruthy() + + }); + it('HiProfilerClientTest03 ', function () { + expect(ProfilerClient.filePaths).toBeUndefined() + + }); + it('HiProfilerClientTest04', function () { + ProfilerClient.filePaths = true; + expect(ProfilerClient.filePaths).toBeTruthy() + + }); + it('HiProfilerClientTest05', function () { + expect(ProfilerClient.profiler_proto).toBeUndefined() + }); + it('HiProfilerClientTest06', function () { + ProfilerClient.profiler_proto = true; + expect(ProfilerClient.profiler_proto).toBeTruthy() + }); + + it('HiProfilerClientTest07 ', function () { + expect(ProfilerClient.shutdown).toBeUndefined() + + }); + it('HiProfilerClientTest08', function () { + ProfilerClient.getChannel = jest.fn(()=>true) + expect(ProfilerClient.getChannel()).toBeTruthy(); }); }) \ No newline at end of file diff --git a/host/ide/test/trace/grpc/ProfilerController.test.ts b/host/ide/test/trace/grpc/ProfilerController.test.ts new file mode 100644 index 0000000..7b4e6cf --- /dev/null +++ b/host/ide/test/trace/grpc/ProfilerController.test.ts @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 Huawei Device Co., Ltd. + * 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. + */ + +// @ts-ignore +import {ClientContainer} from "../../../dist/trace/grpc/ProfilerController.js" + +describe('HiProfilerClient Test', ()=>{ + + let profilerController= new ClientContainer(); + + it('ProfilerClientTest01', function () { + expect(profilerController.port).toBeUndefined(); + }); + + it('ProfilerClientTest02', function () { + profilerController.port = true; + expect(profilerController.port).toBeTruthy(); + }); + + it('ProfilerClientTest03', function () { + expect(profilerController.host).toBeUndefined(); + }); + + it('ProfilerClientTest04', function () { + profilerController.host = true; + expect(profilerController.host).toBeTruthy(); + }); + + // it('ProfilerClientTest05', function () { + // expect(profilerController.host).toBe(true); + // }); + + it('ProfilerClientTest06', function () { + profilerController.loadSettings = jest.fn(()=>true) + expect(profilerController.start()).toBeUndefined(); + }); + + it('ProfilerClientTest07', function () { + profilerController.loadSettings = jest.fn(()=>true) + expect(profilerController.loadSettings()).toBeTruthy(); + }); + + +}) \ No newline at end of file diff --git a/host/trace_streamer/BUILD.gn b/host/trace_streamer/BUILD.gn index 092bb98..b181cd7 100644 --- a/host/trace_streamer/BUILD.gn +++ b/host/trace_streamer/BUILD.gn @@ -17,6 +17,11 @@ group("trace_streamer") { } else if (is_test) { deps = [ "test:unittest" ] testonly = true + } else if (is_fuzz) { + deps = [ "test:fuzztest" ] + testonly = true + } else if (is_protoc) { + deps = [ "//third_party/protobuf:protoc" ] } else { deps = [ "src:trace_streamer" ] } diff --git a/host/trace_streamer/README.md b/host/trace_streamer/README.md index eb0deec..6a0a046 100644 --- a/host/trace_streamer/README.md +++ b/host/trace_streamer/README.md @@ -1,13 +1,15 @@ # trace_streamer工具说明 +trace_streamer是一个trace数据流转化器,可以将一个trace文本文件或者基于proto序列化的二进制文件转换成为sqlite数据库的形式。 trace_streamer使用C++实现,支持在ohos, linux, mac等系统上使用,具有良好的跨平台特性。 +![GitHub Logo](./figures/trace_streamer_stream.png) +## 关于trace解析工具的使用说明: trace_streamer工具可以2种方式使用 1. 可以将系统离线trace文件解析并转为db,此工具支持基于文本的trace和基于proto的trace。 2. trace_streamer工具还可以WebAssembly的方式在浏览器中运行,需暴露相关接口给js文件。 -## 关于trace解析工具的使用说明: ### 导出db模式 在导出db模式下,trace_streamer.exe trace文件路径名 -e 导出db路径名.db 此命令可以将trace文件转为db -本应用支持在ohos, linux, windows, mac使用。 +本应用支持在ohos, linux, mac使用。 关于db文件的说明: 使用db查看工具查看stat表,可以浏览当前数据一共有多少类数据,各类数据都收到多少条,数据是否正常等情况。在meta表会记录数据库导出时的一些系统信息,比如导入和导出的文件全路径,解析时间等信息。 meta表可以选择不导出(有些情况下会暴露系统敏感信息),在导出时添加 -nm选项即可。 @@ -63,247 +65,43 @@ EMSCRIPTEN_KEEPALIVE int TraceStreamerSqlQuery(const uint8_t* sql, int sqlLen, u ./trace_streamer --help -i 选项可查看应用支持的事件源和具体的事件名列表 -#### trace_streamer支持的事件解析 -本工具支持基于文本的trace(# TRACE)和基于proto的二进制日志文件的解析,支持的事件列表如下: -##### ftrace事件 -``` -binder_transaction -binder_transaction_received -binder_transaction_alloc_buf -binder_transaction_lock -binder_transaction_locked -binder_transaction_unlock -sched_switch -task_rename -task_newtask -tracing_mark_write -print -sched_wakeup -sched_waking -cpu_idle -cpu_frequency -suspend_resume -workqueue_execute_start -workqueue_execute_end -clock_set_rate -clock_enable -clock_disable -clk_set_rate -clk_enable -clk_disable -sys_enter -sys_exit -regulator_set_voltage -regulator_set_voltage_complete -regulator_disable -regulator_disable_complete -ipi_entry -ipi_exit -irq_handler_entry -irq_handler_exit -softirq_raise -softirq_entry -softirq_exit -sched_wakeup_new -sched_process_exit -trace_event_clock_sync -``` -##### 内存事件 -``` -mem.vm.size -mem.rss -mem.rss.anon -mem.rss.file -mem.rss.schem -mem.swap -mem.locked -mem.hwm -mem.oom_score_adj +### trace_streamer支持解析的事件列表 +支持的事件列表参见<> +## TraceStreamer重要概念介绍 +### 1. 进程和线程标识符 ``` -##### 系统内存事件 -``` -sys.mem.unspecified -sys.mem.total -sys.mem.free -sys.mem.avaiable -sys.mem.buffers -sys.mem.cached -sys.mem.swap.chard -sys.mem.active -sys.mem.inactive -sys.mem.active.anon -sys.mem.inactive.anon -sys.mem.active_file -sys.mem.inactive_file -sys.mem.unevictable -sys.mem.mlocked -sys.mem.swap.total -sys.mem.swap.free -sys.mem.dirty -sys.mem.writeback -sys.mem.anon.pages -sys.mem.mapped -sys.mem.shmem -sys.mem.slab -sys.mem.slab.reclaimable -sys.mem.slab.unreclaimable -sys.mem.kernel.stack -sys.mem.page.tables -sys.mem.commit.limit -sys.mem.commited.as -sys.mem.vmalloc.total -sys.mem.vmalloc.used -sys.mem.vmalloc.chunk -sys.mem.cma.total -sys.mem.cma.free -``` -##### 系统虚拟内存事件 -``` -sys.virtual.mem.unspecified -sys.virtual.mem.nr.free.pages -sys.virtual.mem.nr.alloc.batch -sys.virtual.mem.nr.inactive.anon -sys.virtual.mem.nr.active_anon -sys.virtual.mem.nr.inactive.file -sys.virtual.mem.nr.active_file -sys.virtual.mem.nr.unevictable -sys.virtual.mem.nr.mlock -sys.virtual.mem.anon.pages -sys.virtual.mem.nr.mapped -sys.virtual.mem.nr.file.pages -sys.virtual.mem.nr.dirty -sys.virtual.mem.nr.writeback -sys.virtual.mem.nr.slab.reclaimable -sys.virtual.mem.nr.slab.unreclaimable -sys.virtual.mem.nr.page_table.pages -sys.virtual.mem.nr_kernel.stack -sys.virtual.mem.nr.overhead -sys.virtual.mem.nr.unstable -sys.virtual.mem.nr.bounce -sys.virtual.mem.nr.vmscan.write -sys.virtual.mem.nr.vmscan.immediate.reclaim -sys.virtual.mem.nr.writeback_temp -sys.virtual.mem.nr.isolated_anon -sys.virtual.mem.nr.isolated_file -sys.virtual.mem.nr.shmem -sys.virtual.mem.nr.dirtied -sys.virtual.mem.nr.written -sys.virtual.mem.nr.pages.scanned -sys.virtual.mem.workingset.refault -sys.virtual.mem.workingset.activate -sys.virtual.mem.workingset_nodereclaim -sys.virtual.mem.nr_anon.transparent.hugepages -sys.virtual.mem.nr.free_cma -sys.virtual.mem.nr.swapcache -sys.virtual.mem.nr.dirty.threshold -sys.virtual.mem.nr.dirty.background.threshold -sys.virtual.mem.vmeminfo.pgpgin -sys.virtual.mem.pgpgout -sys.virtual.mem.pgpgoutclean -sys.virtual.mem.pswpin -sys.virtual.mem.pswpout -sys.virtual.mem.pgalloc.dma -sys.virtual.mem.pgalloc.normal -sys.virtual.mem.pgalloc.movable -sys.virtual.mem.pgfree -sys.virtual.mem.pgactivate -sys.virtual.mem.pgdeactivate -sys.virtual.mem.pgfault -sys.virtual.mem.pgmajfault -sys.virtual.mem.pgrefill.dma -sys.virtual.mem.pgrefill.normal -sys.virtual.mem.pgrefill.movable -sys.virtual.mem.pgsteal.kswapd.dma -sys.virtual.mem.pgsteal.kswapd.normal -sys.virtual.mem.pgsteal.kswapd.movable -sys.virtual.mem.pgsteal.direct.dma -sys.virtual.mem.pgsteal.direct.normal -sys.virtual.mem.pgsteal_direct.movable -sys.virtual.mem.pgscan.kswapd.dma -sys.virtual.mem.pgscan_kswapd.normal -sys.virtual.mem.pgscan.kswapd.movable -sys.virtual.mem.pgscan.direct.dma -sys.virtual.mem.pgscan.direct.normal -sys.virtual.mem.pgscan.direct.movable -sys.virtual.mem.pgscan.direct.throttle -sys.virtual.mem.pginodesteal -sys.virtual.mem.slabs_scanned -sys.virtual.mem.kswapd.inodesteal -sys.virtual.mem.kswapd.low.wmark.hit.quickly -sys.virtual.mem.high.wmark.hit.quickly -sys.virtual.mem.pageoutrun -sys.virtual.mem.allocstall -sys.virtual.mem.pgrotated -sys.virtual.mem.drop.pagecache -sys.virtual.mem.drop.slab -sys.virtual.mem.pgmigrate.success -sys.virtual.mem.pgmigrate.fail -sys.virtual.mem.compact.migrate.scanned -sys.virtual.mem.compact.free.scanned -sys.virtual.mem.compact.isolated -sys.virtual.mem.compact.stall -sys.virtual.mem.compact.fail -sys.virtual.mem.compact.success -sys.virtual.mem.compact.daemon.wake -sys.virtual.mem.unevictable.pgs.culled -sys.virtual.mem.unevictable.pgs.scanned -sys.virtual.mem.unevictable.pgs.rescued -sys.virtual.mem.unevictable.pgs.mlocked -sys.virtual.mem.unevictable.pgs.munlocked -sys.virtual.mem.unevictable.pgs.cleared -sys.virtual.mem.unevictable.pgs.stranded -sys.virtual.mem.nr.zspages -sys.virtual.mem.nr.ion.heap -sys.virtual.mem.nr.gpu.heap -sys.virtual.mem.allocstall.dma -sys.virtual.mem.allocstall.movable -sys.virtual.mem.allocstall.normal -sys.virtual.mem.compact_daemon.free.scanned -sys.virtual.mem.compact.daemon.migrate.scanned -sys.virtual.mem.nr.fastrpc -sys.virtual.mem.nr.indirectly.reclaimable -sys.virtual.mem.nr_ion_heap_pool -sys.virtual.mem.nr.kernel_misc.reclaimable -sys.virtual.mem.nr.shadow_call.stack_bytes -sys.virtual.mem.nr.shmem.hugepages -sys.virtual.mem.nr.shmem.pmdmapped -sys.virtual.mem.nr.unreclaimable.pages -sys.virtual.mem.nr.zone.active.anon -sys.virtual.mem.nr.zone.active.file -ys.virtual.mem.nr.zone.inactive_anon -sys.virtual.mem.nr.zone.inactive_file -sys.virtual.mem.nr.zone.unevictable -sys.virtual.mem.nr.zone.write_pending -sys.virtual.mem.oom.kill -sys.virtual.mem.pglazyfree -sys.virtual.mem.pglazyfreed -sys.virtual.mem.pgrefill -sys.virtual.mem.pgscan.direct -sys.virtual.mem.pgscan.kswapd -sys.virtual.mem.pgskip.dma -sys.virtual.mem.pgskip.movable -sys.virtual.mem.pgskip.normal -sys.virtual.mem.pgsteal.direct -sys.virtual.mem.pgsteal.kswapd -sys.virtual.mem.swap.ra -sys.virtual.mem.swap.ra.hit +在通用操作系统中,进程号(pid/tgid)和线程号(tid)可能会被重复用于标识不同的进程或者线程。所以在trace数据源中,进程号(pid)和线程号(tid)也可能被重用。 +TraceStreamer在解析数据过程中,使用ipid(internal pid)唯一标识进程, itid(internal tid)唯一标识线程。 ``` +### 2. 计量器 +用来记录系统中各种随时间连续变化的数值。例如: CPU的频率, 内存的使用量, 界面刷新频率。 +#### 举例 +CPU频率: +![GitHub Logo](./figures/cpu_frequency.png) +内存占用: +![GitHub Logo](./figures/mem_usage.png) +### 3. 过滤器 +TraceStreamer设计过程中使用了流式处理的思想,数据从入口进入以后,就像进入一条河流,从上游流向下游,在河道中央有很多过滤器,每种过滤器会将流过的数据中自己关注的内容吸附捕捉到。最终,每个过滤器都拥有了大量同类型的数据,而且这些数据都是按时间序列排列的。TraceStreamer使用filterid来标识同一种用途的数据,可以方便在UI中绘制。 +![image][filterimageid] + +## Stat表设计 +具体内容参见 [des_stat](../doc/des_stat.md) ## trace_streamer开发环境搭建和编译运行指引 -本应用使用gn作为构建工具,支持在linux环境同时编译linux,windows和mac使用QtCreator作为开发IDE +本应用使用gn作为构建工具。 ### 1、开发环境 -ubuntu使用vscode,windows和mac使用QtCreator +ubuntu和mac使用vscode # 对外部的依赖 本应用依赖与sqlite,protobuf(htrace解析部分依赖) 本应用同时依赖于src/protos目录下文件来生成相关pb.h,pb.cc文件 -### 2.1、 编译linux版应用 +### 2.1、 编译linux和Mac版应用 在根目录下执行相关命令进行编译 -### 2.2、编译Windows版和Mac应用 -在项目目录下有pro文件,为QtCreator的工程文件,但部分内容赖在于上面所添加的外部依赖,如果要编译相关平台应用,开发者需自行补充相关工程文件,或者在论坛留言 +### 2.2、 编译wasm +在根目录下执行相关命令进行编译 ### 2.3、开始编译 -具体方法可参考《compile_trace_streamer.md》 \ No newline at end of file +具体方法可参考[compile_trace_streamer](./doc/compile_trace_streamer.md) \ No newline at end of file diff --git a/host/trace_streamer/build.sh b/host/trace_streamer/build.sh index 9e183ee..d897642 100644 --- a/host/trace_streamer/build.sh +++ b/host/trace_streamer/build.sh @@ -1,4 +1,4 @@ -#! /bin/bash +#!/bin/bash # Copyright (C) 2021 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,18 +11,34 @@ # 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. +set -e PARAMS=$* echo $PARAMS echo "begin to check input" target_os='linux' +target_dir='linux' +gn_path='linux' is_debug='false' is_clean='false' +target='trace_streamer' +gn='gn' +ninja='ninja' +case "$OSTYPE" in + solaris*) echo "SOLARIS" ;; + darwin*) gn_path='macx' target_os='macx' ;; + linux*) gn_path='linux' target_os='linux' ;; + bsd*) echo "is bsd os" ;; + msys*) gn_path='windows' target_os='windows' gn='gn.exe' ninja='ninja.exe' ;; + *) echo "unknown: $OSTYPE" ;; +esac +usage="Usage: $basename $0 wasm/test/fuzz/protoc debug/release/clean" + if [ "$#" -ne "0" ];then - if [ $1 == "wasm" ];then + if [ "$1" == "wasm" ];then if [ ! -d "prebuilts/emsdk" ];then echo "you need emsdk to compile wasm" - mv emsdk.tar.gz prebuilts/ - mv ../emsdk.tar.gz prebuilts/ + #mv emsdk.tar.gz prebuilts/ + #mv ../emsdk.tar.gz prebuilts/ if [ ! -f "prebuilts/emsdk.tar.gz" ];then # consider # you need to get emsdk.tar.gz some where @@ -32,44 +48,53 @@ if [ "$#" -ne "0" ];then tar -zxvf prebuilts/emsdk.tar.gz -C prebuilts/ fi fi - target_os='wasm' + target='wasm' fi - if [ $1 == "test" ];then - target_os='test' + if [ "$1" == "test" ];then + target='test' + fi + if [ "$1" == "fuzz" ];then + target='fuzz' + fi + if [ "$1" == "protoc" ];then + target='protoc' fi fi if [ "$#" -eq "2" ];then - if [ "$1" != 'windows' ] && [ $1 != "linux" ] && [ $1 != "wasm" ] && [ $1 != "test" ];then + if [ "$1" != 'trace' ] && [ "$1" != "linux" ]&& [ "$1" != "windows" ]&& [ "$1" != "trace_streamer" ] && [ "$1" != "wasm" ] && [ "$1" != "test" ] && [ "$1" != "fuzz" ] && [ "$1" != "protoc" ];then echo "failed" - echo "Usage: `basename $0` windows/linux/wasm/test debug/release/clean" + echo "$usage" exit fi - if [ $2 != "debug" -a $2 != "release" -a $2 != "clean" ];then + if [ "$2" != "debug" -a "$2" != "release" -a "$2" != "clean" ];then echo "failed" - echo "Usage: `basename $0` windows/linux debug/release/clean" + echo "$usage" exit fi - if [ $2 == "debug" ];then + if [ "$2" == "debug" ];then is_debug='true' - elif [ $2 == "clean" ];then + elif [ "$2" == "clean" ];then is_clean='true' else is_debug='false' fi - target_os=$1 - if [ $target_os == "windows" ];then + if [ "$target_os" == "windows" ];then echo "gn only support linux and wasm build currently" - mkdir out/windows + if [ ! -d "out/windows" ];then + mkdir out/windows + fi touch out/windows/trace_streamer.exe exit fi echo "platform is $target_os" echo "isdebug: $is_debug" + echo "isclean: $is_clean" else - echo "Usage: `basename $0` windows/linux/wasm debug/release wasm[optional]" + echo "$usage" echo "You provided $# parameters,but 2 are required." echo "use default input paramter" echo "platform is $target_os" + echo "target is $target" echo "is_debug:$is_debug" fi echo "gen ..." @@ -86,18 +111,20 @@ echo "" echo "if you are compiling first time, or your proto has changed, you need to run ./src/protos/protogen.sh" echo "" echo "" -echo +echo #./src/protos/protogen.sh -mkdir prebuilts/$target_os -if [ ! -f "prebuilts/$target_os/gn" ];then +if [ ! -d "prebuilts/$gn_path" ];then + mkdir prebuilts/$gn_path +fi +if [ ! -f "prebuilts/$gn_path/gn" ];then echo "you may get gn for $target_os and place it in prebuilts/$target_os" - ehco "the file can be get at https://gitee.com/su_fu/public_tools/raw/master/gn/$target_os/gn, you need to download it manually" + echo "the file can be get at https://gitee.com/su_fu/public_tools/raw/master/gn/$target_os/gn, you need to download it manually" #wget https://gitee.com/su_fu/public_tools/raw/master/gn/$target_os/gn #mv gn prebuilts/$target_os/ #chmod +x prebuilts/$target_os/gn exit fi -if [ ! -f "prebuilts/$target_os/ninja" ];then +if [ ! -f "prebuilts/$gn_path/ninja" ];then echo "you may get ninja for $target_os and place it in prebuilts/$target_os" ehco "the file can be get at https://gitee.com/su_fu/public_tools/raw/master/gn/$target_os/ninja, you need to download it manually" #wget "https://gitee.com/su_fu/public_tools/raw/master/gn/$target_os/ninja" @@ -107,13 +134,24 @@ if [ ! -f "prebuilts/$target_os/ninja" ];then exit fi echo "$is_clean" +if [ $target == 'test' ] || [ $target == 'fuzz' ] || [ $target='wasm' ];then + target_dir=$target +else + target_dir=$target_os +fi +if [ $target == 'trace_streamer' ] || [ $target == 'trace' ];then + target_dir=$target_os +fi +echo "target_dir:" $target_dir +# exit if [ "$is_clean" == 'true' ];then - prebuilts/$target_os/gn gen out/"$target_os""$ext" --clean - prebuilts/$target_os/ninja -C out/"$target_os""$ext" -t clean + prebuilts/$gn_path/$gn gen out/"$target_dir""$ext" --clean + prebuilts/$gn_path/$ninja -C out/"$target_dir""$ext" -t clean else - prebuilts/$target_os/gn gen out/"$target_os""$ext" --args='is_debug='"$is_debug"' target_os="'"$target_os"'"' + prebuilts/$gn_path/$gn gen out/"$target_dir""$ext" --args='is_debug='"$is_debug"' target="'"$target"'" target_os="'"$target_os"'"' echo "begin to build ..." mkdir -p out/windows touch out/windows/trace_streamer.exe - prebuilts/$target_os/ninja -v -C out/"$target_os""$ext" + prebuilts/$gn_path/$ninja -C out/"$target_dir""$ext" + # prebuilts/$gn_path/ninja -C out/"$target_os""$ext" fi diff --git a/host/trace_streamer/build/test.gni b/host/trace_streamer/build/test.gni index 6912354..8bdf099 100644 --- a/host/trace_streamer/build/test.gni +++ b/host/trace_streamer/build/test.gni @@ -21,5 +21,28 @@ template("ohos_unittest") { if (defined(invoker.ldflags)) { print(invoker.ldflags) } + if (defined(invoker.cflags)) { + print(invoker.cflags) + cflags += invoker.cflags + } + } +} + +template("ohos_fuzztest") { + executable(target_name) { + forward_variables_from(invoker, "*") + testonly = true + deps = [] + if (defined(invoker.deps)) { + deps += invoker.deps + } + if (defined(invoker.cflags)) { + cflags += invoker.cflags + } + ldflags += [ "-fsanitize=fuzzer" ] + cflags += [ + "-fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters", + "-fsanitize=fuzzer", + ] } } diff --git a/host/trace_streamer/doc/README.md b/host/trace_streamer/doc/README.md index eb0deec..e0d5c9e 100644 --- a/host/trace_streamer/doc/README.md +++ b/host/trace_streamer/doc/README.md @@ -1,13 +1,15 @@ # trace_streamer工具说明 +trace_streamer是一个trace数据流转化器,可以将一个trace文本文件或者基于proto序列化的二进制文件转换成为sqlite数据库的形式。 trace_streamer使用C++实现,支持在ohos, linux, mac等系统上使用,具有良好的跨平台特性。 +![GitHub Logo](.././figures/trace_streamer_stream.png) +## 关于trace解析工具的使用说明: trace_streamer工具可以2种方式使用 1. 可以将系统离线trace文件解析并转为db,此工具支持基于文本的trace和基于proto的trace。 2. trace_streamer工具还可以WebAssembly的方式在浏览器中运行,需暴露相关接口给js文件。 -## 关于trace解析工具的使用说明: ### 导出db模式 在导出db模式下,trace_streamer.exe trace文件路径名 -e 导出db路径名.db 此命令可以将trace文件转为db -本应用支持在ohos, linux, windows, mac使用。 +本应用支持在ohos, linux, mac使用。 关于db文件的说明: 使用db查看工具查看stat表,可以浏览当前数据一共有多少类数据,各类数据都收到多少条,数据是否正常等情况。在meta表会记录数据库导出时的一些系统信息,比如导入和导出的文件全路径,解析时间等信息。 meta表可以选择不导出(有些情况下会暴露系统敏感信息),在导出时添加 -nm选项即可。 @@ -63,247 +65,43 @@ EMSCRIPTEN_KEEPALIVE int TraceStreamerSqlQuery(const uint8_t* sql, int sqlLen, u ./trace_streamer --help -i 选项可查看应用支持的事件源和具体的事件名列表 -#### trace_streamer支持的事件解析 -本工具支持基于文本的trace(# TRACE)和基于proto的二进制日志文件的解析,支持的事件列表如下: -##### ftrace事件 -``` -binder_transaction -binder_transaction_received -binder_transaction_alloc_buf -binder_transaction_lock -binder_transaction_locked -binder_transaction_unlock -sched_switch -task_rename -task_newtask -tracing_mark_write -print -sched_wakeup -sched_waking -cpu_idle -cpu_frequency -suspend_resume -workqueue_execute_start -workqueue_execute_end -clock_set_rate -clock_enable -clock_disable -clk_set_rate -clk_enable -clk_disable -sys_enter -sys_exit -regulator_set_voltage -regulator_set_voltage_complete -regulator_disable -regulator_disable_complete -ipi_entry -ipi_exit -irq_handler_entry -irq_handler_exit -softirq_raise -softirq_entry -softirq_exit -sched_wakeup_new -sched_process_exit -trace_event_clock_sync -``` -##### 内存事件 -``` -mem.vm.size -mem.rss -mem.rss.anon -mem.rss.file -mem.rss.schem -mem.swap -mem.locked -mem.hwm -mem.oom_score_adj +### trace_streamer支持解析的事件列表 +支持的事件列表参见<> +## TraceStreamer重要概念介绍 +### 1. 进程和线程标识符 ``` -##### 系统内存事件 -``` -sys.mem.unspecified -sys.mem.total -sys.mem.free -sys.mem.avaiable -sys.mem.buffers -sys.mem.cached -sys.mem.swap.chard -sys.mem.active -sys.mem.inactive -sys.mem.active.anon -sys.mem.inactive.anon -sys.mem.active_file -sys.mem.inactive_file -sys.mem.unevictable -sys.mem.mlocked -sys.mem.swap.total -sys.mem.swap.free -sys.mem.dirty -sys.mem.writeback -sys.mem.anon.pages -sys.mem.mapped -sys.mem.shmem -sys.mem.slab -sys.mem.slab.reclaimable -sys.mem.slab.unreclaimable -sys.mem.kernel.stack -sys.mem.page.tables -sys.mem.commit.limit -sys.mem.commited.as -sys.mem.vmalloc.total -sys.mem.vmalloc.used -sys.mem.vmalloc.chunk -sys.mem.cma.total -sys.mem.cma.free -``` -##### 系统虚拟内存事件 -``` -sys.virtual.mem.unspecified -sys.virtual.mem.nr.free.pages -sys.virtual.mem.nr.alloc.batch -sys.virtual.mem.nr.inactive.anon -sys.virtual.mem.nr.active_anon -sys.virtual.mem.nr.inactive.file -sys.virtual.mem.nr.active_file -sys.virtual.mem.nr.unevictable -sys.virtual.mem.nr.mlock -sys.virtual.mem.anon.pages -sys.virtual.mem.nr.mapped -sys.virtual.mem.nr.file.pages -sys.virtual.mem.nr.dirty -sys.virtual.mem.nr.writeback -sys.virtual.mem.nr.slab.reclaimable -sys.virtual.mem.nr.slab.unreclaimable -sys.virtual.mem.nr.page_table.pages -sys.virtual.mem.nr_kernel.stack -sys.virtual.mem.nr.overhead -sys.virtual.mem.nr.unstable -sys.virtual.mem.nr.bounce -sys.virtual.mem.nr.vmscan.write -sys.virtual.mem.nr.vmscan.immediate.reclaim -sys.virtual.mem.nr.writeback_temp -sys.virtual.mem.nr.isolated_anon -sys.virtual.mem.nr.isolated_file -sys.virtual.mem.nr.shmem -sys.virtual.mem.nr.dirtied -sys.virtual.mem.nr.written -sys.virtual.mem.nr.pages.scanned -sys.virtual.mem.workingset.refault -sys.virtual.mem.workingset.activate -sys.virtual.mem.workingset_nodereclaim -sys.virtual.mem.nr_anon.transparent.hugepages -sys.virtual.mem.nr.free_cma -sys.virtual.mem.nr.swapcache -sys.virtual.mem.nr.dirty.threshold -sys.virtual.mem.nr.dirty.background.threshold -sys.virtual.mem.vmeminfo.pgpgin -sys.virtual.mem.pgpgout -sys.virtual.mem.pgpgoutclean -sys.virtual.mem.pswpin -sys.virtual.mem.pswpout -sys.virtual.mem.pgalloc.dma -sys.virtual.mem.pgalloc.normal -sys.virtual.mem.pgalloc.movable -sys.virtual.mem.pgfree -sys.virtual.mem.pgactivate -sys.virtual.mem.pgdeactivate -sys.virtual.mem.pgfault -sys.virtual.mem.pgmajfault -sys.virtual.mem.pgrefill.dma -sys.virtual.mem.pgrefill.normal -sys.virtual.mem.pgrefill.movable -sys.virtual.mem.pgsteal.kswapd.dma -sys.virtual.mem.pgsteal.kswapd.normal -sys.virtual.mem.pgsteal.kswapd.movable -sys.virtual.mem.pgsteal.direct.dma -sys.virtual.mem.pgsteal.direct.normal -sys.virtual.mem.pgsteal_direct.movable -sys.virtual.mem.pgscan.kswapd.dma -sys.virtual.mem.pgscan_kswapd.normal -sys.virtual.mem.pgscan.kswapd.movable -sys.virtual.mem.pgscan.direct.dma -sys.virtual.mem.pgscan.direct.normal -sys.virtual.mem.pgscan.direct.movable -sys.virtual.mem.pgscan.direct.throttle -sys.virtual.mem.pginodesteal -sys.virtual.mem.slabs_scanned -sys.virtual.mem.kswapd.inodesteal -sys.virtual.mem.kswapd.low.wmark.hit.quickly -sys.virtual.mem.high.wmark.hit.quickly -sys.virtual.mem.pageoutrun -sys.virtual.mem.allocstall -sys.virtual.mem.pgrotated -sys.virtual.mem.drop.pagecache -sys.virtual.mem.drop.slab -sys.virtual.mem.pgmigrate.success -sys.virtual.mem.pgmigrate.fail -sys.virtual.mem.compact.migrate.scanned -sys.virtual.mem.compact.free.scanned -sys.virtual.mem.compact.isolated -sys.virtual.mem.compact.stall -sys.virtual.mem.compact.fail -sys.virtual.mem.compact.success -sys.virtual.mem.compact.daemon.wake -sys.virtual.mem.unevictable.pgs.culled -sys.virtual.mem.unevictable.pgs.scanned -sys.virtual.mem.unevictable.pgs.rescued -sys.virtual.mem.unevictable.pgs.mlocked -sys.virtual.mem.unevictable.pgs.munlocked -sys.virtual.mem.unevictable.pgs.cleared -sys.virtual.mem.unevictable.pgs.stranded -sys.virtual.mem.nr.zspages -sys.virtual.mem.nr.ion.heap -sys.virtual.mem.nr.gpu.heap -sys.virtual.mem.allocstall.dma -sys.virtual.mem.allocstall.movable -sys.virtual.mem.allocstall.normal -sys.virtual.mem.compact_daemon.free.scanned -sys.virtual.mem.compact.daemon.migrate.scanned -sys.virtual.mem.nr.fastrpc -sys.virtual.mem.nr.indirectly.reclaimable -sys.virtual.mem.nr_ion_heap_pool -sys.virtual.mem.nr.kernel_misc.reclaimable -sys.virtual.mem.nr.shadow_call.stack_bytes -sys.virtual.mem.nr.shmem.hugepages -sys.virtual.mem.nr.shmem.pmdmapped -sys.virtual.mem.nr.unreclaimable.pages -sys.virtual.mem.nr.zone.active.anon -sys.virtual.mem.nr.zone.active.file -ys.virtual.mem.nr.zone.inactive_anon -sys.virtual.mem.nr.zone.inactive_file -sys.virtual.mem.nr.zone.unevictable -sys.virtual.mem.nr.zone.write_pending -sys.virtual.mem.oom.kill -sys.virtual.mem.pglazyfree -sys.virtual.mem.pglazyfreed -sys.virtual.mem.pgrefill -sys.virtual.mem.pgscan.direct -sys.virtual.mem.pgscan.kswapd -sys.virtual.mem.pgskip.dma -sys.virtual.mem.pgskip.movable -sys.virtual.mem.pgskip.normal -sys.virtual.mem.pgsteal.direct -sys.virtual.mem.pgsteal.kswapd -sys.virtual.mem.swap.ra -sys.virtual.mem.swap.ra.hit +在通用操作系统中,进程号(pid/tgid)和线程号(tid)可能会被重复用于标识不同的进程或者线程。所以在trace数据源中,进程号(pid)和线程号(tid)也可能被重用。 +TraceStreamer在解析数据过程中,使用ipid(internal pid)唯一标识进程, itid(internal tid)唯一标识线程。 ``` +### 2. 计量器 +用来记录系统中各种随时间连续变化的数值。例如: CPU的频率, 内存的使用量, 界面刷新频率。 +#### 举例 +CPU频率: +![GitHub Logo](.././figures/cpu_frequency.png) +内存占用: +![GitHub Logo](.././figures/mem_usage.png) +### 3. 过滤器 +TraceStreamer设计过程中使用了流式处理的思想,数据从入口进入以后,就像进入一条河流,从上游流向下游,在河道中央有很多过滤器,每种过滤器会将流过的数据中自己关注的内容吸附捕捉到。最终,每个过滤器都拥有了大量同类型的数据,而且这些数据都是按时间序列排列的。TraceStreamer使用filterid来标识同一种用途的数据,可以方便在UI中绘制。 +![image][filterimageid] + +## Stat表设计 +具体内容参见 [des_stat](.././des_stat.md) ## trace_streamer开发环境搭建和编译运行指引 -本应用使用gn作为构建工具,支持在linux环境同时编译linux,windows和mac使用QtCreator作为开发IDE +本应用使用gn作为构建工具。 ### 1、开发环境 -ubuntu使用vscode,windows和mac使用QtCreator +ubuntu和mac使用vscode # 对外部的依赖 本应用依赖与sqlite,protobuf(htrace解析部分依赖) 本应用同时依赖于src/protos目录下文件来生成相关pb.h,pb.cc文件 -### 2.1、 编译linux版应用 +### 2.1、 编译linux和Mac版应用 在根目录下执行相关命令进行编译 -### 2.2、编译Windows版和Mac应用 -在项目目录下有pro文件,为QtCreator的工程文件,但部分内容赖在于上面所添加的外部依赖,如果要编译相关平台应用,开发者需自行补充相关工程文件,或者在论坛留言 +### 2.2、 编译wasm +在根目录下执行相关命令进行编译 ### 2.3、开始编译 -具体方法可参考《compile_trace_streamer.md》 \ No newline at end of file +具体方法可参考[compile_trace_streamer](.././compile_trace_streamer.md) \ No newline at end of file diff --git a/host/trace_streamer/doc/des_compile_trace_streamer.md b/host/trace_streamer/doc/compile_trace_streamer.md similarity index 40% rename from host/trace_streamer/doc/des_compile_trace_streamer.md rename to host/trace_streamer/doc/compile_trace_streamer.md index dd1f00f..18dd1eb 100644 --- a/host/trace_streamer/doc/des_compile_trace_streamer.md +++ b/host/trace_streamer/doc/compile_trace_streamer.md @@ -6,7 +6,7 @@ 本工具默认编译方式是使用gn + 编译方式 ``` -./build.sh linux/wasm +./build.sh linux/wasm/macx ``` 如果需要编译WebAssembly版本,您需要在prebuilts/目录下安装emsdk ``` @@ -49,85 +49,4 @@ prebuilts/emsdk 之后调用 ``` ./build.sh wasm进行编译,您需要将sh脚本进行部分修改,因为这个脚本内置了一些库的下载和解析方式 -``` -本工具还支持使用QtCreator来编译。 - -src/trace_streamer.pro 是工程文件,编译本工具需要依赖Sqlite库和一些基于proto的pb.h文件 -## 2 准备工程 -### 2.1 基于proto文件生成pb文件 -您需要自行下载并编译一个当前系统(linux)可用的proobuf/protoc程序,此全路径为位于out/linux/protoc -src/protos目录下有一个protogen.sh文件,运行该文件可以在third_party/protogen目录下生成项目需要的pb相关文件 -序列化二进制的解析依赖于基于proto生成的.pb.cc文件。 -在执行protogen.sh脚本之后 -你的目录结构当类似如下结构: -``` -third_party/protogen/types/plugins/ftrace_data/*.pb.cc -third_party/sqlite/*. -third_party/protobuf/* -``` -### 2.2 获取第三方依赖库 -从 -https://gitee.com/openharmony/third_party_sqlite -获取sqlite3目录到代码根目录的third_party目录 -从 -https://gitee.com/openharmony/third_party_protobuf -获取protobuf目录到代码根目录的third_party目录 -之后,你的目录当如下所示 -trace_streamer/third_party/protobuf -trace_streamer/third_party/sqlite -# 3 (linux和ohos平台)使用gn编译TraceStreamer -在编译WebAssembly目标时,需要将sqlite3和protobuf里面相关的ohos_xxx_library统一修改为source_set -## 3.2 准备gn -在自己的项目中使用gn,必须遵循以下要求: -在根目录创建.gn文件,该文件用于指定CONFIG.gn文件的位置; -在BUILDCONFIG.gn中指定编译时使用的编译工具链; -在独立的gn文件中定义编译使用的工具链; -在项目根目录下创建BUILD.gn文件,指定编译的目标。 -``` -cp prebuilts/gn ./ -``` -不同的操作系统下,你需要获取不同的gn -## 3.3 执行编译 -./build.sh linux debug -或./build.sh linux debug -./build.sh将直接编译linux的release版本 -build.sh wasm 命令将可以编译WebAssembly版本 -特别说明:编译WebAssembly版本需要emSDK支持,你需要将build.sh里面的相关路径做更改,以保证编译时必须的文件是存在的 -# 4 编译Windows版本或Mac版本 -## 4.1 编译依赖文件 -### 4.1.1 编译SqliteLib -使用QtCreator打开prebuiltsprebuilts/buildprotobuf/sqlite.pro -### 4.1.2 编译ProtobufLib -使用QtCreator打开prebuilts/buildprotobuf/protobuf.pro -编译之后,文件结构当如下所示: -``` -lib -├── linux -│ ├── libdl.so -│ └── libsqlite.a -├── linux_debug -│ ├── libprotobuf.a -│ └── libsqlite.a -├── macx -│ ├── libprotobuf.a -│ └── libsqlite.a -├── macx_debug -│ ├── libprotobuf.a -│ └── libsqlite.a -├── windows -│ ├── libprotobuf.a -│ └── libsqlite.a -└── windows_debug - ├── libprotobuf.a - └── libsqlite.a -``` -## 4.2 编译TraceStreamer -之后,使用QtCreator打开src/trace_streamer.pro,选择合适的构建工具,执行 Ctrl + b 即可编译 - -编译之后的可执行文件位于out目录 -``` -- out ----- linux (Linux平台下QtCreator或gn生成) ----- macx (mac平台下QtCreator或gn生成) ----- windows (windows平台下QtCreator或gn生成) ``` \ No newline at end of file diff --git a/host/trace_streamer/doc/compiler_ut.md b/host/trace_streamer/doc/compiler_ut.md new file mode 100644 index 0000000..02d13a6 --- /dev/null +++ b/host/trace_streamer/doc/compiler_ut.md @@ -0,0 +1,28 @@ +直接运行./build.sh test 即可编译ut代码,编译ut时,可能会遇到一些问题,需要将部分代码做如下处理: +v412.pb.h +大约第36行,添加如下内容 +``` +#ifdef major +#undef major +#endif +#ifdef minor +#undef minor +#endif +``` +gtest-port.h 第286行,在 +``` +#include +``` +修改为 +``` +#undef private +#define private private +#include +#undef private +#define private public +``` +编译ut需要您在third_party下放置一个gtest的工程 + +在ut代码编译完成之后,直接运行./test.sh,可以执行所有ut,显示正确与否 +在ut执行之后,直接运行./lcov.sh,可以生成覆盖率报告 +覆盖率报告位于out/test/html目录 \ No newline at end of file diff --git a/host/trace_streamer/doc/des_binder.md b/host/trace_streamer/doc/des_binder.md new file mode 100644 index 0000000..5543132 --- /dev/null +++ b/host/trace_streamer/doc/des_binder.md @@ -0,0 +1,62 @@ +# binder事件上下文如何关联 +binder事件相对复杂,这里是从ftrace事件中抽离出来的binder相关消息,用来作为开发者或用户追踪binder事件的参考 +a binder event is identified by the sender and receive device, and a reply message only end +the last binder msg which reply the calling one. +the alloc_buf msg can always flow the binder_transaction, so we no need to identify the alloc msg with transactionID + +## TAG TT need reply!!! needReply = !isReply && !(flags & 0x01); +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128108: binder_transaction: transaction=25155526 dest_node=25155471 dest_proc=506 dest_thread=0 reply=0 flags=0x10 code=0x9 +RenderThread-2267 ( 1592) [003] ...1 168766.128110: binder_transaction_alloc_buf: transaction=25155526 data_size=120 offsets_size=8 +``` +### received +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128154: binder_transaction_received: transaction=25155526 +``` +### binder is in DB, TAG A needReply +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128221: binder_transaction: transaction=25155529 dest_node=25155527 dest_proc=1592 dest_thread=2267 reply=0 flags=0x10 code=0x5f474854 +Binder:506_2-537 ( 506) [003] ...1 168766.128223: binder_transaction_alloc_buf: transaction=25155529 data_size=72 offsets_size=0 +``` +## +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128243: binder_transaction_received: transaction=25155529 +``` +### the flowing is for TAG A, this is the reply for TAG A +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128262: binder_transaction: transaction=25155530 dest_node=0 dest_proc=506 dest_thread=537 reply=1 flags=0x8 code=0x0 + +RenderThread-2267 ( 1592) [003] ...1 168766.128264: binder_transaction_alloc_buf: transaction=25155530 data_size=4 offsets_size=0 +``` +### calc the dur of TAG A +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128288: binder_transaction_received: transaction=25155530 +``` +### binder last TAG A needReply, this is TAG B needReply!!! +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128328: binder_transaction: transaction=25155532 dest_node=25155527 dest_proc=1592 dest_thread=2267 reply=0 flags=0x10 code=0x2 +Binder:506_2-537 ( 506) [003] ...1 168766.128330: binder_transaction_alloc_buf: transaction=25155532 data_size=72 offsets_size=0 +``` +## in db +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128347: binder_transaction_received: transaction=25155532 +``` +## the reply message is not in db Session D, this is the reply for TAG B +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128361: binder_transaction: transaction=25155533 dest_node=0 dest_proc=506 dest_thread=537 reply=1 flags=0x0 code=0x0 +RenderThread-2267 ( 1592) [003] ...1 168766.128363: binder_transaction_alloc_buf: transaction=25155533 data_size=4 offsets_size=0 +``` +### no this message in db, calcate the dur of TAG B +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128385: binder_transaction_received: transaction=25155533 +``` +### no this message in db Session E, this is the reply for TAG TT +``` +Binder:506_2-537 ( 506) [003] ...1 168766.128412: binder_transaction: transaction=25155534 dest_node=0 dest_proc=1592 dest_thread=2267 reply=1 flags=0x0 code=0x0 + +Binder:506_2-537 ( 506) [003] ...1 168766.128413: binder_transaction_alloc_buf: transaction=25155534 data_size=68 offsets_size=0 +``` +## the dur of TAG TT is calcated by the flowing msg +``` +RenderThread-2267 ( 1592) [003] ...1 168766.128430: binder_transaction_received: transaction=25155534 +``` \ No newline at end of file diff --git a/host/trace_streamer/doc/des_stat.md b/host/trace_streamer/doc/des_stat.md index e1048f5..e71a4f4 100644 --- a/host/trace_streamer/doc/des_stat.md +++ b/host/trace_streamer/doc/des_stat.md @@ -1,7 +1,10 @@ # TraceStreamer 解析数据状态表 -TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件状态。通过stat表可以对trace数据源中各个类型事件的数据有一个基本了解。 +TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件状态。通过stat表可以对trace数据源中各个类型事件的数据的数量,数据质量有一个基本了解。 +我们对不同类型的数据,统计了收到多少条,数据逻辑是否匹配,是否有不合法数据,是否有数据丢失情况,所有这些,是基于对数据格式本身和数据前后关系的主观认识。欢迎开发者提供更多的思路来帮我们完善数据本身的校验工作。 ## stat表支持统计的事件列表如下: -|event_name | +### ftrace事件统计 +ftrace相关事件属于系统内核事件,具体请参考linux内核相关技术网站(www.kernel.org) +|事件名称 | | ---- | |binder_transaction | |binder_transaction_alloc_buf | @@ -17,17 +20,12 @@ TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件 |clock_set_rate | |cpu_frequency | |cpu_idle | -|hidump_fps | -|hilog | |ipi_entry | |ipi_exit | |irq_handler_entry | |irq_handler_exit | -|memory | -|native_hook_free | -|native_hook_malloc | +|memory (进程内存) | |oom_score_adj_update | -|other | |print | |regulator_disable | |regulator_disable_complete | @@ -47,8 +45,6 @@ TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件 |suspend_resume | |sys_enter | |sys_exit | -|sys_memory | -|sys_virtual_memory | |task_newtask | |task_rename | |trace_bblock_bio_queue | @@ -68,6 +64,40 @@ TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件 |tracing_mark_write | |workqueue_execute_end | |workqueue_execute_start | +## fps事件统计 +|事件名称 | +| ---- | +|hidump_fps | +## 日志事件统计 +|事件名称 | +| ---- | +|hilog | +## 系统内存和系统虚拟内存事件 +|事件名称 | +| ---- | +|sys_memory | +|sys_virtual_memory | +## 内存申请和释放事件 +|事件名称 | +| ---- | +|native_hook_free | +|native_hook_malloc | +## 磁盘读写事件统计 +|事件名称 | +| ---- | +|trace_diskio | +## 进程事件统计 +|事件名称 | +| ---- | +|trace_process | +## CPU使用率事件解析 +|事件名称 | +| ---- | +|trace_cpu_usage | +## 网络数据事件解析 +|事件名称 | +| ---- | +|trace_network | ## 事件对应解析状态: 每种事件解析数据都有5种状态,描述如下表: @@ -81,7 +111,9 @@ TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件 ## 数据状态级别 数据状态级别总共有4种,分别是:info, warn, error,fatal。由于数据的重要性不同,不同事件的同一种状态可能对应不同的级别。 -例如binder_transaction_received的 not_supported状态的数据为info级别,而binder_transaction_alloc_buf的not_supported状态数据为warn级别。 +例如binder_transaction_received的 not_supported状态的数据为info级别,而binder_transaction_alloc_buf的not_supported状态数据为warn级别。 + +您可以在src/cfg/trace_streamer_config.cpp的InitSecurityMap方法中自行定义相关事件的优先级。 ## 事件,状态与级别对应关系 | event_name | stat_type | serverity | @@ -321,6 +353,26 @@ TraceStreamer使用stat表统计解析trace数据源过程遇到的重要事件 | native_hook_free | not_match | info | | native_hook_free | not_supported | warn | | native_hook_free | invalid_data | error | +| trace_diskio | received | info | +| trace_diskio | data_lost | error | +| trace_diskio | not_match | info | +| trace_diskio | not_supported | warn | +| trace_diskio | invalid_data | error | +| trace_process | received | info | +| trace_process | data_lost | error | +| trace_process | not_match | info | +| trace_process | not_supported | warn | +| trace_process | invalid_data | error | +| trace_cpu_usage | received | info | +| trace_cpu_usage | data_lost | error | +| trace_cpu_usage | not_match | info | +| trace_cpu_usage | not_supported | warn | +| trace_cpu_usage | invalid_data | error | +| trace_network | received | info | +| trace_network | data_lost | error | +| trace_network | not_match | info | +| trace_network | not_supported | warn | +| trace_network | invalid_data | error | | sys_memory | received | info | | sys_memory | data_lost | error | | sys_memory | not_match | info | diff --git a/host/trace_streamer/doc/des_support_eventlist.md b/host/trace_streamer/doc/des_support_event.md similarity index 100% rename from host/trace_streamer/doc/des_support_eventlist.md rename to host/trace_streamer/doc/des_support_event.md diff --git a/host/trace_streamer/doc/des_tables.md b/host/trace_streamer/doc/des_tables.md index efe0a6f..1c4a985 100644 --- a/host/trace_streamer/doc/des_tables.md +++ b/host/trace_streamer/doc/des_tables.md @@ -4,30 +4,44 @@ ``` ## ___TraceStreamer输出数据库包含以下表格___ -* trace_range : 记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用。 -* process : 记录进程信息。 -* thread : 记录线程信息。 -* thread_state : 记录线程状态信息。 -* instant : 记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用。 -* raw : 此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录。 +* args : 记录方法参数集合 * callstack : 记录调用堆栈和异步调用,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。 +* clk_event_filter : 记录时钟信息。 +* clock_event_filter :此结构用来维护时钟事件和cpu与唯一的ID做关联 +* cpu_measure_filter : cpu事件过滤器表。 +* cpu_usage :记录CPU使用率事件。 +* data_dict : 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据。 +* data_type : 记录数据类型和typeId的关联关系。 +* diskio :记录磁盘读写数据事件。 +* hidump : 记录FPS(Frame Per Second)数据。 +* instant : 记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用。 * irq : 记录中断相关事件。 -* measure : 记录所有的计量值。 +* live_process :记录了一些实时的进程中执行的一些数据。 * log : 记录hilog打印日志数据。 -* heap : 记录堆内存申请与释放相关的数据。 -* heap_frame : 记录堆内存申请与释放相关的调用栈。 -* hidump : 记录FPS(Frame Per Second)数据。 +* measure : 记录所有的计量值。 +* measure_filter : 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。 +* meta : 记录执行解析操作相关的基本信息。 +* native_hook :记录堆内存申请与释放相关的数据。 +* native_hook_frame :记录堆内存申请与释放相关的调用栈。 +* network :抓取网络信息传输时产生的一些相关信息 +* perf_callchain :记录Hiperf采样数据的调用栈信息。 +* perf_files :记录Hiperf工具采集到的函数符号表和文件名。 +* perf_report :记录Hiperf工具采集数据时的配置信息。包括:抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称。 +* perf_sample :记录Hiperf工具的采样信息。 +* perf_thread :记录Hiperf工具采集到的进程和线程数据。 +* process : 记录所有的进程信息。 +* process_filter :过滤进程。 +* process_measure_filter : 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id +* raw : 此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录。 +* sched_slice :此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录 +* stat :此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解 * symbols : 记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间 * syscall : 记录用户空间函数与内核空间函数相互调用记录 -* args : 记录方法参数集合 * sys_event_filter : 记录所有的filter -* clk_event_filter : 记录时钟事件 -* cpu_measure_filter : cpu事件过滤器表。 -* measure_filter : 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。 -* process_measure_filter : 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id -* data_type : 记录数据类型和typeId的关联关系。 -* data_dict : 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据。 -* meta : 记录执行解析操作相关的基本信息。 +* thread : 记录所有的线程信息。 +* thread_filter :过滤线程。 +* thread_state : 记录线程状态信息。 +* trace_range : 记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用。 ## ___表格关系图___ @@ -52,17 +66,17 @@ select thread_state.* from thread, thread_state where thread.tid = 123 and threa ### 堆内存数据变化表关系图 ![GitHub Logo](../figures/dump_and_mem.png) ### 描述: -heap表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。heap表通过ipid和itid字段分别与process和thread表的id字段关联,通过eventId与heap_frame表的eventId字段相关联。 -heap表字段解释如下: - eventId: 唯一标识一次堆内存申请或释放, 通过与heap_frame表关联可以拿到当前申请或释放的函数调用堆栈。 +native_hook表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。native_hook表通过ipid和itid字段分别与process和thread表的id字段关联,通过eventId与native_hook_frame表的eventId字段相关联。 +native_hook表字段解释如下: + eventId: 唯一标识一次堆内存申请或释放, 通过与native_hook_frame表关联可以拿到当前申请或释放的函数调用堆栈。 addr: 堆内存申请/释放的地址 - heap_size: 堆内存申请/释放的大小 -heap_frame表记录内存申请/释放的调用堆栈。通过eventId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。 + native_hook_size: 堆内存申请/释放的大小 +native_hook_frame表记录内存申请/释放的调用堆栈。通过eventId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。 ### 举例: 已知tid = 123, 查看当前线程的所有堆内存变化信息,可以使用如下SQL语句: -select heap.* from thread, heap where thread.tid = 123 and thread.id = heap.itid +select native_hook.* from thread, native_hook where thread.tid = 123 and thread.id = native_hook.itid 已知eventid = 0, 查看当前内存变化调用堆栈 -select * from heap_frame where eventId = 0 +select * from native_hook_frame where eventId = 0 ### 日志表与进程线程表关系图 ![GitHub Logo](../figures/log.png) @@ -72,6 +86,8 @@ log表记录日志信息。可以根据seq字段的连续性,来判断是否 已知tid = 123, 查看当前线程的所有error级别的日志,可以使用如下SQL语句: select * from log where tid = 123 and level = "error" +### perf表关系图 + ## TraceStreamer输出数据库表格详细介绍 ### trace_range表 @@ -83,6 +99,7 @@ select * from log where tid = 123 and level = "error" #### 关键字段描述: start_ts: trace的开始时间,纳秒为单位 end_ts: trace的结束时间,纳秒为单位 + ### process表 #### 表结构: | Columns Name | SQL TYPE | @@ -96,6 +113,7 @@ end_ts: trace的结束时间,纳秒为单位 id: 进程在数据库重新重新定义的id,从0开始序列增长 pid: 进程的真实id name: 进程名字 + ### thread表 #### 表结构: | Columns Name | SQL TYPE | @@ -110,7 +128,7 @@ name: 进程名字 |is_main_thread|INT | #### 字段详细描述: id: 线程在数据库重新重新定义的id,从0开始序列增长 -ipid: 线程所属的进程id, 关联进程表中的ID +ipid: 线程所属的进程id, 关联process表中的ID name: 线程名字 is_main_thread: 是否主线程,主线程即该线程实际就是进程本身 @@ -130,7 +148,7 @@ id: 线程状态在数据库中的id,从0开始序列增长 ts: 该线程状态的起始时间 dur: 该线程状态的持续时间 cpu: 该线程在哪个cpu上执行(针对running状态的线程) -itid: 该状态所属的线程所属的进程id, 关联进程表中的ID +itid: 该状态所属的线程id, 关联线程表中的id state: 线程实际的的状态值 ``` 'R', Runnable状态 @@ -156,6 +174,7 @@ state: 线程实际的的状态值 |ref_type |NUM | #### 表描述: 记录了系统中的waking和wakeup事件。 + ### raw表 #### 表结构: | Columns Name | SQL TYPE | @@ -203,28 +222,45 @@ parent_id: 父调用的id |ts |INT | |value |INT | |filter_id |INT | -#### 字段详细描述: +#### 关键字段描述: +ts: 事件时间 +value: 数值 +filter_id: 对应filter表中的ID -### heap表 +### native_hook表 #### 表结构: | Columns Name | SQL TYPE | |---- |---- | +|id |INT | |eventId |INT | |ipid |INT | |itid |INT | |event_type |NUM | +|sub_type |NUM | |start_ts |INT | |end_ts |INT | |dur |INT | |addr |INT | |heap_size |INT | |all_heap_size |INT | -#### 字段详细描述: +|current_size_dur |INT | +#### 关键字段描述: +eventId:唯一标识一条native_hook数据 +event_type:事件类型取值范围(AllocEvent,FreeEvent,MmapEvent, MunmapEvent) +sub_type:子事件类型(只有sub_type字段为MmapEvent时,该字段才会有值) +start_ts:申请内存开始时间 +end_ts:释放内存时间 +Dur:申请内存活跃时间 +Addr:申请内存地址 +mem_size:申请或释放内存大小 +all_mem_size:从采集数据开始到当前时刻,申请并活跃的内存总量。 event_type为AllocEvent或者FreeEvent时,表示活跃的堆内存总量。当event_type为MmapEvent或者MunmapEvent时,表示活跃的映射内存总量。 +current_size_dur:表示当前活跃内存总量的持续时间 -### heap_frame表 +### native_hook_frame表 #### 表结构: | Columns Name | SQL TYPE | |---- |---- | +|id |INT | |eventId |INT | |depth |INT | |ip |INT | @@ -235,14 +271,17 @@ parent_id: 父调用的id |symbol_offset |INT | #### 表描述: 记录了内存的申请和释放的堆栈。 + ### hidump表 #### 表结构: | Columns Name | SQL TYPE | |---- |---- | +|id |INT | |ts |INT | |fps |INT | #### 表描述: 此表记录了设备的帧率信息,fps。 + ### symbols表 #### 表结构: | Columns Name | SQL TYPE | @@ -262,10 +301,10 @@ parent_id: 父调用的id |type |NUM | |name |INT | |source_arg_set_id |INT | - #### 字段详细描述: 过滤分类(type),过滤名称(key2),数据ID(key1)。 数据ID在process_measure_filter, sys_event_filter中作为id。 + ### process_measure_filter表 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, filter_id同时被记录在measure_filter表中。 #### 表结构: @@ -278,7 +317,76 @@ parent_id: 父调用的id #### 字段详细描述: filterid: 来自measure_filter表 name: cpu状态名 -ipid: 进程内部编号 +ipid: 进程内部编号 + +### sys_event_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +#### 表描述: +记录所有的filter + +### clk_event_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|cpu |INT | +#### 字段详细描述: +Type:时钟事件类型 +Name:时钟事件名称 + +### cpu_measure_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|cpu |INT | +#### 主要字段描述: +Id(filterid), cpu:事件名称,cpu号 + +### measure_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|source_arg_set_id |INT | +#### 字段详细描述: +Id:filterID +Type:过滤分类 +Name:过滤名称 + +### irq表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ts |INT | +|dur |INT | +|callid |INT | +|cat |NUM | +|name |NUM | +|depth |INT | +|cookie |INT | +|parent_id |INT | +|argsetid |INT | +|chainId |NUM | +|spanId |NUM | +|parentSpanId |NUM | +|flag |NUM | +|args |NUM | +#### 表描述: +记录中断相关事件。 + ### data_type表 #### 表结构: | Columns Name | SQL TYPE | @@ -287,7 +395,8 @@ ipid: 进程内部编号 |typeId |INT | |desc |NUM | #### 表描述: -此表记录了一个数据类型ID和数据描述的映射。 +此表记录了一个数据类型ID和数据描述的映射。 + ### data_dict表 #### 表结构: | Columns Name | SQL TYPE | @@ -295,7 +404,8 @@ ipid: 进程内部编号 |id |INT | |data |NUM | #### 表描述: -此表记录了一个数据类型ID和字符串的映射。 +此表记录了一个数据类型ID和字符串的映射。 + ### meta表 #### 表结构: | Columns Name | SQL TYPE | @@ -304,3 +414,241 @@ ipid: 进程内部编号 |value |NUM | #### 表描述: 此表记录了数据解析或导出时的一些现场数据,比如使用的trace_streamer版本, 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。 + +### clock_event_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|cpu |INT | +#### 表描述: +此结构用来维护时钟事件和cpu与唯一的ID做关联 + +### cpu_usage表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|ts |INT | +|dur |INT | +|total_load |REAL | +|user_load |REAL | +|system_load |REAL | +|process_num |INT | +#### 表描述: +total_load: 总负荷 +user_load: 用户负载 +system_load: 系统负载 +process_num: 线程数 + +### diskio表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|ts |INT | +|dur |INT | +|rd |INT | +|wr |INT | +|rd_speed |REAL | +|wr_speed |REAL | +|rd_count |INT | +|wr_count |INT | +|rd_count_speed |REAL | +|wr_count_speed |REAL | +#### 主要字段描述: +rd_sectors_kb:读数据的速度。 +wr_sectors_kb:写入数据的速度。 +ts:时间戳 + +### live_process表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|ts |INT | +|dur |INT | +|cpu_time |INT | +|process_id |INT | +|process_name |NUM | +|parent_process_id |INT | +|uid |INT | +|user_name |NUM | +|cpu_usage |REAL | +|pss_info |INT | +|thread_num |INT | +|disk_writes |INT | +|disk_reads |INT | +#### 主要字段描述: +process_id: 进程id +process_name: 进程名 +parent_process_id: 父进程的id +uid: 用户id +user_name: 用户名 +cpu_usage: cpu使用率 +pss_info: 进程信息 +thread_num: 线程数量 +disk_writes: 磁盘写量 +disk_reads: 磁盘读量 + +### network表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|ts |INT | +|dur |INT | +|tx |INT | +|rx |INT | +|tx_speed |REAL | +|rx_speed |REAL | +|packet_in |INT | +|packet_in_sec |REAL | +|packet_out |INT | +|packet_out_sec |REAL | +|net_type |NUM | +#### 主要字段描述: +ts:时间戳 +tv_sec:时间,秒为单位 +tv_nsec:时间,纳秒为单位 +tx_bytes:网络数据的写入量 +rx_bytes:网络数据的读取量 + +### perf_callchain表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|sample_id |INT | +|callchain_id |INT | +|vaddr_in_file |INT | +|file_id |INT | +|symbol_id |INT | +#### 主要字段描述: +Sample_id: 与PerfSample中的Sample_id相关联。代表一次采样。 +callchain_id: 调用栈深度。 +vaddr_in_file: 函数在文件中的虚拟地址。 +file_id: 与PerfFiles中的file_id字段相关联。 +symbol_id : 与PerfFiles中的symbol_id相关联。 + +### perf_files表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|file_id |INT | +|symbol |NUM | +|path |NUM | +#### 主要字段描述: +file_id: 文件编号。 +serial_id: 一个文件中可能有多个函数,serial_id表示函数的编号。 +symbol: 函数名 +path: 文件路径。 + +### perf_report表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|report_type |NUM | +|report_value |NUM | +#### 主要字段描述: +report_type: 数据类型。取值只有三种类型:config_name(事件类型), workload(抓取的进程名), cmdline(抓取命令)。 +report_value: 对应类型的取值。 + +### perf_sample表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|sample_id |INT | +|timestamp |INT | +|thread_id |INT | +|event_count |INT | +|event_type_id |INT | +|timestamp_trace |INT | +|cpu_id |INT | +|thread_state |NUM | +#### 主要字段描述: +sample_id: 采样编码。 +timestamp:未进行时钟源同步的时间戳。 +thread_id: 线程号。 +event_count: 采样统计。 +event_type_id: 事件类型编号。与PerfReport表的id字段相关联。 +timestamp_trace:时钟源同步后的时间戳。 +cpu_id: cpu核编号。 +thread_state: 线程状态。采样对应Sched_Waking事件时,为Runing;对应Sched_Switch事件时,为Suspend。其余事件类型,为“-”。 + +### perf_thread表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|thread_id |INT | +|process_id |INT | +|thread_name |NUM | +#### 表描述: +thread_id: 线程号 +process_id: 进程号 +thread_name: 线程名 + +### process_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|ipid |INT | +#### 主要字段描述: +id: 进程id +type: 进程类型 +name: 进程名 +ipid: 该进程表中的id与process表中的id相关联 + +### sched_slice表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|ts |INT | +|dur |INT | +|cpu |INT | +|itid |INT | +|end_state |NUM | +|priority |INT | +#### 主要字段描述: +Dur:状态持续时长 +ts:事件发生事件 +cpu:事件发生在哪个cpu +itid:事件对应哪个utid +end_state:线程的终结状态 + +### stat表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|event_name |NUM | +|stat_type |NUM | +|count |INT | +|serverity |NUM | +|source |NUM | +#### 主要字段描述: +event_name:数据类型 +stat_type:数据状态 +count:数据条数 +severity:严重级别 +source:数据来源 + +### thread_filter表 +#### 表结构: +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|type |NUM | +|name |NUM | +|itid |INT | +#### 主要字段描述: +id:线程id +type:线程类型 +name:线程名称 +itid:该表中的tid与thread表中的tid相关联 diff --git a/host/trace_streamer/doc/des_wakup.md b/host/trace_streamer/doc/des_wakup.md new file mode 100644 index 0000000..077374b --- /dev/null +++ b/host/trace_streamer/doc/des_wakup.md @@ -0,0 +1,3 @@ +各应用程序对于trace事件的waking和wakeup处理是略有区别的。 +waking是开始唤醒线程,wakeup是线程正式被唤醒,进入runnable(可运行状态) +我们的策略是:被唤醒才是真正进入runnable状态,在没有wakeup事件的情况下,以waking为准。 \ No newline at end of file diff --git a/host/trace_streamer/figures/dump_and_mem.png b/host/trace_streamer/figures/dump_and_mem.png index b7e3cc26ca286702c9ca9869fc203aff34a8da39..886198f131dd54f498c00dce10313e29a992a481 100644 GIT binary patch literal 6834 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 E4=MAVv;Y7A diff --git a/host/trace_streamer/gn/BUILD.gn b/host/trace_streamer/gn/BUILD.gn index a44389b..0f45342 100644 --- a/host/trace_streamer/gn/BUILD.gn +++ b/host/trace_streamer/gn/BUILD.gn @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. print("target_os", target_os) +print("target_name", target) group("default_deps") { public_configs = [ ":default_config" ] public_deps = [] @@ -24,10 +25,16 @@ config("default_config") { config("trace_cfg") { cflags_cc = [ "-std=c++17", - "-fno-rtti", - "-fno-exceptions", + + # "-std=gnu++17", "-fvisibility=hidden", ] + if (!is_test) { + cflags_cc += [ + "-fno-rtti", + # "-fno-exceptions", + ] + } } config("visibility_hidden") { @@ -41,12 +48,11 @@ config("default") { cflags = [ "-fstrict-aliasing", - "-fPIC", "-g", "-Wformat", ] - if (is_linux) { + if (is_linux || is_macx) { cflags += [ "-Wa,--noexecstack", "-fcolor-diagnostics", @@ -55,25 +61,35 @@ config("default") { ] if (!use_wasm) { cflags += [ - "-fPIE", "-fstack-protector-strong", "-fstack-protector-all", "-D_FORTIFY_SOURCE=2 -O2", + "-D SUPPORTTHREAD", # if support thread ] } - libs += [ - "pthread", - "rt", - ] - if (is_debug) { - libs += [ "dl" ] + + # cflags += [ "-D USE_VTABLE" ] + cflags += [ "-D BINDER_EXP" ] + libs += [ "pthread" ] + if (!is_macx) { + libs += [ "rt" ] + } + if (!is_win) { + cflags += [ + "-fPIE", + "-fPIC", + ] + } + if (is_win) { + cflags += [ "/W0" ] + defines = [ "WIN32_LEAN_AND_MEAN" ] } } } config("symbols") { cflags = [ "-O0" ] - if (is_linux) { + if (is_linux || is_macx) { cflags += [ "-funwind-tables" ] } } @@ -85,42 +101,60 @@ config("release") { ] cflags += [ "-O3" ] - ldflags = [ - "-fuse-ld=gold", - "-fstack-protector", - "-Wl,--gc-sections", - "-Wl,-O1", - "-fpie", - "-pie", - ] + ldflags = [ "-fstack-protector" ] + if (!is_macx) { + ldflags += [ + "-fuse-ld=gold", + "-Wl,--gc-sections", + "-Wl,-O1", + ] + } + + if (!is_win && !is_macx) { + ldflags += [ + "-fPIC", + "-fpie", + "-pie", + ] + } defines = [ "NDEBUG" ] } config("shared_library") { - ldflags = [ "-fPIC" ] + if (!is_win) { + ldflags = [ "-fPIC" ] + } } config("executable") { print("use_wasm", use_wasm) ldflags = [] - if (is_linux && !use_wasm) { - ldflags += [ - # "-Wl,-rpath=\$ORIGIN/.", + if (is_linux || (is_macx && !use_wasm)) { + ldflags += [] + } + if (!is_macx && !use_wasm) { + ldflags = [ + "-Wl,--disable-new-dtags", + "-Wl,-z,noexecstack", + "-lrt", + "-fuse-ld=gold", "-Wl,-z,now", - - # "-Wl,-rpath-link=.", "-Wl,-z,relro", - "-lrt", "-fpie", "-pie", - "-Wl,-z,noexecstack", - "-Wl,--disable-new-dtags", - - # "-s", # delete sambols ] } - if (!is_debug) { + if (is_macx) { + ldflags += [ + "-Wl,-U,__sanitizer_options_link_helper", + "-fdata-sections", + "-ffunction-sections", + ] + } + if (!is_debug && !is_macx) { ldflags += [ "-s" ] + } else if (!is_debug && is_macx) { + ldflags += [ "-dead_strip" ] } } diff --git a/host/trace_streamer/gn/CONFIG.gn b/host/trace_streamer/gn/CONFIG.gn index babf975..585c6e9 100644 --- a/host/trace_streamer/gn/CONFIG.gn +++ b/host/trace_streamer/gn/CONFIG.gn @@ -12,32 +12,43 @@ # limitations under the License. is_win = false is_linux = false +is_macx = false +is_protoc = false declare_args() { ar = "ar" is_debug = true use_wasm = false is_test = false + testonly = false + is_fuzz = false + is_macx = false + target = "trace_streamer" } if (target_os == "linux") { - is_win = false is_linux = true - is_test = false +} else if (target_os == "macx") { + is_macx = true } else if (target_os == "windows") { is_win = true - is_linux = false - is_test = false -} else if (target_os == "wasm") { - is_win = false - is_linux = true +} else { + print("unknown platform " + target_os) + exit(-1) +} + +if (target == "wasm") { use_wasm = true - is_test = false -} else if (target_os == "test") { - is_win = false - is_linux = true - use_wasm = false +} else if (target == "test") { is_test = true + testonly = true +} else if (target == "fuzz") { + is_fuzz = true + testonly = true +} else if (target == "protoc") { + is_protoc = true +} else if (target == "trace_streamer" || target == "streamer") { + print("build " + target) } else { - print("unknown platform " + target_os) + print("unknown target " + target_os) exit(-1) } @@ -59,7 +70,9 @@ if (!is_debug) { set_defaults("ohos_source_set") { configs = default_configs } - +set_defaults("ohos_shared_library") { + configs = default_configs +} set_defaults("executable") { configs = default_configs configs += [ "//gn:executable" ] diff --git a/host/trace_streamer/gn/toolchain/BUILD.gn b/host/trace_streamer/gn/toolchain/BUILD.gn index e1b24fd..0e34297 100644 --- a/host/trace_streamer/gn/toolchain/BUILD.gn +++ b/host/trace_streamer/gn/toolchain/BUILD.gn @@ -13,12 +13,14 @@ import("//gn/wasm.gni") declare_args() { - if (target_os == "linux" || target_os == "wasm" || target_os == "test") { + if (target_os == "linux" || target_os == "macx") { cc = "/usr/bin/clang" cxx = "/usr/bin/clang++" + pic = "-fPIC" } else if (target_os == "windows") { - cc = "~/mingw-w64/ohos/linux-x86_64/clang-mingw/bin/clang" - cxx = "~/mingw-w64/ohos/linux-x86_64/clang-mingw/bin/clang++" + cc = "clang.exe" + cxx = "clang++.exe" + pic = "" } if (use_wasm == true) { print("make_wasm") @@ -26,7 +28,6 @@ declare_args() { print("no make_wasm") } cc_wrapper = "" - is_mac = false } toolchain("wasm") { # emsdk_dir and em_config are defined in wasm.gni. @@ -124,7 +125,7 @@ toolchain("gcc_like") { tool("cxx") { depfile = "{{output}}.d" # must be defined - command = "$cxx -o {{output}} -MMD -MF $depfile {{defines}} -fPIC {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}}" + command = "$cxx -o {{output}} -MMD -MF $depfile {{defines}} $pic {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}}" outputfiles = "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" outputs = [ outputfiles ] @@ -133,7 +134,7 @@ toolchain("gcc_like") { tool("cc") { depfile = "{{output}}.d" - command = "$cc -o {{output}} -MMD -MF $depfile {{defines}} -fPIC {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}}" + command = "$cc -o {{output}} -MMD -MF $depfile {{defines}} $pic {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}}" outputfiles = "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" outputs = [ outputfiles ] diff --git a/host/trace_streamer/gn/wasm.gni b/host/trace_streamer/gn/wasm.gni index 7209ff6..3d03037 100644 --- a/host/trace_streamer/gn/wasm.gni +++ b/host/trace_streamer/gn/wasm.gni @@ -61,10 +61,10 @@ template("wasm_lib") { ] } else { _target_ldflags += [ - "-g2", # Required for getting C++ symbol names. + # "-g2", # Required for getting C++ symbol names. "-O3", - "-s", - "ASSERTIONS=1", + # "-s", + # "ASSERTIONS=1", ] } diff --git a/host/trace_streamer/prebuilts/buildprotobuf/libprotobuf_lite_la_SOURCES.pri b/host/trace_streamer/prebuilts/buildprotobuf/libprotobuf_lite_la_SOURCES.pri deleted file mode 100644 index 39c051f..0000000 --- a/host/trace_streamer/prebuilts/buildprotobuf/libprotobuf_lite_la_SOURCES.pri +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. - message("qmake" $${PROTOBUDIR}"/src") -win32 { -SOURCES += $${PROTOBUDIR}/src/google/protobuf/io/io_win32.cc -} -SOURCES += \ - $${PROTOBUDIR}/src/google/protobuf/stubs/bytestream.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/common.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/int128.cc \ -# $${PROTOBUDIR}/src/google/protobuf/stubs/once.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/int128.h \ -# $${PROTOBUDIR}/src/google/protobuf/io/io_win32.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/status.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/statusor.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/statusor.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/stringpiece.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/stringprintf.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/structurally_valid.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/strutil.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/time.cc \ -# $${PROTOBUDIR}/src/google/protobuf/any_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/arena.cc \ -# $${PROTOBUDIR}/src/google/protobuf/arenastring.cc \ - $${PROTOBUDIR}/src/google/protobuf/extension_set.cc \ - $${PROTOBUDIR}/src/google/protobuf/generated_enum_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/generated_message_util.cc \ -# $${PROTOBUDIR}/src/google/protobuf/generated_message_table_driven_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/implicit_weak_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/message_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/parse_context.cc \ - $${PROTOBUDIR}/src/google/protobuf/repeated_field.cc \ -# $${PROTOBUDIR}/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc \ -# $${PROTOBUDIR}/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc \ - $${PROTOBUDIR}/src/google/protobuf/wire_format_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/coded_stream.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/strtod.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/zero_copy_stream.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/zero_copy_stream_impl.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc - -HEADERS += \ - $${PROTOBUDIR}/src/google/protobuf/stubs/bytestream.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/hash.h \ - $${PROTOBUDIR}/src/google/protobuf/io/coded_stream_inl.h \ -# $${PROTOBUDIR}/src/google/protobuf/generated_message_table_driven_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/time.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/stringprintf.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/stringpiece.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/status.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/status_macros.h \ -# $${PROTOBUDIR}/src/google/protobuf/io/io_win32.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/map_util.h \ - $${PROTOBUDIR}/src/google/protobuf/stubs/mathutil.h diff --git a/host/trace_streamer/prebuilts/buildprotobuf/libprotoc_la_SOURCES.pri b/host/trace_streamer/prebuilts/buildprotobuf/libprotoc_la_SOURCES.pri deleted file mode 100644 index ed1da78..0000000 --- a/host/trace_streamer/prebuilts/buildprotobuf/libprotoc_la_SOURCES.pri +++ /dev/null @@ -1,173 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. - message("qmake" $${PROTOBUDIR}"/src/google/protobuf/compiler/") -SOURCES += \ - $${PROTOBUDIR}/src/google/protobuf/compiler/code_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/command_line_interface.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/plugin.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/plugin.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/subprocess.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/zip_writer.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_enum.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_enum_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_extension.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_file.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_helpers.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_map_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_message_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_service.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_string_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_context.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_extension.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_extension_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_file.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_generator_factory.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_helpers.cc \ -# $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_lazy_message_field.cc \ -# $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_map_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_map_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_builder.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_builder_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_name_resolver.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_primitive_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_primitive_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_shared_code_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_service.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_string_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_string_field_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_doc_comment.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/js/js_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/js/well_known_types_embed.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_enum.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_extension.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_file.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc \ -# $${PROTOBUDIR}/src/google/protobuf/compiler/php/php_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/python/python_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/ruby/ruby_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_enum.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_enum_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_field_base.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_generator.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_helpers.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_map_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_message_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc \ - -HEADERS += \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_primitive_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_options.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_service.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_string_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_field_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_context.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_enum_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_extension.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_map_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_map_field_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_helpers.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_file.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_generator_factory.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_extension_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_field_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_builder.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_message_builder_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_name_resolver.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_options.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_primitive_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_primitive_field_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_shared_code_generator.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_service.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_string_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_enum.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_string_field_lite.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/scc.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/subprocess.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/zip_writer.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_enum.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_enum_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_extension.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_file.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_helpers.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_map_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_message.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_message_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/cpp/cpp_message_layout_helper.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/java/java_doc_comment.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_extension.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_file.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_map_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_message.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_message_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_oneof.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_message_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_options.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_primitive_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_reflection_class.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_enum.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_enum_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_field_base.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_helpers.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_map_field.h \ - $${PROTOBUDIR}/src/google/protobuf/compiler/csharp/csharp_message.h \ diff --git a/host/trace_streamer/prebuilts/buildprotobuf/protobuf.pri b/host/trace_streamer/prebuilts/buildprotobuf/protobuf.pri deleted file mode 100644 index 1bfc084..0000000 --- a/host/trace_streamer/prebuilts/buildprotobuf/protobuf.pri +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. -PROTOBUDIR = $$PWD/../../third_party/protobuf - message("qmake" $${PROTOBUDIR}"/src/google/protobuf/") -SOURCES += \ -$${PROTOBUDIR}/src/google/protobuf/any.cc \ -$${PROTOBUDIR}/src/google/protobuf/any_lite.cc \ - $${PROTOBUDIR}/src/google/protobuf/any.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/api.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/importer.cc \ - $${PROTOBUDIR}/src/google/protobuf/compiler/parser.cc \ - $${PROTOBUDIR}/src/google/protobuf/descriptor.cc \ - $${PROTOBUDIR}/src/google/protobuf/descriptor.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/descriptor_database.cc \ - $${PROTOBUDIR}/src/google/protobuf/duration.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/dynamic_message.cc \ - $${PROTOBUDIR}/src/google/protobuf/empty.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/extension_set_heavy.cc \ - $${PROTOBUDIR}/src/google/protobuf/field_mask.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/generated_message_reflection.cc \ - $${PROTOBUDIR}/src/google/protobuf/generated_message_table_driven.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/gzip_stream.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/printer.cc \ - $${PROTOBUDIR}/src/google/protobuf/io/tokenizer.cc \ - $${PROTOBUDIR}/src/google/protobuf/map_field.cc \ - $${PROTOBUDIR}/src/google/protobuf/message.cc \ - $${PROTOBUDIR}/src/google/protobuf/reflection_ops.cc \ - $${PROTOBUDIR}/src/google/protobuf/service.cc \ - $${PROTOBUDIR}/src/google/protobuf/source_context.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/struct.pb.cc \ -# $${PROTOBUDIR}/src/google/protobuf/stubs/mathlimits.cc \ - $${PROTOBUDIR}/src/google/protobuf/stubs/substitute.cc \ - $${PROTOBUDIR}/src/google/protobuf/text_format.cc \ - $${PROTOBUDIR}/src/google/protobuf/timestamp.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/type.pb.cc \ - $${PROTOBUDIR}/src/google/protobuf/unknown_field_set.cc \ -# $${PROTOBUDIR}/src/google/protobuf/util/delimited_message_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/field_comparator.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/field_mask_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/datapiece.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/default_value_objectwriter.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/error_listener.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/field_mask_utility.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/json_escaping.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/json_objectwriter.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/json_stream_parser.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/object_writer.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/proto_writer.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/protostream_objectsource.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/protostream_objectwriter.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/type_info.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/type_info_test_helper.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/internal/utility.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/json_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/message_differencer.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/time_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/util/type_resolver_util.cc \ - $${PROTOBUDIR}/src/google/protobuf/wire_format.cc \ - $${PROTOBUDIR}/src/google/protobuf/wrappers.pb.cc diff --git a/host/trace_streamer/prebuilts/buildprotobuf/protobufbuild.gn b/host/trace_streamer/prebuilts/buildprotobuf/protobufbuild.gn new file mode 100644 index 0000000..235114d --- /dev/null +++ b/host/trace_streamer/prebuilts/buildprotobuf/protobufbuild.gn @@ -0,0 +1,346 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# 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") + +config("protobuf_config") { + include_dirs = [ "src" ] +} +protobuf_dir = "src/google/protobuf" +protobuf_lite_src = [ + "$protobuf_dir/any_lite.cc", + "$protobuf_dir/arena.cc", + "$protobuf_dir/extension_set.cc", + "$protobuf_dir/generated_enum_util.cc", + "$protobuf_dir/generated_message_table_driven_lite.cc", + "$protobuf_dir/generated_message_util.cc", + "$protobuf_dir/implicit_weak_message.cc", + "$protobuf_dir/io/coded_stream.cc", + "$protobuf_dir/io/io_win32.cc", + "$protobuf_dir/io/strtod.cc", + "$protobuf_dir/io/zero_copy_stream.cc", + "$protobuf_dir/io/zero_copy_stream_impl.cc", + "$protobuf_dir/io/zero_copy_stream_impl_lite.cc", + "$protobuf_dir/message_lite.cc", + "$protobuf_dir/parse_context.cc", + "$protobuf_dir/repeated_field.cc", + "$protobuf_dir/stubs/bytestream.cc", + "$protobuf_dir/stubs/common.cc", + "$protobuf_dir/stubs/int128.cc", + "$protobuf_dir/stubs/status.cc", + "$protobuf_dir/stubs/statusor.cc", + "$protobuf_dir/stubs/stringpiece.cc", + "$protobuf_dir/stubs/stringprintf.cc", + "$protobuf_dir/stubs/structurally_valid.cc", + "$protobuf_dir/stubs/strutil.cc", + "$protobuf_dir/stubs/time.cc", + "$protobuf_dir/wire_format_lite.cc", +] + +protobuf_src = [ + "$protobuf_dir/any.cc", + "$protobuf_dir/any.pb.cc", + "$protobuf_dir/api.pb.cc", + "$protobuf_dir/compiler/importer.cc", + "$protobuf_dir/compiler/parser.cc", + "$protobuf_dir/descriptor.cc", + "$protobuf_dir/descriptor.pb.cc", + "$protobuf_dir/descriptor_database.cc", + "$protobuf_dir/duration.pb.cc", + "$protobuf_dir/dynamic_message.cc", + "$protobuf_dir/empty.pb.cc", + "$protobuf_dir/extension_set_heavy.cc", + "$protobuf_dir/field_mask.pb.cc", + "$protobuf_dir/generated_message_reflection.cc", + "$protobuf_dir/generated_message_table_driven.cc", + "$protobuf_dir/io/gzip_stream.cc", + "$protobuf_dir/io/printer.cc", + "$protobuf_dir/io/tokenizer.cc", + "$protobuf_dir/map_field.cc", + "$protobuf_dir/message.cc", + "$protobuf_dir/reflection_ops.cc", + "$protobuf_dir/service.cc", + "$protobuf_dir/source_context.pb.cc", + "$protobuf_dir/struct.pb.cc", + "$protobuf_dir/stubs/substitute.cc", + "$protobuf_dir/text_format.cc", + "$protobuf_dir/timestamp.pb.cc", + "$protobuf_dir/type.pb.cc", + "$protobuf_dir/unknown_field_set.cc", + "$protobuf_dir/util/delimited_message_util.cc", + "$protobuf_dir/util/field_comparator.cc", + "$protobuf_dir/util/field_mask_util.cc", + "$protobuf_dir/util/internal/datapiece.cc", + "$protobuf_dir/util/internal/default_value_objectwriter.cc", + "$protobuf_dir/util/internal/error_listener.cc", + "$protobuf_dir/util/internal/field_mask_utility.cc", + "$protobuf_dir/util/internal/json_escaping.cc", + "$protobuf_dir/util/internal/json_objectwriter.cc", + "$protobuf_dir/util/internal/json_stream_parser.cc", + "$protobuf_dir/util/internal/object_writer.cc", + "$protobuf_dir/util/internal/proto_writer.cc", + "$protobuf_dir/util/internal/protostream_objectsource.cc", + "$protobuf_dir/util/internal/protostream_objectwriter.cc", + "$protobuf_dir/util/internal/type_info.cc", + "$protobuf_dir/util/internal/type_info_test_helper.cc", + "$protobuf_dir/util/internal/utility.cc", + "$protobuf_dir/util/json_util.cc", + "$protobuf_dir/util/message_differencer.cc", + "$protobuf_dir/util/time_util.cc", + "$protobuf_dir/util/type_resolver_util.cc", + "$protobuf_dir/wire_format.cc", + "$protobuf_dir/wrappers.pb.cc", +] +if (use_wasm) { + source_set("protobuf_lite") { + sources = protobuf_lite_src + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + + cflags_cc = [ "-Wno-sign-compare" ] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + "-std=c++17", + ] + + #configs = default_configs + + public_configs = [ ":protobuf_config" ] + } +} else { + source_set("protobuf_lite") { + sources = protobuf_lite_src + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + + cflags_cc = [ "-Wno-sign-compare" ] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + "-std=c++17", + ] + + # configs = default_configs + + public_configs = [ ":protobuf_config" ] + } +} +if (use_wasm) { + source_set("protobuf") { + sources = protobuf_src + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + cflags_cc = [ "-Wno-sign-compare" ] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + "-std=c++17", + ] + + deps = [ ":protobuf_lite" ] + + #configs = default_configs + + public_configs = [ ":protobuf_config" ] + } +} else { + source_set("protobuf") { + sources = protobuf_src + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + + #cflags_cc = [ + # "-Wno-sign-compare", + # "-ftrapv", + # "-fstack-protector-strong", + # "-fstack-protector-all", + # "-D_FORTIFY_SOURCE=2 -O2", + + #] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + "-ftrapv", + "-fstack-protector-strong", + "-fstack-protector-all", + "-D_FORTIFY_SOURCE=2 -O2", + "-std=c++17", + + # "-Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2" + ] + + ldflags = [ "-fstack-protector" ] + if (!is_macx) { + ldflags += [ + "-fuse-ld=gold", + "-Wl,--gc-sections", + "-Wl,-O1", + "-fpie", + "-pie", + ] + } + + if (!is_win) { + cflags += [ + "-fPIE", + "-fPIC", + ] + } + + deps = [ ":protobuf_lite" ] + + public_configs = [ ":protobuf_config" ] + } + source_set("protoc_lib") { + sources = [ + "$protobuf_dir/compiler/code_generator.cc", + "$protobuf_dir/compiler/command_line_interface.cc", + "$protobuf_dir/compiler/cpp/cpp_enum.cc", + "$protobuf_dir/compiler/cpp/cpp_enum_field.cc", + "$protobuf_dir/compiler/cpp/cpp_extension.cc", + "$protobuf_dir/compiler/cpp/cpp_field.cc", + "$protobuf_dir/compiler/cpp/cpp_file.cc", + "$protobuf_dir/compiler/cpp/cpp_generator.cc", + "$protobuf_dir/compiler/cpp/cpp_helpers.cc", + "$protobuf_dir/compiler/cpp/cpp_map_field.cc", + "$protobuf_dir/compiler/cpp/cpp_message.cc", + "$protobuf_dir/compiler/cpp/cpp_message_field.cc", + "$protobuf_dir/compiler/cpp/cpp_padding_optimizer.cc", + "$protobuf_dir/compiler/cpp/cpp_primitive_field.cc", + "$protobuf_dir/compiler/cpp/cpp_service.cc", + "$protobuf_dir/compiler/cpp/cpp_string_field.cc", + "$protobuf_dir/compiler/csharp/csharp_doc_comment.cc", + "$protobuf_dir/compiler/csharp/csharp_enum.cc", + "$protobuf_dir/compiler/csharp/csharp_enum_field.cc", + "$protobuf_dir/compiler/csharp/csharp_field_base.cc", + "$protobuf_dir/compiler/csharp/csharp_generator.cc", + "$protobuf_dir/compiler/csharp/csharp_helpers.cc", + "$protobuf_dir/compiler/csharp/csharp_map_field.cc", + "$protobuf_dir/compiler/csharp/csharp_message.cc", + "$protobuf_dir/compiler/csharp/csharp_message_field.cc", + "$protobuf_dir/compiler/csharp/csharp_primitive_field.cc", + "$protobuf_dir/compiler/csharp/csharp_reflection_class.cc", + "$protobuf_dir/compiler/csharp/csharp_repeated_enum_field.cc", + "$protobuf_dir/compiler/csharp/csharp_repeated_message_field.cc", + "$protobuf_dir/compiler/csharp/csharp_repeated_primitive_field.cc", + "$protobuf_dir/compiler/csharp/csharp_source_generator_base.cc", + "$protobuf_dir/compiler/csharp/csharp_wrapper_field.cc", + "$protobuf_dir/compiler/java/java_context.cc", + "$protobuf_dir/compiler/java/java_doc_comment.cc", + "$protobuf_dir/compiler/java/java_enum.cc", + "$protobuf_dir/compiler/java/java_enum_field.cc", + "$protobuf_dir/compiler/java/java_enum_field_lite.cc", + "$protobuf_dir/compiler/java/java_enum_lite.cc", + "$protobuf_dir/compiler/java/java_extension.cc", + "$protobuf_dir/compiler/java/java_extension_lite.cc", + "$protobuf_dir/compiler/java/java_field.cc", + "$protobuf_dir/compiler/java/java_file.cc", + "$protobuf_dir/compiler/java/java_generator.cc", + "$protobuf_dir/compiler/java/java_generator_factory.cc", + "$protobuf_dir/compiler/java/java_helpers.cc", + "$protobuf_dir/compiler/java/java_map_field.cc", + "$protobuf_dir/compiler/java/java_map_field_lite.cc", + "$protobuf_dir/compiler/java/java_message.cc", + "$protobuf_dir/compiler/java/java_message_builder.cc", + "$protobuf_dir/compiler/java/java_message_builder_lite.cc", + "$protobuf_dir/compiler/java/java_message_field.cc", + "$protobuf_dir/compiler/java/java_message_field_lite.cc", + "$protobuf_dir/compiler/java/java_message_lite.cc", + "$protobuf_dir/compiler/java/java_name_resolver.cc", + "$protobuf_dir/compiler/java/java_primitive_field.cc", + "$protobuf_dir/compiler/java/java_primitive_field_lite.cc", + "$protobuf_dir/compiler/java/java_service.cc", + "$protobuf_dir/compiler/java/java_shared_code_generator.cc", + "$protobuf_dir/compiler/java/java_string_field.cc", + "$protobuf_dir/compiler/java/java_string_field_lite.cc", + "$protobuf_dir/compiler/js/js_generator.cc", + "$protobuf_dir/compiler/js/well_known_types_embed.cc", + "$protobuf_dir/compiler/objectivec/objectivec_enum.cc", + "$protobuf_dir/compiler/objectivec/objectivec_enum_field.cc", + "$protobuf_dir/compiler/objectivec/objectivec_extension.cc", + "$protobuf_dir/compiler/objectivec/objectivec_field.cc", + "$protobuf_dir/compiler/objectivec/objectivec_file.cc", + "$protobuf_dir/compiler/objectivec/objectivec_generator.cc", + "$protobuf_dir/compiler/objectivec/objectivec_helpers.cc", + "$protobuf_dir/compiler/objectivec/objectivec_map_field.cc", + "$protobuf_dir/compiler/objectivec/objectivec_message.cc", + "$protobuf_dir/compiler/objectivec/objectivec_message_field.cc", + "$protobuf_dir/compiler/objectivec/objectivec_oneof.cc", + "$protobuf_dir/compiler/objectivec/objectivec_primitive_field.cc", + "$protobuf_dir/compiler/php/php_generator.cc", + "$protobuf_dir/compiler/plugin.cc", + "$protobuf_dir/compiler/plugin.pb.cc", + "$protobuf_dir/compiler/python/python_generator.cc", + "$protobuf_dir/compiler/ruby/ruby_generator.cc", + "$protobuf_dir/compiler/subprocess.cc", + "$protobuf_dir/compiler/zip_writer.cc", + ] + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + if (!use_wasm) { + configs = default_configs + } + cflags_cc = [ + "-Wno-sign-compare", + "-Wno-unused-function", + "-Wno-unused-private-field", + + # "-std=gnu++17", + ] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + "-Wno-unused-function", + "-std=c++17", + + # "-Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2" + ] + + deps = [ + ":protobuf", + ":protobuf_lite", + ] + + public_configs = [ ":protobuf_config" ] + } + executable("protoc") { + sources = [ "$protobuf_dir/compiler/main.cc" ] + include_dirs = [ + "$protobuf_dir/**/*.h", + "$protobuf_dir/**/*.inc", + "src", + ] + deps = [ ":protoc_lib" ] + cflags_cc = [ "-Wno-sign-compare" ] + cflags = [ + "-Wno-sign-compare", + "-D HAVE_PTHREAD", + ] + } +} diff --git a/host/trace_streamer/src/base/base.pri b/host/trace_streamer/prebuilts/buildsqlite/sqlite3build.gn similarity index 38% rename from host/trace_streamer/src/base/base.pri rename to host/trace_streamer/prebuilts/buildsqlite/sqlite3build.gn index e972a92..30fdd67 100644 --- a/host/trace_streamer/src/base/base.pri +++ b/host/trace_streamer/prebuilts/buildsqlite/sqlite3build.gn @@ -11,13 +11,38 @@ # See the License for the specific language governing permissions and # limitations under the License. -INCLUDEPATH +=$$PWD -HEADERS += \ - $$PWD/ts_common.h \ - $$PWD/double_map.h - -SOURCES += \ - $$PWD/codec_cov.cpp \ - $$PWD/file.cpp \ - $$PWD/parting_string.cpp \ - $$PWD/log.cpp +import("//build/ohos.gni") +config("sqlite_config") { + include_dirs = [ "include" ] + cflags = [ + "-Wno-shorten-64-to-32", + "-Wno-double-promotion", + "-Wno-disabled-macro-expansion", + "-Wno-float-equal", + "-Wno-cast-qual", + "-Wno-conversion", + "-Wno-cast-align", + "-Wno-unused-macros", + "-Wno-comma", + "-Wno-unreachable-code-break", + "-Wno-unreachable-code", + "-Wno-unreachable-code-return", + "-DSQLITE_THREADSAFE=1", + "-DQLITE_DEFAULT_MEMSTATUS=0", + "-DSQLITE_LIKE_DOESNT_MATCH_BLOBS", + "-DSQLITE_OMIT_DEPRECATED", + "-DSQLITE_OMIT_SHARED_CACHE", + "-DHAVE_USLEEP", + "-DHAVE_UTIME", + "-DSQLITE_BYTEORDER=1234", + "-DSQLITE_DEFAULT_AUTOVACUUM=0", + "-DSQLITE_DEFAULT_MMAP_SIZE=0", + "-DSQLITE_CORE", + "-DSQLITE_TEMP_STORE=3", + "-DSQLITE_OMIT_LOAD_EXTENSION", + ] +} +ohos_source_set("sqlite") { + sources = [ "src/sqlite3.c" ] + public_configs = [ ":sqlite_config" ] +} diff --git a/host/trace_streamer/prebuilts/protos/BUILD.gn b/host/trace_streamer/prebuilts/protos/BUILD.gn index 760af44..c91f3ff 100644 --- a/host/trace_streamer/prebuilts/protos/BUILD.gn +++ b/host/trace_streamer/prebuilts/protos/BUILD.gn @@ -12,15 +12,19 @@ # limitations under the License. import("//build/ohos.gni") +import("../../src/ts.gni") OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR = "//third_party/protobuf" proto_dir = "//third_party/protogen" services_dir = "$proto_dir/services" -ftrace_data_dir = "$proto_dir/types/plugins/ftrace_data" +ftrace_data_dir = "$proto_dir/types/plugins/ftrace_data/${kernel_version}" memory_data_dir = "$proto_dir/types/plugins/memory_data" hilog_data_dir = "$proto_dir/types/plugins/hilog_data" native_hook_dir = "$proto_dir/types/plugins/native_hook" hidump_data_dir = "$proto_dir/types/plugins/hidump_data" - +network_data_dir = "$proto_dir/types/plugins/network_data" +cpu_data_dir = "$proto_dir/types/plugins/cpu_data" +diskio_data_dir = "$proto_dir/types/plugins/diskio_data" +process_data_dir = "$proto_dir/types/plugins/process_data" config("ts_proto_include_config") { include_dirs = [ "$ftrace_data_dir", @@ -36,14 +40,19 @@ source_set("ts_proto_data_cpp") { "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite", ] cflags = [ - "-fPIC", "-ftrapv", - "-fPIE", "-D_FORTIFY_SOURCE=2 -O2", "-Wno-zero-length-array", - - # "-Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2" + "-std=c++17", ] + + if (!is_win) { + print("xxx") + cflags += [ + "-fPIE", + "-fPIC", + ] + } if (!use_wasm) { cflags += [ "-fstack-protector-strong", # @@ -71,6 +80,11 @@ source_set("ts_proto_data_cpp") { "$ftrace_data_dir/irq.pb.cc", "$ftrace_data_dir/kmem.pb.cc", "$ftrace_data_dir/net.pb.cc", + + # "$ftrace_data_dir/mmc.pb.cc", + # "$ftrace_data_dir/f2fs.pb.cc", + # "$ftrace_data_dir/gpu_mem.pb.cc", + # "$ftrace_data_dir/regulator.pb.cc", "$ftrace_data_dir/oom.pb.cc", "$ftrace_data_dir/pagemap.pb.cc", "$ftrace_data_dir/power.pb.cc", @@ -87,7 +101,6 @@ source_set("ts_proto_data_cpp") { "$ftrace_data_dir/vmscan.pb.cc", "$ftrace_data_dir/workqueue.pb.cc", "$ftrace_data_dir/writeback.pb.cc", - "$hidump_data_dir/hidump_plugin_config.pb.cc", "$hidump_data_dir/hidump_plugin_result.pb.cc", "$hilog_data_dir/hilog_plugin_result.pb.cc", "$memory_data_dir/memory_plugin_common.pb.cc", @@ -95,6 +108,10 @@ source_set("ts_proto_data_cpp") { "$memory_data_dir/memory_plugin_result.pb.cc", "$native_hook_dir/native_hook_config.pb.cc", "$native_hook_dir/native_hook_result.pb.cc", + "${cpu_data_dir}/cpu_plugin_result.pb.cc", + "${diskio_data_dir}/diskio_plugin_result.pb.cc", + "${network_data_dir}/network_plugin_result.pb.cc", + "${process_data_dir}/process_plugin_result.pb.cc", "${services_dir}/common_types.pb.cc", ] } diff --git a/host/trace_streamer/src/BUILD.gn b/host/trace_streamer/src/BUILD.gn index 3abb145..83345d6 100644 --- a/host/trace_streamer/src/BUILD.gn +++ b/host/trace_streamer/src/BUILD.gn @@ -40,14 +40,21 @@ ohos_source_set("lib") { "parser", "cfg", "parser/htrace_parser", + "parser/hiperf_parser", + "parser/hiperf_parser/hiperf/linux", + "parser/hiperf_parser/hiperf/include", "parser/htrace_parser/htrace_event_parser", "parser/htrace_parser/htrace_cpu_parser", "//third_party/sqlite/include", "${OHOS_PROTO_GEN}/types/plugins/memory_data", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data", + "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/${kernel_version}", "${OHOS_PROTO_GEN}/types/plugins/hilog_data", "${OHOS_PROTO_GEN}/types/plugins/native_hook", "${OHOS_PROTO_GEN}/types/plugins/hidump_data", + "${OHOS_PROTO_GEN}/types/plugins/network_data", + "${OHOS_PROTO_GEN}/types/plugins/cpu_data", + "${OHOS_PROTO_GEN}/types/plugins/diskio_data", + "${OHOS_PROTO_GEN}/types/plugins/process_data", "${OHOS_PROTO_GEN}", "//third_party/protobuf/src", ] @@ -72,6 +79,8 @@ ohos_source_set("trace_streamer_source") { "filter/irq_filter.h", "filter/measure_filter.cpp", "filter/measure_filter.h", + "filter/perf_data_filter.cpp", + "filter/perf_data_filter.h", "filter/process_filter.cpp", "filter/process_filter.h", "filter/slice_filter.cpp", @@ -106,21 +115,25 @@ ohos_source_set("trace_streamer_source") { "table/clock_event_filter_table.h", "table/cpu_measure_filter_table.cpp", "table/cpu_measure_filter_table.h", + "table/cpu_usage_info_table.cpp", + "table/cpu_usage_info_table.h", "table/data_dict_table.cpp", "table/data_dict_table.h", "table/data_type_table.cpp", "table/data_type_table.h", + "table/disk_io_table.cpp", + "table/disk_io_table.h", + "table/filter_constraints.cpp", "table/filter_table.cpp", "table/filter_table.h", - "table/heap_frame_table.cpp", - "table/heap_frame_table.h", - "table/heap_table.cpp", - "table/heap_table.h", "table/hidump_table.cpp", "table/hidump_table.h", + "table/index_map.cpp", "table/instants_table.cpp", "table/instants_table.h", "table/irq_table.cpp", + "table/live_process_table.cpp", + "table/live_process_table.h", "table/log_table.cpp", "table/log_table.h", "table/measure_filter_table.cpp", @@ -129,6 +142,22 @@ ohos_source_set("trace_streamer_source") { "table/measure_table.h", "table/meta_table.cpp", "table/meta_table.h", + "table/native_hook_frame_table.cpp", + "table/native_hook_frame_table.h", + "table/native_hook_table.cpp", + "table/native_hook_table.h", + "table/network_table.cpp", + "table/network_table.h", + "table/perf_call_chain_table.cpp", + "table/perf_call_chain_table.h", + "table/perf_files_table.cpp", + "table/perf_files_table.h", + "table/perf_report_table.cpp", + "table/perf_report_table.h", + "table/perf_sample_table.cpp", + "table/perf_sample_table.h", + "table/perf_thread_table.cpp", + "table/perf_thread_table.h", "table/process_filter_table.cpp", "table/process_filter_table.h", "table/process_measure_filter_table.cpp", @@ -183,25 +212,39 @@ ohos_source_set("trace_streamer_source") { "parser/htrace_parser", "parser/htrace_parser/htrace_event_parser", "parser/htrace_parser/htrace_cpu_parser", + "parser/hiperf_parser", + "parser/hiperf_parser/hiperf/linux", + "parser/hiperf_parser/hiperf/kernel", + "parser/hiperf_parser/hiperf/include", + "../prebuilts/emsdk/emsdk/emscripten/system/include", "//third_party/sqlite/include", "${OHOS_PROTO_GEN}/types/plugins/memory_data", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data", + "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/${kernel_version}", "${OHOS_PROTO_GEN}/types/plugins/hilog_data", "${OHOS_PROTO_GEN}/types/plugins/native_hook", "${OHOS_PROTO_GEN}/types/plugins/hidump_data", + "${OHOS_PROTO_GEN}/types/plugins/network_data", + "${OHOS_PROTO_GEN}/types/plugins/cpu_data", + "${OHOS_PROTO_GEN}/types/plugins/diskio_data", + "${OHOS_PROTO_GEN}/types/plugins/process_data", "${OHOS_PROTO_GEN}", "//third_party/protobuf/src", + "//third_party/perf_include", ] deps = [ "base:base", "ext:sqliteext", "include:ibase", + "parser/hiperf_parser:hiperf_parser", "parser/htrace_parser:htrace_parser", "//third_party/sqlite:sqlite", ] - if (use_wasm) { - sources += [ "rpc/wasm_func.cpp" ] + if (use_wasm || enable_ts_utest) { + sources += [ + "rpc/wasm_func.cpp", + "rpc/wasm_func.h", + ] } if (enable_ts_utest && !use_wasm) { cflags = [ @@ -222,7 +265,9 @@ if (use_wasm) { deps = [ ":lib" ] } } else { - executable("trace_streamer") { - deps = [ ":lib" ] + if (!is_test && !is_fuzz) { + executable("trace_streamer") { + deps = [ ":lib" ] + } } } diff --git a/host/trace_streamer/src/base/BUILD.gn b/host/trace_streamer/src/base/BUILD.gn index 110bed4..3c151a7 100644 --- a/host/trace_streamer/src/base/BUILD.gn +++ b/host/trace_streamer/src/base/BUILD.gn @@ -21,7 +21,9 @@ ohos_source_set("base") { "codec_cov.cpp", "file.cpp", "log.cpp", + "meta.cpp", "parting_string.cpp", + "string_help.cpp", ] if (enable_ts_utest && !use_wasm) { cflags = [ diff --git a/host/trace_streamer/src/base/log.cpp b/host/trace_streamer/src/base/log.cpp index 7a751c8..7d167a9 100644 --- a/host/trace_streamer/src/base/log.cpp +++ b/host/trace_streamer/src/base/log.cpp @@ -14,9 +14,4 @@ */ #include "log.h" - -// namespace SysTuning { -// namespace base { bool g_cleanMode = false; -// } // namespace base -// } // namespace SysTuning diff --git a/host/trace_streamer/src/base/meta.cpp b/host/trace_streamer/src/base/meta.cpp new file mode 100644 index 0000000..10b1f57 --- /dev/null +++ b/host/trace_streamer/src/base/meta.cpp @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "meta.h" +size_t g_loadSize = 0; +std::string TRACE_STREAM_VERSION = "2.5.115"; // version +std::string TRACE_STREAM_PUBLISHVERSION = "2022/6/14"; // publish datetime diff --git a/host/trace_streamer/src/base/meta.h b/host/trace_streamer/src/base/meta.h new file mode 100644 index 0000000..a755855 --- /dev/null +++ b/host/trace_streamer/src/base/meta.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 META_H +#define META_H +#include +#include +extern size_t g_loadSize; +extern std::string TRACE_STREAM_VERSION; // version +extern std::string TRACE_STREAM_PUBLISHVERSION; // publish datetime +#endif diff --git a/host/trace_streamer/src/base/string_help.cpp b/host/trace_streamer/src/base/string_help.cpp new file mode 100644 index 0000000..0edb040 --- /dev/null +++ b/host/trace_streamer/src/base/string_help.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "string_help.h" +#include +#include +#include +#include +int memcpy_s(void* dest, uint32_t destSize, const void* src, size_t srcSize) +{ + if (srcSize > destSize || src == nullptr || dest == nullptr) { + return -1; + } else { + if (!memcpy(dest, src, srcSize)) { + printf("memcpy fail\n"); + return -1; + } + } + return 0; +} +void* memset_s(void* dest, size_t destSize, int ch, size_t n) +{ + return memset(dest, 0, n); +} + +int snprintf_s(char* strDest, size_t destMax, size_t count, const char* format, ...) +{ + int ret; + va_list ap; + __builtin_va_start(ap, format); + ret = sprintf(strDest, format, ap); + __builtin_va_end(ap); + return ret; +} + +int strncpy_s(char* strDest, size_t destMax, const char* strSrc, size_t count) +{ + return memcpy_s(strDest, destMax, strDest, count); +} + +int sscanf_s(const char* buffer, const char* format, ...) +{ + va_list ap; + __builtin_va_start(ap, format); + int ret = scanf(buffer, format, ap); + __builtin_va_end(ap); + return ret; +} +int sprintf_s(char* strDest, size_t destMax, const char* format, ...) +{ + va_list ap; + __builtin_va_start(ap, format); + int ret = sprintf(strDest, format, ap); + __builtin_va_end(ap); + return ret; +} diff --git a/host/trace_streamer/src/base/string_help.h b/host/trace_streamer/src/base/string_help.h new file mode 100644 index 0000000..6415d31 --- /dev/null +++ b/host/trace_streamer/src/base/string_help.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 SRC_TRACE_BASE_STRINGHELP_H +#define SRC_TRACE_BASE_STRINGHELP_H + +#include +#include +int memcpy_s(void* dest, uint32_t destSize, const void* src, size_t srcSize); +void* memset_s(void* dest, size_t destSize, int ch, size_t n); +int snprintf_s(char* strDest, size_t destMax, size_t count, const char* format, ...); +int strncpy_s(char* strDest, size_t destMax, const char* strSrc, size_t count); +int sscanf_s(const char* buffer, const char* format, ...); +int sprintf_s(char* strDest, size_t destMax, const char* format, ...); +#endif // SRC_TRACE_BASE_STRINGHELP_H diff --git a/host/trace_streamer/src/base/ts_common.h b/host/trace_streamer/src/base/ts_common.h index 57ada72..60b2988 100644 --- a/host/trace_streamer/src/base/ts_common.h +++ b/host/trace_streamer/src/base/ts_common.h @@ -32,6 +32,8 @@ const size_t MAX_SIZE_T = std::numeric_limits::max(); const uint32_t INVALID_ID = std::numeric_limits::max(); const uint64_t SEC_TO_NS = 1000 * 1000 * 1000; const int STR_DEFAULT_LEN = -1; +const auto INVALID_CPU = INVALID_UINT64; +const auto INVALID_TIME = INVALID_UINT64; enum BuiltinClocks { TS_CLOCK_UNKNOW = 0, TS_CLOCK_BOOTTIME = 1, @@ -99,11 +101,12 @@ enum SchedWakeType { SCHED_WAKEUP = 1, // sched_wakeup }; using DataIndex = uint64_t; -using TableRowId = uint64_t; +using TableRowId = uint32_t; using InternalPid = uint32_t; using InternalTid = uint32_t; using InternalTime = uint64_t; using FilterId = uint32_t; +using InternalCpu = uint64_t; // how many cpus? could change to int8_t? enum BaseDataType { BASE_DATA_TYPE_INT, diff --git a/host/trace_streamer/src/cfg/cfg.pri b/host/trace_streamer/src/cfg/cfg.pri deleted file mode 100644 index 7833002..0000000 --- a/host/trace_streamer/src/cfg/cfg.pri +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. - -INCLUDEPATH +=$$PWD -HEADERS += \ - $$PWD/trace_streamer_config.h - -SOURCES += \ - $$PWD/trace_streamer_config.cpp diff --git a/host/trace_streamer/src/cfg/trace_streamer_config.cpp b/host/trace_streamer/src/cfg/trace_streamer_config.cpp index e72cf60..c82a42c 100644 --- a/host/trace_streamer/src/cfg/trace_streamer_config.cpp +++ b/host/trace_streamer/src/cfg/trace_streamer_config.cpp @@ -136,6 +136,11 @@ void TraceStreamerConfig::InitEventNameMap() {TRACE_MEMORY, TRACE_ACTION_MEMORY}, {TRACE_SYS_MEMORY, TRACE_ACTION_SYS_MEMORY}, {TRACE_SYS_VIRTUAL_MEMORY, TRACE_ACTION_SYS_VIRTUAL_MEMORY}, + {TRACE_DISKIO, TRACE_ACTION_DISKIO}, + {TRACE_PROCESS, TRACE_ACTION_PROCESS}, + {TRACE_CPU_USAGE, TRACE_ACTION_CPU_USAGE}, + {TRACE_NETWORK, TRACE_ACTION_NETWORK}, + {TRACE_PERF, TRACE_ACTION_PERF}, {TRACE_EVENT_SIGNAL_GENERATE, TRACE_ACTION_SIGNAL_GENERATE}, {TRACE_EVENT_SIGNAL_DELIVER, TRACE_ACTION_SIGNAL_DELIVER}, {TRACE_EVENT_BLOCK_BIO_BACKMERGE, TRACE_ACTION_BLOCK_BIO_BACKMERGE}, @@ -155,46 +160,47 @@ void TraceStreamerConfig::InitEventNameMap() {TRACE_HILOG, TRACE_ACTION_HILOG}, {TRACE_HIDUMP_FPS, TRACE_ACTION_HIDUMP_FPS}, {TRACE_NATIVE_HOOK_MALLOC, TRACE_ACTION_NATIVE_HOOK_MALLOC}, - {TRACE_NATIVE_HOOK_FREE, TRACE_ACTION_NATIVE_HOOK_FREE}}; + {TRACE_NATIVE_HOOK_FREE, TRACE_ACTION_NATIVE_HOOK_FREE}, + {TRACE_NATIVE_HOOK_MMAP, TRACE_ACTION_NATIVE_HOOK_MMAP}, + {TRACE_NATIVE_HOOK_MUNMAP, TRACE_ACTION_NATIVE_HOOK_MUNMAP}}; } void TraceStreamerConfig::InitSysMemMap() { - sysMemNameMap_ = { - {SysMeminfoType::PMEM_UNSPECIFIED, SYS_MEMINFO_UNSPECIFIED_DESC}, - {SysMeminfoType::PMEM_MEM_TOTAL, SYS_MEMINFO_MEM_TOTAL_DESC}, - {SysMeminfoType::PMEM_MEM_FREE, SYS_MEMINFO_MEM_FREE_DESC}, - {SysMeminfoType::PMEM_MEM_AVAILABLE, SYS_MEMINFO_MEM_AVAILABLE_DESC}, - {SysMeminfoType::PMEM_BUFFERS, SYS_MEMINFO_BUFFERS_DESC}, - {SysMeminfoType::PMEM_CACHED, SYS_MEMINFO_CACHED_DESC}, - {SysMeminfoType::PMEM_SWAP_CACHED, SYS_MEMINFO_SWAP_CACHED_DESC}, - {SysMeminfoType::PMEM_ACTIVE, SYS_MEMINFO_ACTIVE_DESC}, - {SysMeminfoType::PMEM_INACTIVE, SYS_MEMINFO_INACTIVE_DESC}, - {SysMeminfoType::PMEM_ACTIVE_ANON, SYS_MEMINFO_ACTIVE_ANON_DESC}, - {SysMeminfoType::PMEM_INACTIVE_ANON, SYS_MEMINFO_INACTIVE_ANON_DESC}, - {SysMeminfoType::PMEM_ACTIVE_FILE, SYS_MEMINFO_ACTIVE_FILE_DESC}, - {SysMeminfoType::PMEM_INACTIVE_FILE, SYS_MEMINFO_INACTIVE_FILE_DESC}, - {SysMeminfoType::PMEM_UNEVICTABLE, SYS_MEMINFO_UNEVICTABLE_DESC}, - {SysMeminfoType::PMEM_MLOCKED, SYS_MEMINFO_MLOCKED_DESC}, - {SysMeminfoType::PMEM_SWAP_TOTAL, SYS_MEMINFO_SWAP_TOTAL_DESC}, - {SysMeminfoType::PMEM_SWAP_FREE, SYS_MEMINFO_SWAP_FREE_DESC}, - {SysMeminfoType::PMEM_DIRTY, SYS_MEMINFO_DIRTY_DESC}, - {SysMeminfoType::PMEM_WRITEBACK, SYS_MEMINFO_WRITEBACK_DESC}, - {SysMeminfoType::PMEM_ANON_PAGES, SYS_MEMINFO_ANON_PAGES_DESC}, - {SysMeminfoType::PMEM_MAPPED, SYS_MEMINFO_MAPPED_DESC}, - {SysMeminfoType::PMEM_SHMEM, SYS_MEMINFO_SHMEM_DESC}, - {SysMeminfoType::PMEM_SLAB, SYS_MEMINFO_SLAB_DESC}, - {SysMeminfoType::PMEM_SLAB_RECLAIMABLE, SYS_MEMINFO_SLAB_RECLAIMABLE_DESC}, - {SysMeminfoType::PMEM_SLAB_UNRECLAIMABLE, SYS_MEMINFO_SLAB_UNRECLAIMABLE_DESC}, - {SysMeminfoType::PMEM_KERNEL_STACK, SYS_MEMINFO_KERNEL_STACK_DESC}, - {SysMeminfoType::PMEM_PAGE_TABLES, SYS_MEMINFO_PAGE_TABLES_DESC}, - {SysMeminfoType::PMEM_COMMIT_LIMIT, SYS_MEMINFO_COMMIT_LIMIT_DESC}, - {SysMeminfoType::PMEM_COMMITED_AS, SYS_MEMINFO_COMMITED_AS_DESC}, - {SysMeminfoType::PMEM_VMALLOC_TOTAL, SYS_MEMINFO_VMALLOC_TOTAL_DESC}, - {SysMeminfoType::PMEM_VMALLOC_USED, SYS_MEMINFO_VMALLOC_USED_DESC}, - {SysMeminfoType::PMEM_VMALLOC_CHUNK, SYS_MEMINFO_VMALLOC_CHUNK_DESC}, - {SysMeminfoType::PMEM_CMA_TOTAL, SYS_MEMINFO_CMA_TOTAL_DESC}, - {SysMeminfoType::PMEM_CMA_FREE, SYS_MEMINFO_CMA_FREE_DESC}, - }; + sysMemNameMap_ = {{SysMeminfoType::PMEM_UNSPECIFIED, SYS_MEMINFO_UNSPECIFIED_DESC}, + {SysMeminfoType::PMEM_MEM_TOTAL, SYS_MEMINFO_MEM_TOTAL_DESC}, + {SysMeminfoType::PMEM_MEM_FREE, SYS_MEMINFO_MEM_FREE_DESC}, + {SysMeminfoType::PMEM_MEM_AVAILABLE, SYS_MEMINFO_MEM_AVAILABLE_DESC}, + {SysMeminfoType::PMEM_BUFFERS, SYS_MEMINFO_BUFFERS_DESC}, + {SysMeminfoType::PMEM_CACHED, SYS_MEMINFO_CACHED_DESC}, + {SysMeminfoType::PMEM_SWAP_CACHED, SYS_MEMINFO_SWAP_CACHED_DESC}, + {SysMeminfoType::PMEM_ACTIVE, SYS_MEMINFO_ACTIVE_DESC}, + {SysMeminfoType::PMEM_INACTIVE, SYS_MEMINFO_INACTIVE_DESC}, + {SysMeminfoType::PMEM_ACTIVE_ANON, SYS_MEMINFO_ACTIVE_ANON_DESC}, + {SysMeminfoType::PMEM_INACTIVE_ANON, SYS_MEMINFO_INACTIVE_ANON_DESC}, + {SysMeminfoType::PMEM_ACTIVE_FILE, SYS_MEMINFO_ACTIVE_FILE_DESC}, + {SysMeminfoType::PMEM_INACTIVE_FILE, SYS_MEMINFO_INACTIVE_FILE_DESC}, + {SysMeminfoType::PMEM_UNEVICTABLE, SYS_MEMINFO_UNEVICTABLE_DESC}, + {SysMeminfoType::PMEM_MLOCKED, SYS_MEMINFO_MLOCKED_DESC}, + {SysMeminfoType::PMEM_SWAP_TOTAL, SYS_MEMINFO_SWAP_TOTAL_DESC}, + {SysMeminfoType::PMEM_SWAP_FREE, SYS_MEMINFO_SWAP_FREE_DESC}, + {SysMeminfoType::PMEM_DIRTY, SYS_MEMINFO_DIRTY_DESC}, + {SysMeminfoType::PMEM_WRITEBACK, SYS_MEMINFO_WRITEBACK_DESC}, + {SysMeminfoType::PMEM_ANON_PAGES, SYS_MEMINFO_ANON_PAGES_DESC}, + {SysMeminfoType::PMEM_MAPPED, SYS_MEMINFO_MAPPED_DESC}, + {SysMeminfoType::PMEM_SHMEM, SYS_MEMINFO_SHMEM_DESC}, + {SysMeminfoType::PMEM_SLAB, SYS_MEMINFO_SLAB_DESC}, + {SysMeminfoType::PMEM_SLAB_RECLAIMABLE, SYS_MEMINFO_SLAB_RECLAIMABLE_DESC}, + {SysMeminfoType::PMEM_SLAB_UNRECLAIMABLE, SYS_MEMINFO_SLAB_UNRECLAIMABLE_DESC}, + {SysMeminfoType::PMEM_KERNEL_STACK, SYS_MEMINFO_KERNEL_STACK_DESC}, + {SysMeminfoType::PMEM_PAGE_TABLES, SYS_MEMINFO_PAGE_TABLES_DESC}, + {SysMeminfoType::PMEM_COMMIT_LIMIT, SYS_MEMINFO_COMMIT_LIMIT_DESC}, + {SysMeminfoType::PMEM_COMMITED_AS, SYS_MEMINFO_COMMITED_AS_DESC}, + {SysMeminfoType::PMEM_VMALLOC_TOTAL, SYS_MEMINFO_VMALLOC_TOTAL_DESC}, + {SysMeminfoType::PMEM_VMALLOC_USED, SYS_MEMINFO_VMALLOC_USED_DESC}, + {SysMeminfoType::PMEM_VMALLOC_CHUNK, SYS_MEMINFO_VMALLOC_CHUNK_DESC}, + {SysMeminfoType::PMEM_CMA_TOTAL, SYS_MEMINFO_CMA_TOTAL_DESC}, + {SysMeminfoType::PMEM_CMA_FREE, SYS_MEMINFO_CMA_FREE_DESC}, + {SysMeminfoType::PMEM_KERNEL_RECLAIMABLE, SYS_MEMINFO_KERNEL_RECLAIMABLE_DESC}}; } void TraceStreamerConfig::InitSysVmemMap() @@ -803,6 +809,26 @@ void TraceStreamerConfig::InitSecurityMap() {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, }, }, + { + TRACE_NATIVE_HOOK_MMAP, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, + { + TRACE_NATIVE_HOOK_MUNMAP, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, { TRACE_SYS_MEMORY, { @@ -823,6 +849,56 @@ void TraceStreamerConfig::InitSecurityMap() {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, }, }, + { + TRACE_DISKIO, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, + { + TRACE_PROCESS, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, + { + TRACE_CPU_USAGE, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, + { + TRACE_NETWORK, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, + { + TRACE_PERF, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, { TRACE_EVENT_SIGNAL_GENERATE, { diff --git a/host/trace_streamer/src/cfg/trace_streamer_config.h b/host/trace_streamer/src/cfg/trace_streamer_config.h index 3e71a1a..319fec9 100644 --- a/host/trace_streamer/src/cfg/trace_streamer_config.h +++ b/host/trace_streamer/src/cfg/trace_streamer_config.h @@ -70,8 +70,15 @@ enum SupportedTraceEventType { TRACE_HIDUMP_FPS, TRACE_NATIVE_HOOK_MALLOC, TRACE_NATIVE_HOOK_FREE, + TRACE_NATIVE_HOOK_MMAP, + TRACE_NATIVE_HOOK_MUNMAP, TRACE_SYS_MEMORY, TRACE_SYS_VIRTUAL_MEMORY, + TRACE_DISKIO, + TRACE_PROCESS, + TRACE_CPU_USAGE, + TRACE_NETWORK, + TRACE_PERF, TRACE_EVENT_SIGNAL_GENERATE, TRACE_EVENT_SIGNAL_DELIVER, TRACE_EVENT_BLOCK_BIO_BACKMERGE, @@ -211,6 +218,8 @@ private: const std::string TRACE_ACTION_HIDUMP_FPS = "hidump_fps"; const std::string TRACE_ACTION_NATIVE_HOOK_MALLOC = "native_hook_malloc"; const std::string TRACE_ACTION_NATIVE_HOOK_FREE = "native_hook_free"; + const std::string TRACE_ACTION_NATIVE_HOOK_MMAP = "native_hook_mmap"; + const std::string TRACE_ACTION_NATIVE_HOOK_MUNMAP = "native_hook_munmap"; const std::string TRACE_ACTION_SIGNAL_GENERATE = "signal_generate"; const std::string TRACE_ACTION_SIGNAL_DELIVER = "signal_deliver"; const std::string TRACE_ACTION_BLOCK_BIO_BACKMERGE = "trace_block_bio_backmerge"; @@ -229,6 +238,11 @@ private: const std::string TRACE_ACTION_SYS_MEMORY = "sys_memory"; const std::string TRACE_ACTION_SYS_VIRTUAL_MEMORY = "sys_virtual_memory"; + const std::string TRACE_ACTION_DISKIO = "trace_diskio"; + const std::string TRACE_ACTION_PROCESS = "trace_process"; + const std::string TRACE_ACTION_CPU_USAGE = "trace_cpu_usage"; + const std::string TRACE_ACTION_NETWORK = "trace_network"; + const std::string TRACE_ACTION_PERF = "trace_perf"; const std::string TRACE_ACTION_OTHER = "other"; const std::string MEM_INFO_VM_SIZE_DESC = "mem.vm.size"; @@ -276,6 +290,7 @@ private: const std::string SYS_MEMINFO_VMALLOC_CHUNK_DESC = "sys.mem.vmalloc.chunk"; const std::string SYS_MEMINFO_CMA_TOTAL_DESC = "sys.mem.cma.total"; const std::string SYS_MEMINFO_CMA_FREE_DESC = "sys.mem.cma.free"; + const std::string SYS_MEMINFO_KERNEL_RECLAIMABLE_DESC = "sys.mem.kernel.reclaimable"; const std::string SYS_VMEMINFO_UNSPECIFIED_DESC = "sys.virtual.mem.unspecified"; const std::string SYS_VMEMINFO_NR_FREE_PAGES_DESC = "sys.virtual.mem.nr.free.pages"; const std::string SYS_VMEMINFO_NR_ALLOC_BATCH_DESC = "sys.virtual.mem.nr.alloc.batch"; diff --git a/host/trace_streamer/src/ext/sqlite_ext.pri b/host/trace_streamer/src/ext/sqlite_ext.pri deleted file mode 100644 index 6d1a82c..0000000 --- a/host/trace_streamer/src/ext/sqlite_ext.pri +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. -SOURCES += $$PWD/sqlite_ext_funcs.cpp -HEADERS += $$PWD/sqlite_ext_funcs.h -INCLUDEPATH += $$PWD/../../third_party/sqlite/include, - $$PWD/../include \ No newline at end of file diff --git a/host/trace_streamer/src/filter/binder_filter.cpp b/host/trace_streamer/src/filter/binder_filter.cpp index b13ad8e..83f3fb5 100644 --- a/host/trace_streamer/src/filter/binder_filter.cpp +++ b/host/trace_streamer/src/filter/binder_filter.cpp @@ -51,22 +51,6 @@ std::string BinderFilter::GetBinderFlagsDesc(uint32_t flag) } return str; } -void BinderFilter::MaybeDealEvent() -{ - if (tsBinderEventQueue_.size() > MAX_CACHE_SIZE) { - DealEvent(tsBinderEventQueue_.begin()->second.get()); - tsBinderEventQueue_.erase(tsBinderEventQueue_.begin()); - } -} - -void BinderFilter::FinishBinderEvent() -{ - for (auto it = tsBinderEventQueue_.begin(); it != tsBinderEventQueue_.end(); it++) { - DealEvent(it->second.get()); - } - tsBinderEventQueue_.clear(); -} - void BinderFilter::SendTraction(int64_t ts, uint32_t tid, uint64_t transactionId, @@ -76,108 +60,6 @@ void BinderFilter::SendTraction(int64_t ts, bool isReply, int32_t flags, int32_t code) -{ - auto sendTractionEvent = std::make_unique(ts, tid, transactionId, destNode, - destTgid, destTid, isReply, flags, code); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_SEND; - binderEvent->senderBinderEvent_ = std::move(sendTractionEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::ReceiveTraction(int64_t ts, uint32_t pid, uint64_t transactionId) -{ - auto receiveTractionEvent = std::make_unique(ts, pid, transactionId); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_RECIVED; - binderEvent->receivedBinderEvent_ = std::move(receiveTractionEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, - std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::TransactionAllocBuf(int64_t ts, uint32_t pid, uint64_t dataSize, uint64_t offsetsSize) -{ - auto tractionAllocBufEvent = std::make_unique(ts, pid, dataSize, offsetsSize); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_ALLOC_BUF; - binderEvent->binderAllocBufEvent_ = std::move(tractionAllocBufEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, - std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::TractionLock(int64_t ts, uint32_t pid, const std::string& tag) -{ - auto tractionLockEvent = std::make_unique(ts, pid, tag); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_LOCK; - binderEvent->binderLockEvent_ = std::move(tractionLockEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, - std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::TractionLocked(int64_t ts, uint32_t pid, const std::string& tag) -{ - auto tractionLockedEvent = std::make_unique(ts, pid, tag); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_LOCKED; - binderEvent->binderLockedEvent_ = std::move(tractionLockedEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, - std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::TractionUnlock(int64_t ts, uint32_t pid, const std::string& tag) -{ - auto tractionUnlockEvent = std::make_unique(ts, pid, tag); - auto binderEvent = std::make_unique(); - binderEvent->type_ = TS_EVENT_BINDER_UNLOCK; - binderEvent->binderUnlockEvent_ = std::move(tractionUnlockEvent); - tsBinderEventQueue_.insert(std::make_pair(ts, - std::move(binderEvent))); - MaybeDealEvent(); -} -void BinderFilter::DealEvent(const TSBinderEvent* event) -{ - switch (static_cast(event->type_)) { - case TS_EVENT_BINDER_SEND: - ExecSendTraction(event->senderBinderEvent_->ts_, event->senderBinderEvent_->tid_, - event->senderBinderEvent_->transactionId_, event->senderBinderEvent_->destNode_, - event->senderBinderEvent_->destTgid_, event->senderBinderEvent_->destTid_, - event->senderBinderEvent_->isReply_, event->senderBinderEvent_->flags_, - event->senderBinderEvent_->code_); - break; - case TS_EVENT_BINDER_RECIVED: - ExecReceiveTraction(event->receivedBinderEvent_->ts_, event->receivedBinderEvent_->pid_, - event->receivedBinderEvent_->transactionId_); - break; - case TS_EVENT_BINDER_ALLOC_BUF: - ExecTransactionAllocBuf(event->binderAllocBufEvent_->ts_, event->binderAllocBufEvent_->pid_, - event->binderAllocBufEvent_->dataSize_, event->binderAllocBufEvent_->offsetsSize_); - break; - case TS_EVENT_BINDER_LOCK: - ExecTractionLock(event->binderLockEvent_->ts_, event->binderLockEvent_->pid_, - event->binderLockEvent_->tag_); - break; - case TS_EVENT_BINDER_LOCKED: - ExecTractionLocked(event->binderLockedEvent_->ts_, event->binderLockedEvent_->pid_, - event->binderLockedEvent_->tag_); - break; - case TS_EVENT_BINDER_UNLOCK: - ExecTractionUnlock(event->binderUnlockEvent_->ts_, event->binderUnlockEvent_->pid_, - event->binderUnlockEvent_->tag_); - break; - default: - break; - } -} -void BinderFilter::ExecSendTraction(int64_t ts, - uint32_t tid, - uint64_t transactionId, - int32_t destNode, - int32_t destTgid, - int32_t destTid, - bool isReply, - int32_t flags, - int32_t code) { auto flagsStr = traceDataCache_->GetDataIndex("0x" + base::number(flags, base::INTEGER_RADIX_TYPE_HEX) + GetBinderFlagsDesc(flags)); @@ -209,12 +91,14 @@ void BinderFilter::ExecSendTraction(int64_t ts, transWaitingRcv_[transactionId] = tid; } else { // transaction not need reply + // tid calling id + // a binder event only care the transactionId and the callint tid streamFilters_->sliceFilter_->BeginAsyncBinder(ts, tid, binderCatalogId_, transAsyncId_, argsSend); transNoNeedReply_[transactionId] = argsSend; } } } -void BinderFilter::ExecReceiveTraction(int64_t ts, uint32_t pid, uint64_t transactionId) +void BinderFilter::ReceiveTraction(int64_t ts, uint32_t pid, uint64_t transactionId) { InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(ts, pid); const auto threadName = traceDataCache_->GetConstThreadData(internalTid).nameIndex_; @@ -248,15 +132,16 @@ void BinderFilter::ExecReceiveTraction(int64_t ts, uint32_t pid, uint64_t transa return; } // the code below can be hard to understand, may be a EndBinder will be better - // this problem cna be test after the IDE is finished + // this problem can be test after the IDE is finished if (transNoNeedReply_.count(transactionId)) { auto args = transNoNeedReply_[transactionId]; streamFilters_->sliceFilter_->BeginAsyncBinder(ts, pid, binderCatalogId_, asyncRcvId_, args); + // maybe you can use the flowing code: streamFilters_->sliceFilter_->EndBinder(ts, pid); transNoNeedReply_.erase(transactionId); return; } } -void BinderFilter::ExecTransactionAllocBuf(int64_t ts, uint32_t pid, uint64_t dataSize, uint64_t offsetsSize) +void BinderFilter::TransactionAllocBuf(int64_t ts, uint32_t pid, uint64_t dataSize, uint64_t offsetsSize) { ArgsSet args; args.AppendArg(dataSizeId_, BASE_DATA_TYPE_INT, dataSize); @@ -264,12 +149,12 @@ void BinderFilter::ExecTransactionAllocBuf(int64_t ts, uint32_t pid, uint64_t da streamFilters_->sliceFilter_->AddArgs(pid, binderCatalogId_, transSliceId_, args); UNUSED(ts); } -void BinderFilter::ExecTractionLock(int64_t ts, uint32_t pid, const std::string& tag) +void BinderFilter::TractionLock(int64_t ts, uint32_t pid, const std::string& tag) { lastEventTs_[pid] = ts; streamFilters_->sliceFilter_->BeginBinder(ts, pid, binderCatalogId_, lockTryId_); } -void BinderFilter::ExecTractionLocked(int64_t ts, uint32_t pid, const std::string& tag) +void BinderFilter::TractionLocked(int64_t ts, uint32_t pid, const std::string& tag) { if (!lastEventTs_.count(pid)) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_LOCKED, STAT_EVENT_NOTMATCH); @@ -280,7 +165,7 @@ void BinderFilter::ExecTractionLocked(int64_t ts, uint32_t pid, const std::strin lastEventTs_.erase(pid); lastEventTs_[pid] = ts; } -void BinderFilter::ExecTractionUnlock(int64_t ts, uint32_t pid, const std::string& tag) +void BinderFilter::TractionUnlock(int64_t ts, uint32_t pid, const std::string& tag) { if (!lastEventTs_.count(pid)) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_UNLOCK, STAT_EVENT_NOTMATCH); diff --git a/host/trace_streamer/src/filter/binder_filter.h b/host/trace_streamer/src/filter/binder_filter.h index 1833384..ccf7963 100644 --- a/host/trace_streamer/src/filter/binder_filter.h +++ b/host/trace_streamer/src/filter/binder_filter.h @@ -45,113 +45,8 @@ public: void TractionLock(int64_t ts, uint32_t pid, const std::string& tag); void TractionLocked(int64_t ts, uint32_t pid, const std::string& tag); void TractionUnlock(int64_t ts, uint32_t pid, const std::string& tag); - void FinishBinderEvent(); private: - void MaybeDealEvent(); - - class TSSendTractionEvent { - public: - TSSendTractionEvent(int64_t ts, - uint32_t tid, - uint64_t transactionId, - int32_t destNode, - int32_t destTgid, - int32_t destTid, - bool isReply, - int32_t flags, - int32_t code) - : ts_(ts), - tid_(tid), - transactionId_(transactionId), - destNode_(destNode), - destTgid_(destTgid), - destTid_(destTid), - isReply_(isReply), - flags_(flags), - code_(code) - { - } - ~TSSendTractionEvent() {} - int64_t ts_; - uint32_t tid_; - uint64_t transactionId_; - int32_t destNode_; - int32_t destTgid_; - int32_t destTid_; - bool isReply_; - int32_t flags_; - int32_t code_; - }; - class TSReceiveTractionEvent { - public: - TSReceiveTractionEvent(int64_t ts, uint32_t pid, uint64_t transactionId) - : ts_(ts), pid_(pid), transactionId_(transactionId) - { - } - ~TSReceiveTractionEvent() {} - uint64_t ts_; - uint32_t pid_; - uint64_t transactionId_; - }; - class TSTractionLockEvent { - public: - TSTractionLockEvent(int64_t ts, uint32_t pid, const std::string& tag) : ts_(ts), pid_(pid), tag_(tag) {} - ~TSTractionLockEvent() {} - uint64_t ts_; - uint32_t pid_; - const std::string tag_; - }; - class TSTransactionAllocBufEvent { - public: - TSTransactionAllocBufEvent(int64_t ts, uint32_t pid, uint64_t dataSize, uint64_t offsetsSize) - : ts_(ts), pid_(pid), dataSize_(dataSize), offsetsSize_(offsetsSize) - { - } - ~TSTransactionAllocBufEvent() {} - uint64_t ts_; - uint32_t pid_; - uint64_t dataSize_; - uint64_t offsetsSize_; - }; - enum TSBinderEventType { - TS_EVENT_BINDER_SEND, - TS_EVENT_BINDER_RECIVED, - TS_EVENT_BINDER_ALLOC_BUF, - TS_EVENT_BINDER_LOCK, - TS_EVENT_BINDER_LOCKED, - TS_EVENT_BINDER_UNLOCK - }; - class TSBinderEvent { - public: - TSBinderEvent() {} - ~TSBinderEvent() {} - TSBinderEventType type_; - // us union below will be a good choice - // but union with unique_ptr can bring about runtime error on windows and mac,only work well on linux - std::unique_ptr senderBinderEvent_ = {}; - std::unique_ptr receivedBinderEvent_ = {}; - std::unique_ptr binderAllocBufEvent_ = {}; - std::unique_ptr binderLockEvent_ = {}; - std::unique_ptr binderLockedEvent_ = {}; - std::unique_ptr binderUnlockEvent_ = {}; - }; - void DealEvent(const TSBinderEvent* event); - - void ExecSendTraction(int64_t ts, - uint32_t tid, - uint64_t transactionId, - int32_t destNode, - int32_t destTgid, - int32_t destTid, - bool isReply, - int32_t flags, - int32_t code); - void ExecReceiveTraction(int64_t ts, uint32_t pid, uint64_t transactionId); - void ExecTransactionAllocBuf(int64_t ts, uint32_t pid, uint64_t dataSize, uint64_t offsetsSize); - void ExecTractionLock(int64_t ts, uint32_t pid, const std::string& tag); - void ExecTractionLocked(int64_t ts, uint32_t pid, const std::string& tag); - void ExecTractionUnlock(int64_t ts, uint32_t pid, const std::string& tag); std::string GetBinderFlagsDesc(uint32_t flag); bool IsValidUint32(uint32_t value) const { @@ -162,36 +57,31 @@ private: uint32_t statusCodeMsgFlag_ = 0x08; uint32_t acceptFdsMsgFlag_ = 0x10; uint32_t noFlagsMsgFlag_ = 0; - DataIndex binderCatalogId_ = traceDataCache_->GetDataIndex("binder"); - DataIndex replyId_ = traceDataCache_->GetDataIndex("binder reply"); - DataIndex isReplayId_ = traceDataCache_->GetDataIndex("reply transaction?"); - DataIndex flagsId_ = traceDataCache_->GetDataIndex("flags"); - DataIndex transSliceId_ = traceDataCache_->GetDataIndex("binder transaction"); - DataIndex transId_ = traceDataCache_->GetDataIndex("transaction id"); - DataIndex asyncRcvId_ = traceDataCache_->GetDataIndex("binder async rcv"); - DataIndex codeId_ = traceDataCache_->GetDataIndex("code"); - DataIndex callingTid_ = traceDataCache_->GetDataIndex("calling tid"); - DataIndex destNodeId_ = traceDataCache_->GetDataIndex("destination node"); - DataIndex destThreadId_ = traceDataCache_->GetDataIndex("destination thread"); - DataIndex destThreadNameId_ = traceDataCache_->GetDataIndex("destination name"); - DataIndex destSliceId_ = traceDataCache_->GetDataIndex("destination slice id"); - DataIndex destProcessId_ = traceDataCache_->GetDataIndex("destination process"); - DataIndex transAsyncId_ = traceDataCache_->GetDataIndex("binder transaction async"); - DataIndex lockTryId_ = traceDataCache_->GetDataIndex("binder lock waiting"); - DataIndex lockHoldId_ = traceDataCache_->GetDataIndex("binder lock held"); - DataIndex dataSizeId_ = traceDataCache_->GetDataIndex("data size"); - DataIndex dataOffsetSizeId_ = traceDataCache_->GetDataIndex("offsets size"); - DataIndex nullStringId_ = traceDataCache_->GetDataIndex("null"); + const DataIndex binderCatalogId_ = traceDataCache_->GetDataIndex("binder"); + const DataIndex replyId_ = traceDataCache_->GetDataIndex("binder reply"); + const DataIndex isReplayId_ = traceDataCache_->GetDataIndex("reply transaction?"); + const DataIndex flagsId_ = traceDataCache_->GetDataIndex("flags"); + const DataIndex transSliceId_ = traceDataCache_->GetDataIndex("binder transaction"); + const DataIndex transId_ = traceDataCache_->GetDataIndex("transaction id"); + const DataIndex asyncRcvId_ = traceDataCache_->GetDataIndex("binder async rcv"); + const DataIndex codeId_ = traceDataCache_->GetDataIndex("code"); + const DataIndex callingTid_ = traceDataCache_->GetDataIndex("calling tid"); + const DataIndex destNodeId_ = traceDataCache_->GetDataIndex("destination node"); + const DataIndex destThreadId_ = traceDataCache_->GetDataIndex("destination thread"); + const DataIndex destThreadNameId_ = traceDataCache_->GetDataIndex("destination name"); + const DataIndex destSliceId_ = traceDataCache_->GetDataIndex("destination slice id"); + const DataIndex destProcessId_ = traceDataCache_->GetDataIndex("destination process"); + const DataIndex transAsyncId_ = traceDataCache_->GetDataIndex("binder transaction async"); + const DataIndex lockTryId_ = traceDataCache_->GetDataIndex("binder lock waiting"); + const DataIndex lockHoldId_ = traceDataCache_->GetDataIndex("binder lock held"); + const DataIndex dataSizeId_ = traceDataCache_->GetDataIndex("data size"); + const DataIndex dataOffsetSizeId_ = traceDataCache_->GetDataIndex("offsets size"); + const DataIndex nullStringId_ = traceDataCache_->GetDataIndex("null"); std::unordered_map lastEventTs_ = {}; std::unordered_set transReplyWaitingReply_ = {}; std::unordered_map transWaitingRcv_ = {}; std::unordered_map transNoNeedReply_ = {}; std::unordered_map binderFlagDescs_ = {}; - std::multimap> tsBinderEventQueue_; - // timestamp of ftrace events from different cpu can be outof order - // keep a cache of ftrace events in memory and keep msg in order - // the value below is the count of msg, maybe you can change it - const size_t MAX_CACHE_SIZE = 10000; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/filter/clock_filter.h b/host/trace_streamer/src/filter/clock_filter.h index 6d8e29d..9b94715 100644 --- a/host/trace_streamer/src/filter/clock_filter.h +++ b/host/trace_streamer/src/filter/clock_filter.h @@ -58,6 +58,10 @@ public: { primaryClock_ = primary; } + ClockId GetPrimaryClock() + { + return primaryClock_; + } uint64_t ToPrimaryTraceTime(ClockId srcClockId, uint64_t srcTs) const; uint64_t Convert(ClockId srcClockId, uint64_t srcTs, ClockId desClockId) const; void AddClockSnapshot(const std::vector& snapShot); diff --git a/host/trace_streamer/src/filter/cpu_filter.cpp b/host/trace_streamer/src/filter/cpu_filter.cpp index 8ce2283..7c104b4 100644 --- a/host/trace_streamer/src/filter/cpu_filter.cpp +++ b/host/trace_streamer/src/filter/cpu_filter.cpp @@ -26,99 +26,6 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, uint64_t prevState, uint64_t nextPid, uint64_t nextPior) -{ - auto switchEvent = std::make_unique(ts, cpu, prevPid, prevPior, prevState, nextPid, nextPior); - auto cpuEvent = std::make_unique(); - cpuEvent->type_ = TS_EVENT_THREAD_SWITCH; - cpuEvent->switchEvent_ = std::move(switchEvent); - tsCpuEventQueue_.insert(std::make_pair(ts, std::move(cpuEvent))); - MaybeDealEvent(); -} -bool CpuFilter::InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid) -{ - auto processExitEvent = std::make_unique(ts, cpu, pid); - auto cpuEvent = std::make_unique(); - cpuEvent->type_ = TS_EVENT_PROCESS_EXIT; - cpuEvent->processExitEvent_ = std::move(processExitEvent); - tsCpuEventQueue_.insert(std::make_pair(ts, - std::move(cpuEvent))); - MaybeDealEvent(); - return true; -} - -bool CpuFilter::InsertProcessFreeEvent(uint64_t ts, uint64_t pid) -{ - auto processExitEvent = std::make_unique(ts, 0, pid); - auto cpuEvent = std::make_unique(); - cpuEvent->type_ = TS_EVENT_PROCESS_FREE; - cpuEvent->processExitEvent_ = std::move(processExitEvent); - tsCpuEventQueue_.insert(std::make_pair(ts, - std::move(cpuEvent))); - MaybeDealEvent(); - return true; -} -void CpuFilter::InsertWakeupEvent(uint64_t ts, uint64_t internalTid) -{ - auto wakeupEvent = std::make_unique(TSWakeupEvent(ts, internalTid)); - auto cpuEvent = std::make_unique(); - cpuEvent->type_ = TS_EVENT_THREAD_WAKING; - cpuEvent->wakeupEvent_ = std::move(wakeupEvent); - tsCpuEventQueue_.insert(std::make_pair(ts, - std::move(cpuEvent))); - MaybeDealEvent(); -} -uint64_t CpuFilter::RemberInternalTidInStateTable(uint64_t uid, uint64_t row, uint64_t state) -{ - if (internalTidToRowThreadState_.find(uid) != internalTidToRowThreadState_.end()) { - internalTidToRowThreadState_.at(uid) = TPthread{row, state}; - } else { - internalTidToRowThreadState_.insert(std::make_pair(uid, TPthread{row, state})); - } - return 0; -} - -void CpuFilter::MaybeDealEvent() -{ - if (tsCpuEventQueue_.size() > MAX_CACHE_SIZE) { - DealEvent(tsCpuEventQueue_.begin()->second.get()); - tsCpuEventQueue_.erase(tsCpuEventQueue_.begin()); - } -} - -void CpuFilter::DealEvent(const TSCpuEvent* event) -{ - switch (static_cast(event->type_)) { - case TS_EVENT_THREAD_SWITCH: - ExecInsertSwitchEvent(event->switchEvent_->ts_, event->switchEvent_->cpu_, event->switchEvent_->prevPid_, - event->switchEvent_->prevPior_, event->switchEvent_->prevState_, - event->switchEvent_->nextPid_, event->switchEvent_->nextPior_); - break; - case TS_EVENT_THREAD_WAKING: - ExecInsertWakeupEvent(event->wakeupEvent_->ts_, event->wakeupEvent_->pid_); - break; - case TS_EVENT_PROCESS_EXIT: - case TS_EVENT_PROCESS_FREE: - ExecInsertProcessExitEvent(event->processExitEvent_->ts_, event->processExitEvent_->cpu_, - event->processExitEvent_->pid_); - break; - default: - break; - } -} -void CpuFilter::FinishCpuEvent() -{ - for (auto it = tsCpuEventQueue_.begin(); it != tsCpuEventQueue_.end(); it++) { - DealEvent(it->second.get()); - } - tsCpuEventQueue_.clear(); -} -void CpuFilter::ExecInsertSwitchEvent(uint64_t ts, - uint64_t cpu, - uint64_t prevPid, - uint64_t prevPior, - uint64_t prevState, - uint64_t nextPid, - uint64_t nextPior) { auto index = traceDataCache_->GetSchedSliceData()->AppendSchedSlice(ts, 0, cpu, nextPid, 0, nextPior); @@ -134,10 +41,10 @@ void CpuFilter::ExecInsertSwitchEvent(uint64_t ts, CheckWakeupEvent(nextPid); auto lastRow = RowOfInternalTidInStateTable(nextPid); if (lastRow != INVALID_UINT64) { - traceDataCache_->GetThreadStateData()->UpdateDuration(lastRow, ts); + traceDataCache_->GetThreadStateData()->UpdateDuration(static_cast(lastRow), ts); } index = - traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_UINT64, cpu, nextPid, TASK_RUNNING); + traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_TIME, cpu, nextPid, TASK_RUNNING); RemberInternalTidInStateTable(nextPid, index, TASK_RUNNING); if (cpuToRowThreadState_.find(cpu) == cpuToRowThreadState_.end()) { cpuToRowThreadState_.insert(std::make_pair(cpu, index)); @@ -150,33 +57,53 @@ void CpuFilter::ExecInsertSwitchEvent(uint64_t ts, CheckWakeupEvent(prevPid); auto lastRow = RowOfInternalTidInStateTable(prevPid); if (lastRow != INVALID_UINT64) { - traceDataCache_->GetThreadStateData()->UpdateDuration(lastRow, ts); + traceDataCache_->GetThreadStateData()->UpdateDuration(static_cast(lastRow), ts); } - auto temp = traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_UINT64, INVALID_UINT64, + auto temp = traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_TIME, INVALID_CPU, prevPid, prevState); RemberInternalTidInStateTable(prevPid, temp, prevState); } } -void CpuFilter::ExecInsertWakeupEvent(uint64_t ts, uint64_t internalTid) +bool CpuFilter::InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid) +{ + UNUSED(cpu); + auto thread = traceDataCache_->GetThreadData(static_cast(pid)); + if (thread) { + thread->endT_ = ts; + return true; + } + return false; +} + +bool CpuFilter::InsertProcessFreeEvent(uint64_t ts, uint64_t pid) +{ + auto thread = traceDataCache_->GetThreadData(static_cast(pid)); + if (thread) { + thread->endT_ = ts; + return true; + } + return false; +} +void CpuFilter::InsertWakeupEvent(uint64_t ts, uint64_t internalTid) { /* repeated wakeup msg may come, we only record last wakeupmsg, and the wakeup will only insert to DataCache when a sched_switch comes */ if (lastWakeUpMsg.find(internalTid) != lastWakeUpMsg.end()) { - lastWakeUpMsg.at(internalTid) = ts; + // waking event is alaways before wakeup event + // use waking event only lastWakeUpMsg.at(internalTid) = ts; } else { lastWakeUpMsg.insert(std::make_pair(internalTid, ts)); } } -bool CpuFilter::ExecInsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid) +uint64_t CpuFilter::RemberInternalTidInStateTable(uint64_t uid, uint64_t row, uint64_t state) { - UNUSED(cpu); - auto thread = traceDataCache_->GetThreadData(static_cast(pid)); - if (thread) { - thread->endT_ = ts; - return true; + if (internalTidToRowThreadState_.find(uid) != internalTidToRowThreadState_.end()) { + internalTidToRowThreadState_.at(uid) = TPthread{row, state}; + } else { + internalTidToRowThreadState_.insert(std::make_pair(uid, TPthread{row, state})); } - return false; + return 0; } uint64_t CpuFilter::RowOfInternalTidInStateTable(uint64_t uid) const { @@ -209,9 +136,9 @@ void CpuFilter::CheckWakeupEvent(uint64_t internalTid) return; } if (lastrow != INVALID_UINT64) { - traceDataCache_->GetThreadStateData()->UpdateDuration(lastrow, ts); + traceDataCache_->GetThreadStateData()->UpdateDuration(static_cast(lastrow), ts); } - auto index = traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_UINT64, INVALID_UINT64, + auto index = traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_TIME, INVALID_CPU, internalTid, TASK_RUNNABLE); RemberInternalTidInStateTable(internalTid, index, TASK_RUNNABLE); } diff --git a/host/trace_streamer/src/filter/cpu_filter.h b/host/trace_streamer/src/filter/cpu_filter.h index a798a11..626438b 100644 --- a/host/trace_streamer/src/filter/cpu_filter.h +++ b/host/trace_streamer/src/filter/cpu_filter.h @@ -48,86 +48,12 @@ public: void InsertWakeupEvent(uint64_t ts, uint64_t internalTid); bool InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid); bool InsertProcessFreeEvent(uint64_t ts, uint64_t pid); - void FinishCpuEvent(); private: - void MaybeDealEvent(); - - class TSSwitchEvent { - public: - TSSwitchEvent(uint64_t ts, - uint64_t cpu, - uint64_t prevPid, - uint64_t prevPior, - uint64_t prevState, - uint64_t nextPid, - uint64_t nextPior) - : ts_(ts), - cpu_(cpu), - prevPid_(prevPid), - prevPior_(prevPior), - prevState_(prevState), - nextPid_(nextPid), - nextPior_(nextPior) - - { - } - ~TSSwitchEvent() {} - uint64_t ts_; - uint64_t cpu_; - uint64_t prevPid_; - uint64_t prevPior_; - uint64_t prevState_; - uint64_t nextPid_; - uint64_t nextPior_; - }; - class TSWakeupEvent { - public: - TSWakeupEvent(uint64_t ts, uint64_t pid) : ts_(ts), pid_(pid) {} - ~TSWakeupEvent() {} - uint64_t ts_; - uint64_t pid_; - }; - class TSProcessExitEvent { - public: - TSProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid) : ts_(ts), cpu_(cpu), pid_(pid) {} - ~TSProcessExitEvent() {} - uint64_t ts_; - uint64_t cpu_; - uint64_t pid_; - }; - enum TSCpuEventType { - TS_EVENT_THREAD_SWITCH, - TS_EVENT_THREAD_WAKING, - TS_EVENT_PROCESS_EXIT, - TS_EVENT_PROCESS_FREE - }; - class TSCpuEvent { - public: - TSCpuEvent() {} - ~TSCpuEvent() {} - TSCpuEventType type_; - // us union below will be a good choice - // but union with unique_ptr can bring about runtime error on windows and mac,only work well on linux - std::unique_ptr switchEvent_ = {}; - std::unique_ptr wakeupEvent_ = {}; - std::unique_ptr processExitEvent_ = {}; - }; - void DealEvent(const TSCpuEvent* event); - void ExecInsertSwitchEvent(uint64_t ts, - uint64_t cpu, - uint64_t prevPid, - uint64_t prevPior, - uint64_t prevState, - uint64_t nextPid, - uint64_t nextPior); - void ExecInsertWakeupEvent(uint64_t ts, uint64_t internalTid); - bool ExecInsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint64_t pid); void CheckWakeupEvent(uint64_t internalTid); uint64_t RemberInternalTidInStateTable(uint64_t uid, uint64_t row, uint64_t state = TASK_INVALID); uint64_t RowOfInternalTidInStateTable(uint64_t uid) const; uint64_t StateOfInternalTidInStateTable(uint64_t uid) const; - std::multimap> tsCpuEventQueue_; std::map cpuToRowThreadState_ = {}; std::map cpuToRowSched_ = {}; std::map lastWakeUpMsg = {}; @@ -137,10 +63,6 @@ private: uint64_t state_; }; std::map internalTidToRowThreadState_ = {}; - // timestamp of ftrace events from different cpu can be outof order - // keep a cache of ftrace events in memory and keep msg in order - // the value below is the count of msg, maybe you can change it - const size_t MAX_CACHE_SIZE = 10000; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/filter/filter.pri b/host/trace_streamer/src/filter/filter.pri deleted file mode 100644 index 1de2180..0000000 --- a/host/trace_streamer/src/filter/filter.pri +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. - -INCLUDEPATH +=$$PWD \ - $$PWD/../cfg -HEADERS += \ - $$PWD/clock_filter.h \ - $$PWD/cpu_filter.h \ - $$PWD/filter_base.h \ - $$PWD/filter_filter.h \ - $$PWD/measure_filter.h \ - $$PWD/process_filter.h \ - $$PWD/slice_filter.h \ - $$PWD/symbols_filter.h \ - $$PWD/stat_filter.h \ - $$PWD/binder_filter.h \ - $$PWD/args_filter.h \ - $$PWD/irq_filter.h \ - $$PWD/system_event_measure_filter.h -SOURCES += \ - $$PWD/clock_filter.cpp \ - $$PWD/cpu_filter.cpp \ - $$PWD/filter_base.cpp \ - $$PWD/filter_filter.cpp \ - $$PWD/measure_filter.cpp \ - $$PWD/process_filter.cpp \ - $$PWD/slice_filter.cpp \ - $$PWD/symbols_filter.cpp \ - $$PWD/stat_filter.cpp \ - $$PWD/binder_filter.cpp \ - $$PWD/args_filter.cpp \ - $$PWD/irq_filter.cpp \ - $$PWD/system_event_measure_filter.cpp diff --git a/host/trace_streamer/src/filter/irq_filter.h b/host/trace_streamer/src/filter/irq_filter.h index d13c9b3..57076d4 100644 --- a/host/trace_streamer/src/filter/irq_filter.h +++ b/host/trace_streamer/src/filter/irq_filter.h @@ -37,12 +37,12 @@ public: void SoftIrqExit(int64_t ts, uint32_t cpu, uint32_t vec); private: - DataIndex irqId_ = traceDataCache_->GetDataIndex("irq_id"); - DataIndex irqRet_ = traceDataCache_->GetDataIndex("irq_ret"); - DataIndex irqHandled_ = traceDataCache_->GetDataIndex("handled"); - DataIndex irqUnHandled_ = traceDataCache_->GetDataIndex("unhandled"); - DataIndex irqCatalog_ = traceDataCache_->GetDataIndex("irq"); - DataIndex softIrqCatalog_ = traceDataCache_->GetDataIndex("softirq"); + const DataIndex irqId_ = traceDataCache_->GetDataIndex("irq_id"); + const DataIndex irqRet_ = traceDataCache_->GetDataIndex("irq_ret"); + const DataIndex irqHandled_ = traceDataCache_->GetDataIndex("handled"); + const DataIndex irqUnHandled_ = traceDataCache_->GetDataIndex("unhandled"); + const DataIndex irqCatalog_ = traceDataCache_->GetDataIndex("irq"); + const DataIndex softIrqCatalog_ = traceDataCache_->GetDataIndex("softirq"); std::unordered_map lastEventTs_ = {}; std::unordered_set transReplyWaitingReply_ = {}; std::unordered_map transWaitingRcv_ = {}; diff --git a/host/trace_streamer/src/filter/measure_filter.h b/host/trace_streamer/src/filter/measure_filter.h index ef8efeb..9bcc13a 100644 --- a/host/trace_streamer/src/filter/measure_filter.h +++ b/host/trace_streamer/src/filter/measure_filter.h @@ -67,12 +67,12 @@ private: { E_CLK_ENABLE_FILTER, "clk_enable_filter" }, { E_CLK_DISABLE_FILTER, "clk_disable_filter" } }; - DataIndex clockSetRateDataIndex_ = traceDataCache_->GetDataIndex("clock_set_rate"); - DataIndex clockEnableDataIndex_ = traceDataCache_->GetDataIndex("clock_enable"); - DataIndex clockDisableDataIndex_ = traceDataCache_->GetDataIndex("clock_disable"); - DataIndex clkSetRateDataIndex_ = traceDataCache_->GetDataIndex("clk_set_rate"); - DataIndex clkEnableDataIndex_ = traceDataCache_->GetDataIndex("clk_enable"); - DataIndex clkDisableDataIndex_ = traceDataCache_->GetDataIndex("clk_disable"); + const DataIndex clockSetRateDataIndex_ = traceDataCache_->GetDataIndex("clock_set_rate"); + const DataIndex clockEnableDataIndex_ = traceDataCache_->GetDataIndex("clock_enable"); + const DataIndex clockDisableDataIndex_ = traceDataCache_->GetDataIndex("clock_disable"); + const DataIndex clkSetRateDataIndex_ = traceDataCache_->GetDataIndex("clk_set_rate"); + const DataIndex clkEnableDataIndex_ = traceDataCache_->GetDataIndex("clk_enable"); + const DataIndex clkDisableDataIndex_ = traceDataCache_->GetDataIndex("clk_disable"); }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/filter/perf_data_filter.cpp b/host/trace_streamer/src/filter/perf_data_filter.cpp new file mode 100644 index 0000000..db8d890 --- /dev/null +++ b/host/trace_streamer/src/filter/perf_data_filter.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "perf_data_filter.h" +#include "measure_filter.h" +#include "process_filter.h" +#include "slice_filter.h" +#include "string_to_numerical.h" +namespace SysTuning { +namespace TraceStreamer { +PerfDataFilter::PerfDataFilter(TraceDataCache* dataCache, const TraceStreamerFilters* filter) + : FilterBase(dataCache, filter), fileIdToRowInFileTable_(INVALID_UINT64), fileIdToRowInChainTable_(INVALID_UINT64) +{ +} +PerfDataFilter::~PerfDataFilter() = default; + +size_t PerfDataFilter::AppendPerfFiles(uint64_t fileId, uint32_t serial, DataIndex symbols, DataIndex filePath) +{ + fileIds_.emplace(fileId); + auto size = traceDataCache_->GetPerfFilesData()->AppendNewPerfFiles(fileId, serial, symbols, filePath); + fileIdToRowInFileTable_.Insert(fileId, serial, size); + if (!serial) { + fileIdToRow_.insert(std::make_pair(fileId, size)); + } + return size; +} + +size_t PerfDataFilter::AppendPerfCallChain(uint64_t sampleId, + uint64_t callchainId, + uint64_t vaddrInFile, + uint64_t fileId, + uint64_t symbolId) +{ + auto size = traceDataCache_->GetPerfCallChainData()->AppendNewPerfCallChain(sampleId, callchainId, vaddrInFile, + fileId, symbolId); + fileIdToRowInChainTable_.Insert(fileId, symbolId, size); + return size; +} +void PerfDataFilter::Finish() +{ + auto fileIds = traceDataCache_->GetPerfCallChainData()->FileIds(); + auto symbolsIds = traceDataCache_->GetPerfCallChainData()->SymbolIds(); + auto size = traceDataCache_->GetPerfCallChainData()->Size(); + auto filePath = traceDataCache_->GetPerfFilesData()->FilePaths(); + auto sambols = traceDataCache_->GetPerfFilesData()->Symbols(); + uint64_t flag = 1; + flag = ~(flag << 63); + for (auto i = 0; i < size; i++) { + if (fileIds_.find(fileIds[i]) == fileIds_.end()) { + // When the function name is empty and there is no file information to which the function belongs, + // set the function name to the virtual address of the function in the file + traceDataCache_->GetPerfCallChainData()->SetName( + i, "+0x" + base::number(traceDataCache_->GetPerfCallChainData()->VaddrInFiles()[i] & flag)); + continue; + } + if (symbolsIds[i] == -1) { + // When the function name is empty, if there has the file Id to which the function belongs,but the symboleid + // is -1. Set the function name as "the file name of the function at the top of the callstack + the virtual + // address of this function" + auto pathIndex = filePath[fileIdToRow_.at(fileIds[i])]; + auto fullPath = traceDataCache_->GetDataFromDict(pathIndex); + auto iPos = fullPath.find_last_of('/'); + fullPath = fullPath.substr(iPos + 1, -1); + traceDataCache_->GetPerfCallChainData()->SetName( + i, fullPath + "+0x" + base::number(traceDataCache_->GetPerfCallChainData()->VaddrInFiles()[i] & flag)); + continue; + } + // When the function name is empty, if there has the file Id to which the function belongs,and the symboleid + // is not -1. Set the function name as the virtual address of this function + auto value = fileIdToRowInFileTable_.Find(fileIds[i], symbolsIds[i]); + if (value == INVALID_UINT64) { + traceDataCache_->GetPerfCallChainData()->SetName( + i, "+0x" + base::number(traceDataCache_->GetPerfCallChainData()->VaddrInFiles()[i] & flag)); + continue; + } + // The function name is not empty + traceDataCache_->GetPerfCallChainData()->SetName(i, traceDataCache_->GetDataFromDict(sambols[value])); + } +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/host/trace_streamer/src/filter/perf_data_filter.h b/host/trace_streamer/src/filter/perf_data_filter.h new file mode 100644 index 0000000..e61c3e5 --- /dev/null +++ b/host/trace_streamer/src/filter/perf_data_filter.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 PERF_DATA_FILTER_H +#define PERF_DATA_FILTER_H +#include +#include +#include +#include "filter_base.h" +#include "trace_data_cache.h" +#include "trace_streamer_filters.h" +#include "double_map.h" +namespace SysTuning { +namespace TraceStreamer { +class PerfDataFilter : private FilterBase { +public: + PerfDataFilter(TraceDataCache*, const TraceStreamerFilters*); + PerfDataFilter(const PerfDataFilter&) = delete; + PerfDataFilter& operator=(const PerfDataFilter&) = delete; + ~PerfDataFilter() override; + +public: + size_t AppendPerfFiles(uint64_t fileId, uint32_t serial, DataIndex symbols, DataIndex filePath); + size_t AppendPerfCallChain(uint64_t sampleId, + uint64_t callchainId, + uint64_t vaddrInFile, + uint64_t fileId, + uint64_t symbolId); + void Finish(); + +private: + DoubleMap fileIdToRowInFileTable_; + DoubleMap fileIdToRowInChainTable_; + std::set fileIds_; + std::map fileIdToRow_{}; +}; +} // namespace TraceStreamer +} // namespace SysTuning + +#endif // PERF_DATA_FILTER_H diff --git a/host/trace_streamer/src/filter/slice_filter.cpp b/host/trace_streamer/src/filter/slice_filter.cpp index 5ae3854..6c18110 100644 --- a/host/trace_streamer/src/filter/slice_filter.cpp +++ b/host/trace_streamer/src/filter/slice_filter.cpp @@ -134,11 +134,25 @@ size_t SliceFilter::BeginAsyncBinder(uint64_t timestamp, uint32_t pid, DataIndex if (args.valuesMap_.size()) { argSetId = streamFilters_->argsFilter_->NewArgs(args); slices->AppendArgSet(argSetId); - binderQueue_[pid] = argSetId; +#ifdef BINDER_EXP + if (binderQueue_.count(pid) > MAX_BINDER_EVENT_NOT_MATCH) { + TS_LOGE("more than %zu binder events do not match, clear them, pid:%d", MAX_BINDER_EVENT_NOT_MATCH, pid); + binderQueue_.erase(pid); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_DATA_LOST); + } +#endif + binderQueue_.emplace(pid, argSetId); } else { argSetId = streamFilters_->argsFilter_->NewArgs(args); slices->AppendArgSet(argSetId); - binderQueue_[pid] = argSetId; +#ifdef BINDER_EXP + if (binderQueue_.count(pid) > MAX_BINDER_EVENT_NOT_MATCH) { + TS_LOGE("more than %zu binder events do not match, clear them, pid:%d", MAX_BINDER_EVENT_NOT_MATCH, pid); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_DATA_LOST); + binderQueue_.erase(pid); + } +#endif + binderQueue_.emplace(pid, argSetId); } argsToSliceQueue_[argSetId] = static_cast(index); return index; @@ -150,25 +164,24 @@ size_t SliceFilter::BeginBinder(uint64_t timestamp, uint32_t pid, DataIndex cat, struct SliceData sliceData = {timestamp, 0, internalTid, cat, nameIndex}; auto slices = traceDataCache_->GetInternalSlicesData(); - auto sliceStack = &sliceStackMap_[sliceData.internalTid]; + auto sliceStack = &binderStackMap_[sliceData.internalTid]; if (sliceStack->size() >= std::numeric_limits::max()) { TS_LOGW("stack depth out of range."); } const uint8_t depth = static_cast(sliceStack->size()); size_t index = slices->AppendInternalSlice(sliceData.timestamp, sliceData.duration, sliceData.internalTid, sliceData.cat, sliceData.name, depth, std::nullopt); - sliceStack->push_back(index); uint32_t argSetId = INVALID_INT32; if (args.valuesMap_.size()) { argSetId = streamFilters_->argsFilter_->NewArgs(args); slices->AppendArgSet(argSetId); - binderQueue_[pid] = argSetId; + binderQueue_.emplace(pid, argSetId); } else { argSetId = streamFilters_->argsFilter_->NewArgs(args); slices->AppendArgSet(argSetId); - binderQueue_[pid] = argSetId; + binderQueue_.emplace(pid, argSetId); } argsToSliceQueue_[argSetId] = static_cast(index); return index; @@ -176,33 +189,39 @@ size_t SliceFilter::BeginBinder(uint64_t timestamp, uint32_t pid, DataIndex cat, uint32_t SliceFilter::AddArgs(uint32_t tid, DataIndex key1, DataIndex key2, ArgsSet &args) { - if (!binderQueue_.count(tid)) { + auto argSize = binderQueue_.count(tid); + if (!argSize) { return INVALID_UINT32; } - streamFilters_->argsFilter_->AppendArgs(args, binderQueue_[tid]); - return argsToSliceQueue_[binderQueue_[tid]]; + auto it = binderQueue_.equal_range(tid); + auto itor = it.first; + streamFilters_->argsFilter_->AppendArgs(args, itor->second); + return argsToSliceQueue_[itor->second]; } bool SliceFilter::EndBinder(uint64_t timestamp, uint32_t pid, DataIndex category, DataIndex name, ArgsSet args) { - if (!binderQueue_.count(pid)) { + auto argSize = binderQueue_.count(pid); + if (!argSize) { return false; } - auto lastRow = argsToSliceQueue_[binderQueue_[pid]]; + auto it = binderQueue_.equal_range(pid); + auto itor = it.first; + auto lastRow = argsToSliceQueue_[itor->second]; auto slices = traceDataCache_->GetInternalSlicesData(); slices->SetDuration(lastRow, timestamp); - streamFilters_->argsFilter_->AppendArgs(args, binderQueue_[pid]); - argsToSliceQueue_.erase(binderQueue_[pid]); + streamFilters_->argsFilter_->AppendArgs(args, itor->second); + argsToSliceQueue_.erase(itor->second); - binderQueue_.erase(pid); + binderQueue_.erase(itor); InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(timestamp, pid); - const auto& stack = sliceStackMap_[internalTid]; + const auto& stack = binderStackMap_[internalTid]; if (stack.empty()) { TS_LOGE("a slice end do not match a slice start event"); callEventDisMatchCount++; return false; } - sliceStackMap_[internalTid].pop_back(); + binderStackMap_[internalTid].pop_back(); return true; } @@ -322,11 +341,11 @@ bool SliceFilter::EndSlice(uint64_t timestamp, uint32_t pid, uint32_t threadGrou size_t index = stack.back(); slices->SetDuration(index, timestamp); sliceStackMap_[internalTid].pop_back(); - // update dur of parent slice maybe - auto parentId = slices->ParentIdData()[index]; - if (parentId.has_value()) { - slices->SetDuration(parentId.value(), timestamp); - } + // update dur of parent slice maybe, + // just marke the dur as -1, auto parentId = slices->ParentIdData()[index]; + // just marke the dur as -1, if (parentId.has_value()) { + // just marke the dur as -1, slices->SetDuration(parentId.value(), timestamp); + // just marke the dur as -1, } return true; } diff --git a/host/trace_streamer/src/filter/slice_filter.h b/host/trace_streamer/src/filter/slice_filter.h index c2cb7ad..5798258 100644 --- a/host/trace_streamer/src/filter/slice_filter.h +++ b/host/trace_streamer/src/filter/slice_filter.h @@ -81,13 +81,16 @@ private: uint64_t asyncEventSize_ = 0; uint64_t asyncEventDisMatchCount = 0; uint64_t callEventDisMatchCount = 0; - std::unordered_map binderQueue_ = {}; + std::unordered_multimap binderQueue_ = {}; std::unordered_map argsToSliceQueue_ = {}; struct SliceInfo { uint32_t row; ArgsSet args_tracker; }; std::unordered_map> argsSet_ = {}; +#ifdef BINDER_EXP + const size_t MAX_BINDER_EVENT_NOT_MATCH = 1000; +#endif }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/include/file.h b/host/trace_streamer/src/include/file.h index 97be566..221c9f5 100644 --- a/host/trace_streamer/src/include/file.h +++ b/host/trace_streamer/src/include/file.h @@ -27,6 +27,36 @@ enum TraceParserStatus { TRACE_PARSE_ERROR = 2, TRACE_PARSER_ABNORMAL = 3 }; +struct ProfilerTraceFileHeader { + // Some space is reserved to facilitate the subsequent addition of fields in the header + static constexpr uint32_t HEADER_SIZE = 1024; + static constexpr uint32_t SHA256_SIZE = 256 / 8; + static constexpr uint64_t HEADER_MAGIC = 0x464F5250534F484FuLL; + static constexpr uint32_t V_MAJOR = 0x0001; + static constexpr uint32_t V_MAJOR_BITS = 16; + static constexpr uint32_t V_MINOR = 0x0000; + static constexpr uint32_t TRACE_VERSION = (V_MAJOR << V_MAJOR_BITS) | V_MINOR; + enum DataType { + HIPROFILER_PROTOBUF_BIN = 0, + HIPERF_DATA, + UNKNOW_TYPE = 1024, + }; + struct HeaderData { + // Magic number, used to distinguish offline files + uint64_t magic_ = HEADER_MAGIC; + // Total length, which can be used to check whether the document is truncated; + uint64_t length_ = HEADER_SIZE; + uint32_t version_ = TRACE_VERSION; + // The number of segments in the load data. The number of segments is even. One describes the length L and the + // other describes the next data v + uint32_t segments_ = 0; + // Sha256 of load data is used to verify whether the load data is complete; + uint8_t sha256_[SHA256_SIZE] = {}; + DataType dataType_ = UNKNOW_TYPE; + } __attribute__((packed)); + HeaderData data_ = {}; + uint8_t padding_[HEADER_SIZE - sizeof(data_)] = {}; +}; void SetAnalysisResult(TraceParserStatus stat); diff --git a/host/trace_streamer/src/include/string_to_numerical.h b/host/trace_streamer/src/include/string_to_numerical.h index 3340f50..8b2ad70 100644 --- a/host/trace_streamer/src/include/string_to_numerical.h +++ b/host/trace_streamer/src/include/string_to_numerical.h @@ -29,18 +29,21 @@ enum IntegerRadixType { inline std::optional StrToUInt32(const std::string& str, int base = INTEGER_RADIX_TYPE_DEC) { if (!str.empty()) { - uint32_t value = static_cast(std::stoul(str, nullptr, base)); - return std::make_optional(value); + char* endPtr = nullptr; + auto value = static_cast(std::strtoul(str.c_str(), &endPtr, base)); + if (!*endPtr) { + return std::make_optional(value); + } } return std::nullopt; } -inline std::string number(int value, int base = INTEGER_RADIX_TYPE_DEC) +inline std::string number(uint64_t value, int base = INTEGER_RADIX_TYPE_DEC) { std::stringstream ss; if (base == INTEGER_RADIX_TYPE_DEC) { - ss << std::oct << value; + ss << std::dec << value; } else if (base == INTEGER_RADIX_TYPE_HEX) { ss << std::hex << value; } @@ -50,8 +53,11 @@ inline std::string number(int value, int base = INTEGER_RADIX_TYPE_DEC) inline std::optional StrToInt32(const std::string& str, int base = INTEGER_RADIX_TYPE_DEC) { if (!str.empty()) { - int32_t value = static_cast(std::stol(str, nullptr, base)); - return std::make_optional(value); + char* endPtr = nullptr; + auto value = static_cast(std::strtol(str.c_str(), &endPtr, base)); + if (!*endPtr) { + return std::make_optional(value); + } } return std::nullopt; @@ -60,8 +66,11 @@ inline std::optional StrToInt32(const std::string& str, int base = INTE inline std::optional StrToUInt64(const std::string& str, int base = INTEGER_RADIX_TYPE_DEC) { if (!str.empty()) { - uint64_t value = static_cast(std::stoull(str, nullptr, base)); - return std::make_optional(value); + char* endPtr = nullptr; + auto value = static_cast(std::strtoull(str.c_str(), &endPtr, base)); + if (!*endPtr) { + return std::make_optional(value); + } } return std::nullopt; @@ -70,8 +79,11 @@ inline std::optional StrToUInt64(const std::string& str, int base = IN inline std::optional StrToInt64(const std::string& str, int base = INTEGER_RADIX_TYPE_DEC) { if (!str.empty()) { - int64_t value = static_cast(std::stoll(str, nullptr, base)); - return std::make_optional(value); + char* endPtr = nullptr; + int64_t value = static_cast(std::strtoll(str.c_str(), &endPtr, base)); + if (!*endPtr) { + return std::make_optional(value); + } } return std::nullopt; } diff --git a/host/trace_streamer/src/main.cpp b/host/trace_streamer/src/main.cpp index 8b16b5a..9c7a56e 100644 --- a/host/trace_streamer/src/main.cpp +++ b/host/trace_streamer/src/main.cpp @@ -28,6 +28,7 @@ #include "filter/slice_filter.h" #include "http_server.h" #include "log.h" +#include "meta.h" #include "parser/bytrace_parser/bytrace_event_parser.h" #include "parser/bytrace_parser/bytrace_parser.h" #include "parting_string.h" @@ -45,9 +46,7 @@ using namespace SysTuning::base; constexpr size_t G_CHUNK_SIZE = 1024 * 1024; constexpr int G_MIN_PARAM_NUM = 2; constexpr size_t G_FILE_PERMISSION = 664; -size_t g_loadSize = 0; -const char* TRACE_STREAM_VERSION = "2.3.118"; // version -const char* TRACE_STREAM_PUBLISHVERSION = "2022/3/29"; // publish datetime +// set version info in meta.cpp please void ExportStatusToLog(const std::string& dbPath, TraceParserStatus status) { std::string path = dbPath + ".ohos.ts"; @@ -87,7 +86,7 @@ void PrintInformation() } void PrintVersion() { - fprintf(stderr, "version %s\n", TRACE_STREAM_VERSION); + fprintf(stderr, "version %s\n", TRACE_STREAM_VERSION.c_str()); } bool ReadAndParser(SysTuning::TraceStreamer::TraceStreamerSelector& ta, int fd) @@ -182,18 +181,18 @@ int ExportDatabase(TraceStreamerSelector& ts, const std::string& sqliteFilePath) return 0; } +struct TraceExportOption { + std::string traceFilePath; + std::string sqliteFilePath; + bool interactiveState = false; + bool exportMetaTable = true; +}; struct HttpOption { bool enable = false; int port = 9001; }; -int CheckArgs(int argc, - char** argv, - bool& interactiveState, - bool& exportMetaTable, - std::string& traceFilePath, - std::string& sqliteFilePath, - HttpOption& httpOption) +int CheckArgs(int argc, char** argv, TraceExportOption& traceExportOption, HttpOption& httpOption) { for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "-e")) { @@ -201,15 +200,15 @@ int CheckArgs(int argc, ShowHelpInfo(argv[0]); return 1; } - sqliteFilePath = std::string(argv[i]); + traceExportOption.sqliteFilePath = std::string(argv[i]); continue; } else if (!strcmp(argv[i], "-c") || !strcmp(argv[i], "--command")) { - interactiveState = true; + traceExportOption.interactiveState = true; continue; } else if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "--info")) { PrintInformation(); } else if (!strcmp(argv[i], "-nm") || !strcmp(argv[i], "--nometa")) { - exportMetaTable = false; + traceExportOption.exportMetaTable = false; continue; } else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--v") || !strcmp(argv[i], "-version") || !strcmp(argv[i], "--version")) { @@ -226,10 +225,11 @@ int CheckArgs(int argc, httpOption.port = std::stoi(argv[i]); continue; } - traceFilePath = std::string(argv[i]); + traceExportOption.traceFilePath = std::string(argv[i]); } - if ((traceFilePath.empty() || (!interactiveState && sqliteFilePath.empty())) - && !httpOption.enable) { + if ((traceExportOption.traceFilePath.empty() || + (!traceExportOption.interactiveState && traceExportOption.sqliteFilePath.empty())) && + !httpOption.enable) { ShowHelpInfo(argv[0]); return 1; } @@ -237,22 +237,18 @@ int CheckArgs(int argc, } } // namespace TraceStreamer } // namespace SysTuning - int main(int argc, char** argv) { if (argc < G_MIN_PARAM_NUM) { ShowHelpInfo(argv[0]); return 1; } - std::string traceFilePath; - std::string sqliteFilePath; - bool interactiveState = false; - bool exportMetaTable = true; + TraceExportOption tsOption; HttpOption httpOption; - int ret = CheckArgs(argc, argv, interactiveState, exportMetaTable, traceFilePath, sqliteFilePath, httpOption); + int ret = CheckArgs(argc, argv, tsOption, httpOption); if (ret) { - if (!sqliteFilePath.empty()) { - ExportStatusToLog(sqliteFilePath, GetAnalysisResult()); + if (!tsOption.sqliteFilePath.empty()) { + ExportStatusToLog(tsOption.sqliteFilePath, GetAnalysisResult()); } return 0; } @@ -265,23 +261,28 @@ int main(int argc, char** argv) return 0; } TraceStreamerSelector ts; - ts.EnableMetaTable(exportMetaTable); - if (OpenAndParserFile(ts, traceFilePath)) { - if (!sqliteFilePath.empty()) { - ExportStatusToLog(sqliteFilePath, GetAnalysisResult()); + ts.EnableMetaTable(tsOption.exportMetaTable); + if (OpenAndParserFile(ts, tsOption.traceFilePath)) { + if (!tsOption.sqliteFilePath.empty()) { + ExportStatusToLog(tsOption.sqliteFilePath, GetAnalysisResult()); } return 1; } - if (interactiveState) { + if (tsOption.interactiveState) { + MetaData* metaData = ts.GetMetaData(); + metaData->SetOutputFileName("command line mode"); + metaData->SetParserToolVersion(TRACE_STREAM_VERSION.c_str()); + metaData->SetParserToolPublishDateTime(TRACE_STREAM_PUBLISHVERSION.c_str()); + metaData->SetTraceDataSize(g_loadSize); ts.SearchData(); return 0; } - if (ExportDatabase(ts, sqliteFilePath)) { - ExportStatusToLog(sqliteFilePath, GetAnalysisResult()); + if (ExportDatabase(ts, tsOption.sqliteFilePath)) { + ExportStatusToLog(tsOption.sqliteFilePath, GetAnalysisResult()); return 1; } - if (!sqliteFilePath.empty()) { - ExportStatusToLog(sqliteFilePath, GetAnalysisResult()); + if (!tsOption.sqliteFilePath.empty()) { + ExportStatusToLog(tsOption.sqliteFilePath, GetAnalysisResult()); } return 0; } diff --git a/host/trace_streamer/src/multi_platform/BUILD.gn b/host/trace_streamer/src/multi_platform/BUILD.gn deleted file mode 100644 index 35da1af..0000000 --- a/host/trace_streamer/src/multi_platform/BUILD.gn +++ /dev/null @@ -1,305 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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("../ts.gni") -if (use_wasm) { -} else { -} -if (use_wasm) { - source_set("proto_services_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/compaction.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/compaction.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("proto_services_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/compaction.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/compaction.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} -if (use_wasm) { - source_set("ftrace_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/services/common_types.pb.cc", - "${OHOS_PROTO_GEN}/services/common_types.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/binder.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/binder.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/block.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/block.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cgroup.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cgroup.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/clk.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/clk.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cpuhp.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cpuhp.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/dma_fence.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/dma_fence.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ext4.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ext4.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filelock.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filelock.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filemap.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filemap.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace_event.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace_event.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/gpio.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/gpio.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/i2c.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/i2c.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ipi.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ipi.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/irq.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/irq.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/kmem.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/kmem.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/net.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/net.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/oom.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/oom.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/pagemap.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/pagemap.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/power.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/power.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/printk.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/printk.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/raw_syscalls.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/raw_syscalls.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/rcu.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/rcu.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sched.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sched.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/signal.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/signal.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sunrpc.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sunrpc.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/task.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/task.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/timer.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/timer.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/trace_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/trace_plugin_result.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/v4l2.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/v4l2.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/vmscan.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/vmscan.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/workqueue.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/workqueue.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/writeback.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/writeback.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("ftrace_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/services/common_types.pb.cc", - "${OHOS_PROTO_GEN}/services/common_types.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/binder.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/binder.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/block.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/block.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cgroup.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cgroup.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/clk.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/clk.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cpuhp.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/cpuhp.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/dma_fence.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/dma_fence.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ext4.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ext4.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filelock.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filelock.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filemap.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/filemap.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace_event.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ftrace_event.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/gpio.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/gpio.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/i2c.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/i2c.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ipi.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/ipi.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/irq.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/irq.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/kmem.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/kmem.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/net.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/net.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/oom.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/oom.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/pagemap.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/pagemap.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/power.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/power.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/printk.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/printk.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/raw_syscalls.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/raw_syscalls.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/rcu.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/rcu.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sched.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sched.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/signal.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/signal.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sunrpc.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/sunrpc.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/task.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/task.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/timer.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/timer.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/trace_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/trace_plugin_result.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/v4l2.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/v4l2.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/vmscan.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/vmscan.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/workqueue.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/workqueue.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/writeback.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/writeback.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} -if (use_wasm) { - source_set("memory_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_common.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_common.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("memory_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_common.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_common.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/memory_data/memory_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} -if (use_wasm) { - source_set("hilog_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/hilog_data/hilog_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hilog_data/hilog_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("hilog_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/hilog_data/hilog_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hilog_data/hilog_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} - -if (use_wasm) { - source_set("native_hook_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("native_hook_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/native_hook/native_hook_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} - -if (use_wasm) { - source_set("hidump_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} else { - shared_library("hidump_data_cpp") { - sources = [ - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_config.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_config.pb.h", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_result.pb.cc", - "${OHOS_PROTO_GEN}/types/plugins/hidump_data/hidump_plugin_result.pb.h", - ] - include_dirs = [ - "//third_party/protobuf/src", - "//src/include", - ] - } -} diff --git a/host/trace_streamer/src/multi_platform/global.pri b/host/trace_streamer/src/multi_platform/global.pri deleted file mode 100644 index a1dab5b..0000000 --- a/host/trace_streamer/src/multi_platform/global.pri +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. - -#DEFINES +=_AIX -#DEFINES +=_GLIBCXX_BITS_STD_ABS_H -#DEFINES +=__CORRECT_ISO_CPP_STDLIB_H_PROTO -#DEFINES += __CORRECT_ISO_CPP11_MATH_H_PROTO_FP -#DEFINES +=__CORRECT_ISO_CPP_MATH_H_PROTO -#DEFINES +=_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC - -INCLUDEPATH +=$${ROOTSRCDIR}/include -INCLUDEPATH +=$${ROOTSRCDIR}/ -CONFIG(debug, debug|release){ - BUILDVERSION = _debug - message("debug") -}else{ - message("release") - BUILDVERSION = - DEFINES += NDEBUG -} -contains(QT_ARCH, i386) { - message("qmake" $$TARGET "32-bit") - BIT = x32 -} else { - message("qmake" $$TARGET "64-bit") - BIT = -} -macx{ - PLATFORM = macx - TOOL = - BIT = -} -unix:!macx { - PLATFORM = linux - TOOL = - BIT = -} -win32 { - PLATFORM = windows - TOOL = -} -DESTFOLDER =$${PLATFORM}$${BIT}$${TOOL}$${BUILDVERSION} -islib{ -message("this is for lib") -DESTDIR = $${ROOTSRCDIR}/lib/$${DESTFOLDER} -} else { -message("this is for app") -DESTDIR = $${ROOTSRCDIR}/out/$${DESTFOLDER} -} -unix{ -QMAKE_CXXFLAGS += -BigObj -INCLUDEPATH += $$DESTDIR/gen/build_config -INCLUDEPATH += $$DESTDIR/gen -INCLUDEPATH +=/usr/include/c++/7 -INCLUDEPATH +=/usr/include/x86_64-linux-gnu/ -} else { -INCLUDEPATH += $${GENDIR}/gen/build_config -INCLUDEPATH += $${GENDIR}/gen -DEFINES += WIN32 -QMAKE_CXXFLAGS += -BigObj -staticlib{ -QMAKE_CXXFLAGS += -Ofast -flto -} -} -OBJECTS_DIR = $${ROOTSRCDIR}/tmp_$${TARGET}_$${DESTFOLDER} diff --git a/host/trace_streamer/src/multi_platform/protogen.pri b/host/trace_streamer/src/multi_platform/protogen.pri deleted file mode 100644 index 72da7fd..0000000 --- a/host/trace_streamer/src/multi_platform/protogen.pri +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# 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. -PROTOGEN = $$PWD/../../third_party/protogen -INCLUDEPATH += $${PROTOGEN}/types/plugins/ftrace_data \ - $${PROTOGEN}/types/plugins/memory_data \ - $${PROTOGEN}/types/plugins/hilog_data \ - $${PROTOGEN}/types/plugins/native_hook \ - $${PROTOGEN}/types/plugins/hidump_data \ - $${PROTOGEN} -SOURCES +=$${PROTOGEN}/services/common_types.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/trace_plugin_result.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/ftrace_event.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/irq.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/vmscan.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/workqueue.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/task.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/power.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/sched.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/filemap.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/i2c.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/kmem.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/block.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/ipi.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/ftrace.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/ext4.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/oom.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/compaction.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/clk.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/cgroup.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/binder.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/signal.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/sunrpc.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/net.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/cpuhp.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/writeback.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/v4l2.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/pagemap.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/dma_fence.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/printk.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/filelock.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/gpio.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/timer.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/raw_syscalls.pb.cc \ - $${PROTOGEN}/types/plugins/ftrace_data/rcu.pb.cc \ - \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_common.pb.cc \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_config.pb.cc \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_result.pb.cc \ - $${PROTOGEN}/types/plugins/hilog_data/hilog_plugin_result.pb.cc \ - $${PROTOGEN}/types/plugins/native_hook/native_hook_result.pb.cc \ - $${PROTOGEN}/types/plugins/native_hook/native_hook_config.pb.cc \ - $${PROTOGEN}/types/plugins/hidump_data/hidump_plugin_result.pb.cc \ - $${PROTOGEN}/types/plugins/hidump_data/hidump_plugin_config.pb.cc - -HEADERS += $${PROTOGEN}/services/common_types.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/trace_plugin_result.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/ftrace_event.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/irq.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/vmscan.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/workqueue.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/task.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/power.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/sched.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/filemap.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/i2c.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/kmem.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/block.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/ipi.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/ftrace.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/ext4.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/oom.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/compaction.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/clk.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/cgroup.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/signal.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/binder.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/net.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/v4l2.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/writeback.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/cpuhp.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/pagemap.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/dma_fence.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/printk.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/filelock.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/gpio.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/timer.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/raw_syscalls.pb.h \ - $${PROTOGEN}/types/plugins/ftrace_data/rcu.pb.h \ - \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_common.pb.h \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_config.pb.h \ - $${PROTOGEN}/types/plugins/memory_data/memory_plugin_result.pb.h \ - $${PROTOGEN}/types/plugins/hilog_data/hilog_plugin_result.pb.h \ - $${PROTOGEN}/types/plugins/native_hook/native_hook_result.pb.h \ - $${PROTOGEN}/types/plugins/native_hook/native_hook_config.pb.h \ - $${PROTOGEN}/types/plugins/hidump_data/hidump_plugin_result.pb.h \ - $${PROTOGEN}/types/plugins/hidump_data/hidump_plugin_config.pb.h diff --git a/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp b/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp index 8ab3d13..343b559 100644 --- a/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp +++ b/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp @@ -47,10 +47,6 @@ std::string GetFunctionName(const std::string_view& text, const std::string_view BytraceEventParser::BytraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter) : EventParserBase(dataCache, filter), - ioWaitId_(const_cast(dataCache)->GetDataIndex("io_wait")), - workQueueId_(const_cast(dataCache)->GetDataIndex("workqueue")), - schedWakeupId_(const_cast(dataCache)->GetDataIndex("sched_wakeup")), - schedBlockedReasonId_(const_cast(dataCache)->GetDataIndex("sched_blocked_reason")), printEventParser_(traceDataCache_, streamFilters_) { eventToFunctionMap_ = { @@ -61,7 +57,9 @@ BytraceEventParser::BytraceEventParser(TraceDataCache* dataCache, const TraceStr {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), bind(&BytraceEventParser::TaskNewtaskEvent, this, std::placeholders::_1, std::placeholders::_2)}, {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), - bind(&BytraceEventParser::TracingMarkWriteEvent, this, std::placeholders::_1, std::placeholders::_2)}, + bind(&BytraceEventParser::TracingMarkWriteOrPrintEvent, this, std::placeholders::_1, std::placeholders::_2)}, + {config_.eventNameMap_.at(TRACE_EVENT_PRINT), + bind(&BytraceEventParser::TracingMarkWriteOrPrintEvent, this, std::placeholders::_1, std::placeholders::_2)}, {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKEUP), bind(&BytraceEventParser::SchedWakeupEvent, this, std::placeholders::_1, std::placeholders::_2)}, {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKING), @@ -117,7 +115,7 @@ BytraceEventParser::BytraceEventParser(TraceDataCache* dataCache, const TraceStr bool BytraceEventParser::SchedSwitchEvent(const ArgsMap& args, const BytraceLine& line) const { - if (args.empty() || args.size() < MIN_SCHED_ARGS_COUNT) { + if (args.empty() || args.size() < MIN_SCHED_SWITCH_ARGS_COUNT) { TS_LOGD("Failed to parse sched_switch event, no args or args size < 6"); streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID); return false; @@ -163,6 +161,11 @@ bool BytraceEventParser::SchedSwitchEvent(const ArgsMap& args, const BytraceLine bool BytraceEventParser::TaskRenameEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_TASK_RENAME_ARGS_COUNT) { + TS_LOGD("Failed to parse task_rename event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_RENAME, STAT_EVENT_DATA_INVALID); + return false; + } auto prevCommStr = std::string_view(args.at("newcomm")); auto pidValue = base::StrToUInt32(args.at("pid")); streamFilters_->processFilter_->UpdateOrCreateThreadWithName(line.ts, pidValue.value(), prevCommStr); @@ -178,13 +181,13 @@ bool BytraceEventParser::TaskNewtaskEvent(const ArgsMap& args, const BytraceLine return true; } -bool BytraceEventParser::TracingMarkWriteEvent(const ArgsMap& args, const BytraceLine& line) const +bool BytraceEventParser::TracingMarkWriteOrPrintEvent(const ArgsMap& args, const BytraceLine& line) { UNUSED(args); printEventParser_.ParsePrintEvent(line.ts, line.pid, line.argsStr.c_str()); return true; } - +// prefer to use waking, unless no waking, can use wakeup bool BytraceEventParser::SchedWakeupEvent(const ArgsMap& args, const BytraceLine& line) const { if (args.size() < MIN_SCHED_WAKEUP_ARGS_COUNT) { @@ -198,10 +201,13 @@ bool BytraceEventParser::SchedWakeupEvent(const ArgsMap& args, const BytraceLine streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKEUP, STAT_EVENT_DATA_INVALID); return false; } - DataIndex name = traceDataCache_->GetDataIndex(std::string_view("sched_wakeup")); auto instants = traceDataCache_->GetInstantsData(); - InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, wakePidValue.value()); - instants->AppendInstantEventData(line.ts, name, internalTid); + InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, wakePidValue.value_or(0)); + streamFilters_->cpuFilter_->InsertWakeupEvent(line.ts, internalTid); + + InternalTid wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, line.pid); + + instants->AppendInstantEventData(line.ts, schedWakeupName_, internalTid, wakeupFromPid); std::optional targetCpu = base::StrToUInt32(args.at("target_cpu")); if (targetCpu.has_value()) { traceDataCache_->GetRawData()->AppendRawData(0, line.ts, RAW_SCHED_WAKEUP, targetCpu.value(), internalTid); @@ -212,6 +218,11 @@ bool BytraceEventParser::SchedWakeupEvent(const ArgsMap& args, const BytraceLine bool BytraceEventParser::SchedWakingEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_SCHED_WAKING_ARGS_COUNT) { + TS_LOGD("Failed to parse sched_waking event, no args or args size < 4"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_DATA_INVALID); + return false; + } std::optional wakePidValue = base::StrToUInt32(args.at("pid")); auto wakePidStr = std::string_view(args.at("comm")); if (!wakePidValue.has_value()) { @@ -219,17 +230,21 @@ bool BytraceEventParser::SchedWakingEvent(const ArgsMap& args, const BytraceLine streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_DATA_INVALID); return false; } - DataIndex name = traceDataCache_->GetDataIndex(std::string_view("sched_waking")); auto instants = traceDataCache_->GetInstantsData(); DataIndex wakePidStrIndex = traceDataCache_->GetDataIndex(wakePidStr); - InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThreadWithNameIndex(line.ts, - wakePidValue.value(), - wakePidStrIndex); + InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThreadWithNameIndex( + line.ts, wakePidValue.value(), wakePidStrIndex); + + DataIndex wakeByPidStrIndex = traceDataCache_->GetDataIndex(line.task); + InternalTid internalTidWakeup = + streamFilters_->processFilter_->UpdateOrCreateThreadWithNameIndex(line.ts, line.pid, wakeByPidStrIndex); streamFilters_->cpuFilter_->InsertWakeupEvent(line.ts, internalTid); - instants->AppendInstantEventData(line.ts, name, internalTid); + InternalTid wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, line.pid); + instants->AppendInstantEventData(line.ts, schedWakingName_, internalTid, wakeupFromPid); std::optional targetCpu = base::StrToUInt32(args.at("target_cpu")); if (targetCpu.has_value()) { - traceDataCache_->GetRawData()->AppendRawData(0, line.ts, RAW_SCHED_WAKING, targetCpu.value(), internalTid); + traceDataCache_->GetRawData()->AppendRawData(0, line.ts, RAW_SCHED_WAKING, targetCpu.value(), + internalTidWakeup); streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_RECEIVED); } @@ -238,6 +253,11 @@ bool BytraceEventParser::SchedWakingEvent(const ArgsMap& args, const BytraceLine bool BytraceEventParser::CpuIdleEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_CPU_IDLE_ARGS_COUNT) { + TS_LOGD("Failed to parse cpu_idle event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_IDLE, STAT_EVENT_DATA_INVALID); + return false; + } std::optional eventCpuValue = base::StrToUInt32(args.at("cpu_id")); std::optional newStateValue = base::StrToInt64(args.at("state")); if (!eventCpuValue.has_value()) { @@ -261,6 +281,11 @@ bool BytraceEventParser::CpuIdleEvent(const ArgsMap& args, const BytraceLine& li bool BytraceEventParser::CpuFrequencyEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_CPU_FREQUENCY_ARGS_COUNT) { + TS_LOGD("Failed to parse cpu_frequency event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_DATA_INVALID); + return false; + } std::optional eventCpuValue = base::StrToUInt32(args.at("cpu_id")); std::optional newStateValue = base::StrToInt64(args.at("state")); @@ -311,6 +336,11 @@ bool BytraceEventParser::WorkqueueExecuteEndEvent(const ArgsMap& args, const Byt bool BytraceEventParser::ProcessExitEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_PROCESS_EXIT_ARGS_COUNT) { + TS_LOGD("Failed to parse process_exit event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PROCESS_EXIT, STAT_EVENT_DATA_INVALID); + return false; + } auto comm = std::string_view(args.at("comm")); auto pid = base::StrToUInt32(args.at("pid")); if (!pid.has_value()) { @@ -329,6 +359,11 @@ bool BytraceEventParser::ProcessExitEvent(const ArgsMap& args, const BytraceLine bool BytraceEventParser::SetRateEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_CLOCK_SET_RATE_ARGS_COUNT) { + TS_LOGD("Failed to parse clock_set_rate event, no args or args size < 3"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_SET_RATE, STAT_EVENT_DATA_INVALID); + return false; + } auto name = std::string_view(args.at("name")); auto state = base::StrToInt64(args.at("state")); auto cpu = base::StrToUInt64(args.at("cpu_id")); @@ -340,6 +375,11 @@ bool BytraceEventParser::SetRateEvent(const ArgsMap& args, const BytraceLine& li bool BytraceEventParser::ClockEnableEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_CLOCK_ENABLE_ARGS_COUNT) { + TS_LOGD("Failed to parse clock_enable event, no args or args size < 3"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_ENABLE, STAT_EVENT_DATA_INVALID); + return false; + } auto name = std::string_view(args.at("name")); auto state = base::StrToInt64(args.at("state")); auto cpuId = base::StrToUInt64(args.at("cpu_id")); @@ -350,6 +390,11 @@ bool BytraceEventParser::ClockEnableEvent(const ArgsMap& args, const BytraceLine } bool BytraceEventParser::ClockDisableEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_CLOCK_DISABLE_ARGS_COUNT) { + TS_LOGD("Failed to parse clock_disable event, no args or args size < 3"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_DISABLE, STAT_EVENT_DATA_INVALID); + return false; + } auto name = std::string_view(args.at("name")); auto state = base::StrToInt64(args.at("state")); auto cpuId = base::StrToUInt64(args.at("cpu_id")); @@ -411,8 +456,11 @@ bool BytraceEventParser::IpiExitEvent(const ArgsMap& args, const BytraceLine& li } bool BytraceEventParser::IrqHandlerEntryEvent(const ArgsMap& args, const BytraceLine& line) const { - UNUSED(args); - UNUSED(line); + if (args.empty() || args.size() < MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT) { + TS_LOGD("Failed to parse irq_handler_entry event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_ENTRY, STAT_EVENT_DATA_INVALID); + return false; + } traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_ENTRY, STAT_EVENT_RECEIVED); auto name = std::string_view(args.at("name")); streamFilters_->irqFilter_->IrqHandlerEntry(line.ts, line.cpu, traceDataCache_->GetDataIndex(name)); @@ -420,8 +468,11 @@ bool BytraceEventParser::IrqHandlerEntryEvent(const ArgsMap& args, const Bytrace } bool BytraceEventParser::IrqHandlerExitEvent(const ArgsMap& args, const BytraceLine& line) const { - UNUSED(args); - UNUSED(line); + if (args.empty() || args.size() < MIN_IRQ_HANDLER_EXIT_ARGS_COUNT) { + TS_LOGD("Failed to parse irq_handler_exit event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_EXIT, STAT_EVENT_DATA_INVALID); + return false; + } traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_EXIT, STAT_EVENT_RECEIVED); uint32_t ret = (args.at("ret") == "handled") ? 1 : 0; streamFilters_->irqFilter_->IrqHandlerExit(line.ts, line.cpu, ret); @@ -437,6 +488,11 @@ bool BytraceEventParser::SoftIrqRaiseEvent(const ArgsMap& args, const BytraceLin } bool BytraceEventParser::SoftIrqEntryEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_SOFTIRQ_ENTRY_ARGS_COUNT) { + TS_LOGD("Failed to parse softirq_entry event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SOFTIRQ_ENTRY, STAT_EVENT_DATA_INVALID); + return false; + } traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_ENTRY, STAT_EVENT_RECEIVED); auto vec = base::StrToUInt32(args.at("vec")); streamFilters_->irqFilter_->SoftIrqEntry(line.ts, line.cpu, vec.value()); @@ -444,6 +500,11 @@ bool BytraceEventParser::SoftIrqEntryEvent(const ArgsMap& args, const BytraceLin } bool BytraceEventParser::SoftIrqExitEvent(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_SOFTIRQ_EXIT_ARGS_COUNT) { + TS_LOGD("Failed to parse softirq_exit event, no args or args size < 2"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SOFTIRQ_EXIT, STAT_EVENT_DATA_INVALID); + return false; + } traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_EXIT, STAT_EVENT_RECEIVED); auto vec = base::StrToUInt32(args.at("vec")); streamFilters_->irqFilter_->SoftIrqExit(line.ts, line.cpu, vec.value()); @@ -452,6 +513,11 @@ bool BytraceEventParser::SoftIrqExitEvent(const ArgsMap& args, const BytraceLine bool BytraceEventParser::BinderTransaction(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_ARGS_COUNT) { + TS_LOGD("Failed to parse binder_transaction event, no args or args size < 7"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_DATA_INVALID); + return false; + } streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_RECEIVED); auto transactionId = base::StrToInt64(args.at("transaction")); auto destNode = base::StrToUInt32(args.at("dest_node")); @@ -470,6 +536,11 @@ bool BytraceEventParser::BinderTransaction(const ArgsMap& args, const BytraceLin } bool BytraceEventParser::BinderTransactionReceived(const ArgsMap& args, const BytraceLine& line) const { + if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_RECEIVED_ARGS_COUNT) { + TS_LOGD("Failed to parse binder_transaction_received event, no args or args size < 1"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED, STAT_EVENT_DATA_INVALID); + return false; + } streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED, STAT_EVENT_RECEIVED); auto transactionId = base::StrToInt64(args.at("transaction")); streamFilters_->binderFilter_->ReceiveTraction(line.ts, line.pid, transactionId.value()); @@ -478,8 +549,11 @@ bool BytraceEventParser::BinderTransactionReceived(const ArgsMap& args, const By } bool BytraceEventParser::BinderTransactionAllocBufEvent(const ArgsMap& args, const BytraceLine& line) const { - UNUSED(args); - UNUSED(line); + if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_ALLOC_BUF_ARGS_COUNT) { + TS_LOGD("Failed to parse binder_transaction_alloc_buf event, no args or args size < 3"); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF, STAT_EVENT_DATA_INVALID); + return false; + } streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF, STAT_EVENT_RECEIVED); auto dataSize = base::StrToUInt64(args.at("data_size")); auto offsetsSize = base::StrToUInt64(args.at("offsets_size")); @@ -487,23 +561,72 @@ bool BytraceEventParser::BinderTransactionAllocBufEvent(const ArgsMap& args, con TS_LOGD("dataSize:%lu, offsetSize:%lu", dataSize.value(), offsetsSize.value()); return true; } -bool BytraceEventParser::ParseDataItem(const BytraceLine& line, const ArgsMap& args, uint32_t tgid) const +void BytraceEventParser::ParseDataItem(const BytraceLine& line) +{ + eventList_.push_back(std::move(std::make_unique(line.ts, std::move(line)))); + return; +} +void BytraceEventParser::GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uint32_t& tgid) const { - traceDataCache_->UpdateTraceTime(line.ts); - if (tgid) { - streamFilters_->processFilter_->UpdateOrCreateThreadWithPidAndName(line.pid, tgid, line.task); + if (bufLine.tGidStr.at(0) != '-') { + tgid = base::StrToUInt32(bufLine.tGidStr).value_or(0); } else { - // When tgid is zero, only use tid create thread - streamFilters_->processFilter_->GetOrCreateThreadWithPid(line.pid, tgid); + tgid = 0; } - auto it = eventToFunctionMap_.find(line.eventName); - if (it != eventToFunctionMap_.end()) { - return it->second(args, line); + for (base::PartingString ss(bufLine.argsStr, ' '); ss.Next();) { + std::string key; + std::string value; + if (!(std::string(ss.GetCur()).find("=") != std::string::npos)) { + key = "name"; + value = ss.GetCur(); + args.emplace(std::move(key), std::move(value)); + continue; + } + for (base::PartingString inner(ss.GetCur(), '='); inner.Next();) { + if (key.empty()) { + key = inner.GetCur(); + } else { + value = inner.GetCur(); + } + } + args.emplace(std::move(key), std::move(value)); + } +} +void BytraceEventParser::FilterAllEvents() +{ + auto cmp = [](const std::unique_ptr& a, const std::unique_ptr& b) { + return a->eventTimestamp < b->eventTimestamp; + }; + std::sort(eventList_.begin(), eventList_.end(), cmp); + size_t maxBuffSize = 1000 * 1000; + while (eventList_.size()) { + int size = std::min(maxBuffSize, eventList_.size()); + auto endOfList = eventList_.begin() + size; + for (auto itor = eventList_.begin(); itor != endOfList; itor++) { + EventInfo* event = itor->get(); + auto it = eventToFunctionMap_.find(event->line.eventName); + if (it != eventToFunctionMap_.end()) { + uint32_t tgid; + ArgsMap args; + GetDataSegArgs(event->line, args, tgid); + if (tgid) { + streamFilters_->processFilter_->UpdateOrCreateThreadWithPidAndName(event->line.pid, tgid, + event->line.task); + } else { + // When tgid is zero, only use tid create thread + streamFilters_->processFilter_->GetOrCreateThreadWithPid(event->line.pid, tgid); + } + traceDataCache_->UpdateTraceTime(event->line.ts); + it->second(args, event->line); + } else { + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_OTHER, STAT_EVENT_NOTSUPPORTED); + TS_LOGW("UnRecognizable event name:%s", event->line.eventName.c_str()); + } + } + eventList_.erase(eventList_.begin(), endOfList); } - TS_LOGW("UnRecognizable event name:%s", line.eventName.c_str()); - traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_OTHER, STAT_EVENT_NOTSUPPORTED); - return false; + eventList_.clear(); } } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h b/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h index 6f3aee8..05ce573 100644 --- a/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h +++ b/host/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h @@ -17,6 +17,7 @@ #define SRC_BYTRACE_EVENT_PARSER_H #include +#include #include "common_types.h" #include "event_parser_base.h" @@ -31,14 +32,15 @@ using ArgsMap = std::unordered_map; class BytraceEventParser : private EventParserBase { public: BytraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter); - bool ParseDataItem(const BytraceLine& line, const ArgsMap& args, uint32_t tgid) const; + void ParseDataItem(const BytraceLine& line); + void FilterAllEvents(); private: using FuncCall = std::function; bool SchedSwitchEvent(const ArgsMap& args, const BytraceLine& line) const; bool TaskRenameEvent(const ArgsMap& args, const BytraceLine& line) const; bool TaskNewtaskEvent(const ArgsMap& args, const BytraceLine& line) const; - bool TracingMarkWriteEvent(const ArgsMap& args, const BytraceLine& line) const; + bool TracingMarkWriteOrPrintEvent(const ArgsMap& args, const BytraceLine& line); bool SchedWakeupEvent(const ArgsMap& args, const BytraceLine& line) const; bool SchedWakingEvent(const ArgsMap& args, const BytraceLine& line) const; bool CpuIdleEvent(const ArgsMap& args, const BytraceLine& line) const; @@ -63,15 +65,40 @@ private: bool BinderTransaction(const ArgsMap& args, const BytraceLine& line) const; bool BinderTransactionReceived(const ArgsMap& args, const BytraceLine& line) const; bool BinderTransactionAllocBufEvent(const ArgsMap& args, const BytraceLine& line) const; + void GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uint32_t& tgid) const; private: - const DataIndex ioWaitId_; - const DataIndex workQueueId_; - const DataIndex schedWakeupId_; - const DataIndex schedBlockedReasonId_; + class EventInfo { + public: + EventInfo(uint64_t ts, BytraceLine li) : eventTimestamp(ts), line(li) {} + uint64_t eventTimestamp; + BytraceLine line; + }; std::map eventToFunctionMap_ = {}; - const unsigned int MIN_SCHED_ARGS_COUNT = 6; + const unsigned int MIN_SCHED_SWITCH_ARGS_COUNT = 6; const unsigned int MIN_SCHED_WAKEUP_ARGS_COUNT = 2; + const unsigned int MIN_TASK_RENAME_ARGS_COUNT = 2; + const unsigned int MIN_SCHED_WAKING_ARGS_COUNT = 4; + const unsigned int MIN_CPU_IDLE_ARGS_COUNT = 2; + const unsigned int MIN_CPU_FREQUENCY_ARGS_COUNT = 2; + const unsigned int MIN_PROCESS_EXIT_ARGS_COUNT = 2; + const unsigned int MIN_CLOCK_SET_RATE_ARGS_COUNT = 3; + const unsigned int MIN_CLOCK_ENABLE_ARGS_COUNT = 3; + const unsigned int MIN_CLOCK_DISABLE_ARGS_COUNT = 3; + const unsigned int MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT = 2; + const unsigned int MIN_IRQ_HANDLER_EXIT_ARGS_COUNT = 2; + const unsigned int MIN_SOFTIRQ_ENTRY_ARGS_COUNT = 2; + const unsigned int MIN_SOFTIRQ_EXIT_ARGS_COUNT = 2; + const unsigned int MIN_BINDER_TRANSACTION_ARGS_COUNT = 7; + const unsigned int MIN_BINDER_TRANSACTION_RECEIVED_ARGS_COUNT = 1; + const unsigned int MIN_BINDER_TRANSACTION_ALLOC_BUF_ARGS_COUNT = 3; + std::vector> eventList_ = {}; PrintEventParser printEventParser_; + const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup"); + const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking"); + const DataIndex ioWaitId_ = traceDataCache_->GetDataIndex("io_wait"); + const DataIndex workQueueId_ = traceDataCache_->GetDataIndex("workqueue"); + const DataIndex schedWakeupId_ = traceDataCache_->GetDataIndex("sched_wakeup"); + const DataIndex schedBlockedReasonId_ = traceDataCache_->GetDataIndex("sched_blocked_reason"); }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp b/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp index cdf20e3..aa7fe93 100644 --- a/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp +++ b/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp @@ -23,11 +23,13 @@ namespace SysTuning { namespace TraceStreamer { BytraceParser::BytraceParser(TraceDataCache* dataCache, const TraceStreamerFilters* filters) : ParserBase(filters), - eventParser_(std::make_unique(dataCache, filters)), - dataSegArray(new DataSegment[MAX_SEG_ARRAY_SIZE]) + eventParser_(std::make_unique(dataCache, filters)) { #ifdef SUPPORTTHREAD - noThread_ = false; + supportThread_ = true; + dataSegArray = std::make_unique(MAX_SEG_ARRAY_SIZE); +#else + dataSegArray = std::make_unique(1); #endif } @@ -41,8 +43,7 @@ void BytraceParser::WaitForParserEnd() usleep(sleepDur_ * sleepDur_); } } - streamFilters_->cpuFilter_->FinishCpuEvent(); - streamFilters_->binderFilter_->FinishBinderEvent(); + eventParser_->FilterAllEvents(); } void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, size_t size) { @@ -51,14 +52,14 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, } packagesBuffer_.insert(packagesBuffer_.end(), &bufferStr[0], &bufferStr[size]); auto packagesBegin = packagesBuffer_.begin(); - while (1) { auto packagesLine = std::find(packagesBegin, packagesBuffer_.end(), '\n'); - if (packagesLine == packagesBuffer_.end()) { + if (packagesLine == packagesBuffer_.end() || packagesLine == packagesBuffer_.begin()) { break; } - - std::string bufferLine(packagesBegin, packagesLine); + // Support parsing windows file format(ff=dos) + auto extra = *(packagesLine - 1) == '\r' ? 1 : 0; + std::string bufferLine(packagesBegin, packagesLine - extra); if (IsTraceComment(bufferLine)) { traceCommentLines_++; @@ -90,6 +91,11 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, void BytraceParser::ParseTraceDataItem(const std::string& buffer) { + if (!supportThread_) { + dataSegArray[rawDataHead_].seg = std::move(buffer); + ParserData(dataSegArray[rawDataHead_]); + return; + } int head = rawDataHead_; while (!toExit_) { if (dataSegArray[head].status.load() != TS_PARSE_STATUS_INIT) { @@ -99,12 +105,10 @@ void BytraceParser::ParseTraceDataItem(const std::string& buffer) } dataSegArray[head].seg = std::move(buffer); dataSegArray[head].status = TS_PARSE_STATUS_SEPRATED; - if (!noThread_) { - rawDataHead_ = (rawDataHead_ + 1) % MAX_SEG_ARRAY_SIZE; - } + rawDataHead_ = (rawDataHead_ + 1) % MAX_SEG_ARRAY_SIZE; break; } - if (!parseThreadStarted_ && !noThread_) { + if (!parseThreadStarted_) { parseThreadStarted_ = true; int tmp = maxThread_; while (tmp--) { @@ -114,9 +118,6 @@ void BytraceParser::ParseTraceDataItem(const std::string& buffer) TS_LOGI("parser Thread:%d/%d start working ...\n", maxThread_ - tmp, maxThread_); } } - if (noThread_) { - ParserData(dataSegArray[head]); - } return; } int BytraceParser::GetNextSegment() @@ -188,38 +189,8 @@ void BytraceParser::GetDataSegAttr(DataSegment& seg, const std::smatch& matcheLi seg.bufLine.ts = static_cast(optionalTime.value() * 1e9); seg.bufLine.tGidStr = tGidStr; seg.bufLine.eventName = eventName; - GetDataSegArgs(seg); seg.status = TS_PARSE_STATUS_PARSED; } - -void BytraceParser::GetDataSegArgs(DataSegment& seg) const -{ - seg.args.clear(); - if (seg.bufLine.tGidStr != "-----") { - seg.tgid = base::StrToUInt32(seg.bufLine.tGidStr).value_or(0); - } else { - seg.tgid = 0; - } - - for (base::PartingString ss(seg.bufLine.argsStr, ' '); ss.Next();) { - std::string key; - std::string value; - if (!(std::string(ss.GetCur()).find("=") != std::string::npos)) { - key = "name"; - value = ss.GetCur(); - seg.args.emplace(std::move(key), std::move(value)); - continue; - } - for (base::PartingString inner(ss.GetCur(), '='); inner.Next();) { - if (key.empty()) { - key = inner.GetCur(); - } else { - value = inner.GetCur(); - } - } - seg.args.emplace(std::move(key), std::move(value)); - } -} void BytraceParser::ParseThread() { while (1) { @@ -251,14 +222,15 @@ void BytraceParser::ParserData(DataSegment& seg) parsedTraceValidLines_++; } GetDataSegAttr(seg, matcheLine); - if (!filterThreadStarted_ && !noThread_) { + if (!supportThread_) { + FilterData(seg); + return; + } + if (!filterThreadStarted_) { filterThreadStarted_ = true; std::thread ParserThread(&BytraceParser::FilterThread, this); ParserThread.detach(); } - if (noThread_) { - FilterData(seg); - } } void BytraceParser::FilterThread() { @@ -271,14 +243,21 @@ void BytraceParser::FilterThread() } bool BytraceParser::FilterData(DataSegment& seg) { + if (!supportThread_) { + eventParser_->ParseDataItem(seg.bufLine); + return true; + } if (seg.status.load() == TS_PARSE_STATUS_INVALID) { seg.status = TS_PARSE_STATUS_INIT; - if (!noThread_) { - filterHead_ = (filterHead_ + 1) % MAX_SEG_ARRAY_SIZE; - } + filterHead_ = (filterHead_ + 1) % MAX_SEG_ARRAY_SIZE; streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_OTHER, STAT_EVENT_DATA_INVALID); return true; } + if (!supportThread_) { + eventParser_->ParseDataItem(seg.bufLine); + seg.status = TS_PARSE_STATUS_INIT; + return true; + } if (seg.status.load() != TS_PARSE_STATUS_PARSED) { if (toExit_ && !parserThreadCount_) { TS_LOGI("exiting FilterThread Thread\n"); @@ -286,17 +265,11 @@ bool BytraceParser::FilterData(DataSegment& seg) filterThreadStarted_ = false; return false; } - if (!noThread_) { // wasm do not allow thread - usleep(sleepDur_); - } + usleep(sleepDur_); return true; } - BytraceLine line = seg.bufLine; - uint32_t tgid = seg.tgid; - eventParser_->ParseDataItem(line, seg.args, tgid); - if (!noThread_) { - filterHead_ = (filterHead_ + 1) % MAX_SEG_ARRAY_SIZE; - } + eventParser_->ParseDataItem(seg.bufLine); + filterHead_ = (filterHead_ + 1) % MAX_SEG_ARRAY_SIZE; seg.status = TS_PARSE_STATUS_INIT; return true; } @@ -304,12 +277,11 @@ bool BytraceParser::FilterData(DataSegment& seg) std::string BytraceParser::StrTrim(const std::string& input) const { std::string str = input; - auto posBegin = std::find_if(str.begin(), str.end(), IsNotSpace); - str.erase(str.begin(), posBegin); - - auto posEnd = std::find_if(str.rbegin(), str.rend(), IsNotSpace); - str.erase(posEnd.base(), str.end()); - + if (str.empty()) { + return str; + } + str.erase(0, str.find_first_not_of(" ")); + str.erase(str.find_last_not_of(" ") + 1); return str; } } // namespace TraceStreamer diff --git a/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h b/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h index 95c552e..2ebf862 100644 --- a/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h +++ b/host/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h @@ -54,7 +54,7 @@ private: enum ErrorCode { ERROR_CODE_EXIT = -2, ERROR_CODE_NODATA = -1 }; int GetNextSegment(); void GetDataSegAttr(DataSegment& seg, const std::smatch& matcheLine) const; - void GetDataSegArgs(DataSegment& seg) const; + void FilterThread(); inline static bool IsNotSpace(char c) { @@ -96,7 +96,7 @@ private: int rawDataHead_ = 0; int filterHead_ = 0; const int sleepDur_ = 100; - bool noThread_ = true; + bool supportThread_ = false; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/host/trace_streamer/src/parser/common_types.h b/host/trace_streamer/src/parser/common_types.h index 5d7c0a4..403b304 100644 --- a/host/trace_streamer/src/parser/common_types.h +++ b/host/trace_streamer/src/parser/common_types.h @@ -19,10 +19,14 @@ #include #include #include +#include "cpu_plugin_result.pb.h" +#include "diskio_plugin_result.pb.h" #include "hidump_plugin_result.pb.h" #include "hilog_plugin_result.pb.h" #include "memory_plugin_result.pb.h" #include "native_hook_result.pb.h" +#include "network_plugin_result.pb.h" +#include "process_plugin_result.pb.h" #include "services/common_types.pb.h" #include "trace_plugin_result.pb.h" #include "ts_common.h" @@ -70,16 +74,18 @@ enum ParseStatus { struct DataSegment { std::string seg; BytraceLine bufLine; - std::unordered_map args; - uint32_t tgid; std::atomic status{TS_PARSE_STATUS_INIT}; }; enum DataSourceType { DATA_SOURCE_TYPE_TRACE, DATA_SOURCE_TYPE_MEM, DATA_SOURCE_TYPE_HILOG, - DATA_SOURCE_TYPE_HEAP, - DATA_SOURCE_TYPE_FPS + DATA_SOURCE_TYPE_ALLOCATION, + DATA_SOURCE_TYPE_FPS, + DATA_SOURCE_TYPE_NETWORK, + DATA_SOURCE_TYPE_DISKIO, + DATA_SOURCE_TYPE_CPU, + DATA_SOURCE_TYPE_PROCESS, }; // 注意使用完之后恢复初始化状态,保证下次使用不会出现数据混乱。 struct HtraceDataSegment { @@ -88,14 +94,46 @@ struct HtraceDataSegment { HilogInfo logData; BatchNativeHookData batchNativeHookData; HidumpInfo hidumpInfo; + CpuData cpuInfo; + NetworkDatas networkInfo; + DiskioData diskIOInfo; + ProcessData processInfo; uint64_t timeStamp; - TracePluginResult traceData; + std::unique_ptr traceData; BuiltinClocks clockId; DataSourceType dataType; std::atomic status{TS_PARSE_STATUS_INIT}; }; -struct TracePoint { +class TracePoint { +public: + TracePoint() {} + TracePoint(const TracePoint& point) + { + phase_ = point.phase_; + tgid_ = point.tgid_; + name_ = point.name_; + value_ = point.value_; + categoryGroup_ = point.categoryGroup_; + chainId_ = point.chainId_; + spanId_ = point.spanId_; + parentSpanId_ = point.parentSpanId_; + flag_ = point.flag_; + args_ = point.args_; + } + void operator=(const TracePoint& point) + { + phase_ = point.phase_; + tgid_ = point.tgid_; + name_ = point.name_; + value_ = point.value_; + categoryGroup_ = point.categoryGroup_; + chainId_ = point.chainId_; + spanId_ = point.spanId_; + parentSpanId_ = point.parentSpanId_; + flag_ = point.flag_; + args_ = point.args_; + } char phase_ = '\0'; uint32_t tgid_ = 0; std::string name_ = ""; diff --git a/host/trace_streamer/prebuilts/buildprotobuf/protobuf.pro b/host/trace_streamer/src/parser/hiperf_parser/BUILD.gn similarity index 42% rename from host/trace_streamer/prebuilts/buildprotobuf/protobuf.pro rename to host/trace_streamer/src/parser/hiperf_parser/BUILD.gn index 16afcce..87ded10 100644 --- a/host/trace_streamer/prebuilts/buildprotobuf/protobuf.pro +++ b/host/trace_streamer/src/parser/hiperf_parser/BUILD.gn @@ -10,26 +10,40 @@ # 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. -QT -= gui core -TEMPLATE = lib -#TEMPLATE = app -CONFIG += c++14 lib -#CONFIG += c++14 -TARGET = protobuf -DEFINES += HAVE_PTHREAD +import("//build/ohos.gni") +import("../../ts.gni") +ohos_source_set("hiperf_parser_src") { + sources = [ "perf_data_parser.cpp" ] + include_dirs = [ + "hiperf/linux", + "hiperf/kernel", + ".", + "../../base", + "../../cfg", + "hiperf/include", + "../../include", + "../../", + "../../filter", + "../../trace_data", + "..", + "../htrace_parser", + "../../trace_streamer", + "//third_party/sqlite/include", + "${OHOS_PROTO_GEN}/types/plugins/memory_data", + "//third_party/protobuf/src", + "//third_party/perf_include", + ] +} -DEFINES += HAVE_PTHREAD -PROTOBUDIR = $$PWD/../../third_party/protobuf -ROOTSRCDIR = $$PWD/../../src/ -include($$PWD/../../src/multi_platform/global.pri) - -LIBS += -L$$DESTDIR/ -lstdc++ - -#INCLUDEPATH += $$PWD/$${PROTOBUDIR}/src -INCLUDEPATH += $$PWD/../../third_party/protobuf/src - -message("includepath is:"$$INCLUDEPATH) -include($$PWD/protobuf.pri) -include($$PWD/libprotobuf_lite_la_SOURCES.pri) -include($$PWD/libprotoc_la_SOURCES.pri) +group("hiperf_parser") { + deps = [ + ":hiperf_parser_src", + "hiperf:hiperf", + "//third_party/protobuf:protobuf", + "//third_party/protobuf:protobuf_lite", + ] + if (target != "test") { + deps += [ "//prebuilts/protos:ts_proto_data_cpp" ] + } +} diff --git a/host/trace_streamer/prebuilts/buildsqlite/sqlite.pro b/host/trace_streamer/src/parser/hiperf_parser/hiperf/BUILD.gn similarity index 32% rename from host/trace_streamer/prebuilts/buildsqlite/sqlite.pro rename to host/trace_streamer/src/parser/hiperf_parser/hiperf/BUILD.gn index 50d8082..29b5d8c 100644 --- a/host/trace_streamer/prebuilts/buildsqlite/sqlite.pro +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/BUILD.gn @@ -10,22 +10,65 @@ # 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. -QT -= gui core -TEMPLATE = lib -#TEMPLATE = app -CONFIG += c++14 lib -#CONFIG += c++14 -TARGET = sqlite -DEFINES += HAVE_PTHREAD -LIBDIR = $$PWD/../../third_party/sqlite -ROOTSRCDIR = $$PWD/../../src/ -include($$PWD/../../src/multi_platform/global.pri) +import("//build/ohos.gni") +import("../../../ts.gni") +ohos_source_set("hiperf_src") { + sources = [ + "callstack.cpp", + "callstack.h", + "debug_logger.cpp", + "debug_logger.h", + "dwarf_encoding.cpp", + "dwarf_encoding.h", + "elf_file.cpp", + "elf_header.cpp", + "elf_symbol.cpp", -LIBS += -L$$DESTDIR/ -lstdc++ + # "hashlist.hpp", + "hashlist.h", + "option.cpp", + "perf_event_record.cpp", -#INCLUDEPATH += $$PWD/$${PROTOBUDIR}/src -INCLUDEPATH += $$PWD/../../third_party/sqlite/include + # "perf_events.cpp", + "perf_file_format.cpp", + "perf_file_reader.cpp", + "program_header.cpp", + "register.cpp", + "register.h", + "report.cpp", -message("includepath is:"$$INCLUDEPATH) -SOURCES += $${LIBDIR}/src/sqlite3.c + # "ring_buffer.cpp", + "include/symbols_file.h", + "section_header.cpp", + "subcommand.cpp", + "subcommand_dump.cpp", + "symbols_file.cpp", + "utilities.cpp", + "virtual_runtime.cpp", + "virtual_thread.cpp", + ] + include_dirs = [ + "linux", + "kernel", + "../", + "./", + "../../../base", + "include", + "../../../include", + "../../../", + "../../../trace_streamer", + "//third_party/perf_include", + ] +} + +group("hiperf") { + deps = [ + ":hiperf_src", + "//third_party/protobuf:protobuf", + "//third_party/protobuf:protobuf_lite", + ] + if (target != "test") { + deps += [ "//prebuilts/protos:ts_proto_data_cpp" ] + } +} diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/callstack.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/callstack.cpp new file mode 100644 index 0000000..dc5ae0f --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/callstack.cpp @@ -0,0 +1,662 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "CallStack" + +#include "callstack.h" + +#include +#if HAVE_LIBUNWIND +#include +extern "C" { +#include +} +#endif + +#include "register.h" +#if defined(target_cpu_arm) +// reg size is int (unw_word_t) +#define UNW_WORD_PFLAG "x" +#elif defined(__arm__) && defined(target_cpu_x64) +// reg size is long long (unw_word_t) +#define UNW_WORD_PFLAG "llx" +#else +// reg size is long (unw_word_t) +#define UNW_WORD_PFLAG "zx" +#endif +namespace OHOS { +namespace Developtools { +namespace HiPerf { +#if HAVE_LIBUNWIND +const std::map UNW_ERROR_MAP = { + {UNW_ESUCCESS, std::to_string(UNW_ESUCCESS)}, + {UNW_EUNSPEC, std::to_string(UNW_EUNSPEC)}, + {UNW_ENOMEM, std::to_string(UNW_ENOMEM)}, + {UNW_EBADREG, std::to_string(UNW_EBADREG)}, + {UNW_EREADONLYREG, std::to_string(UNW_EREADONLYREG)}, + {UNW_ESTOPUNWIND, std::to_string(UNW_ESTOPUNWIND)}, + {UNW_EINVALIDIP, std::to_string(UNW_EINVALIDIP)}, + {UNW_EBADFRAME, std::to_string(UNW_EBADFRAME)}, + {UNW_EINVAL, std::to_string(UNW_EINVAL)}, + {UNW_EBADVERSION, std::to_string(UNW_EBADVERSION)}, + {UNW_ENOINFO, std::to_string(UNW_ENOINFO)}, +}; +const std::string CallStack::GetUnwErrorName(int error) +{ + if (UNW_ERROR_MAP.count(static_cast(-error)) > 0) { + return UNW_ERROR_MAP.at(static_cast(-error)); + } else { + return "UNKNOW_UNW_ERROR"; + } +} + +void CallStack::dumpUDI(unw_dyn_info_t &di) +{ + HLOGV("unwind_table info: "); + HLOGV(" di.start_ip: 0x%016" UNW_WORD_PFLAG "", di.start_ip); + HLOGV(" di.end_ip: 0x%016" UNW_WORD_PFLAG "", di.end_ip); + HLOGV(" di.u.rti.segbase: 0x%016" UNW_WORD_PFLAG "", di.u.rti.segbase); + HLOGV(" di.u.rti.table_data: 0x%016" UNW_WORD_PFLAG "", di.u.rti.table_data); + HLOGV(" di.u.rti.table_len: 0x%016" UNW_WORD_PFLAG "", di.u.rti.table_len); +} + +bool CallStack::fillUDI(unw_dyn_info_t &di, SymbolsFile &symbolsFile, const MemMapItem &mmap, + const VirtualThread &thread) +{ + di.start_ip = mmap.begin_; + di.end_ip = mmap.end_; +#ifndef target_cpu_arm + uint64_t fdeTableElfOffset, fdeTableSize, ehFrameHdrElfOffset; + if ((UNW_INFO_FORMAT_REMOTE_TABLE == di.format) && + symbolsFile.GetHDRSectionInfo(ehFrameHdrElfOffset, fdeTableElfOffset, fdeTableSize)) { + /* + unw_word_t name_ptr; // addr. of table name (e.g., library name) + unw_word_t segbase; // segment base + unw_word_t table_len; // must be a multiple of sizeof(unw_word_t)! + unw_word_t table_data; + */ + /* + all the rti addr is offset of the elf file + begin - page offset = elf file base addr in vaddr user space + begin - page offset + elf offset = vaddr in real word.(for this thread) + */ + + // segbase is file offset . + /* + 00200000-00344000 r--p 00000000 08:02 46404365 + 00344000-005c4000 r-xp 00143000 08:02 46404365 + + LOAD 0x00000000001439c0 0x00000000003449c0 0x00000000003449c0 + 0x000000000027f3c0 0x000000000027f3c0 R E 0x1000 + + GNU_EH_FRAME 0x00000000000f3248 0x00000000002f3248 0x00000000002f3248 + 0x000000000000bb04 0x000000000000bb04 R 0x4 + + */ + const MemMapItem *ehFrameMmap = thread.FindMapByFileInfo(mmap.name_, ehFrameHdrElfOffset); + + if (ehFrameMmap == nullptr) { + HLOGE("no ehframe mmap found."); + return false; + } + + di.u.rti.segbase = ehFrameMmap->begin_ + ehFrameHdrElfOffset - ehFrameMmap->pageoffset_; + di.u.rti.table_data = ehFrameMmap->begin_ + fdeTableElfOffset - ehFrameMmap->pageoffset_; + di.u.rti.table_len = fdeTableSize / sizeof(unw_word_t); + + HLOGV(" map pageoffset: 0x%016" PRIx64 "", mmap.pageoffset_); + HLOGV(" ehFrameHdrElfOffset: 0x%016" PRIx64 "", ehFrameHdrElfOffset); + HLOGV(" fdeTableElfOffset: 0x%016" PRIx64 "", fdeTableElfOffset); + HLOGV(" fdeTableSize: 0x%016" PRIx64 "", fdeTableSize); + return true; + } else { + HLOGD("SymbolsFile::GetHDRSectionInfo() failed"); + } +#else + uint64_t SectionVaddr, SectionSize, SectionFileOffset; + if ((UNW_INFO_FORMAT_ARM_EXIDX == di.format) && + symbolsFile.GetSectionInfo(ARM_EXIDX, SectionVaddr, SectionSize, SectionFileOffset)) { + const MemMapItem *targetMmap = thread.FindMapByFileInfo(mmap.name_, SectionFileOffset); + if (targetMmap == nullptr) { + HLOGE("no debug mmap found."); + return false; + } + HLOGV(" begin: %" PRIx64 " offset:%" PRIx64 "", targetMmap->begin_, + targetMmap->pageoffset_); + + di.u.rti.table_data = targetMmap->begin_ + SectionFileOffset - targetMmap->pageoffset_; + di.u.rti.table_len = SectionSize; + HLOGV(" SectionName: %s", std::string(ARM_EXIDX).c_str()); + HLOGV(" SectionVaddrt: 0x%016" PRIx64 "", SectionVaddr); + HLOGV(" SectionFileOffset 0x%016" PRIx64 "", SectionFileOffset); + HLOGV(" SectionSize: 0x%016" PRIx64 "", SectionSize); + + // GetSectionInfo return true, but SectionVaddr || SectionSize is 0 ??? + HLOG_ASSERT(SectionVaddr != 0 && SectionSize != 0); + return true; + } else { + HLOGD("SymbolsFile::GetSectionInfo() failed"); + } +#endif + return false; +} + +/* + https://www.nongnu.org/libunwind/man/libunwind-dynamic(3).html +*/ +int CallStack::FindUnwindTable(SymbolsFile *symbolsFile, const MemMapItem &mmap, + UnwindInfo *unwindInfoPtr, unw_addr_space_t as, unw_word_t ip, + unw_proc_info_t *pi, int need_unwind_info, void *arg) +{ + HLOGM("try search debug info at %s", symbolsFile->filePath_.c_str()); + auto &dynInfoProcessMap = unwindInfoPtr->callStack.unwindDynInfoMap_; + // all the thread in same process have same mmap and symbols + if (dynInfoProcessMap.find(unwindInfoPtr->thread.pid_) == dynInfoProcessMap.end()) { + dynInfoProcessMap.emplace(unwindInfoPtr->thread.pid_, dsoUnwDynInfoMap {}); + } + dsoUnwDynInfoMap &dynFileMap = dynInfoProcessMap[unwindInfoPtr->thread.pid_]; + // find use dso name as key + if (dynFileMap.find(symbolsFile->filePath_) == dynFileMap.end()) { + unw_dyn_info_t newdi; + if (memset_s(&newdi, sizeof(unw_dyn_info_t), 0, sizeof(unw_dyn_info_t)) != EOK) { + HLOGE("memset_s() failed"); + return -UNW_EUNSPEC; + } +#ifdef target_cpu_arm + // arm use .ARM.exidx , not use ehframe + newdi.format = UNW_INFO_FORMAT_ARM_EXIDX; +#else + // otherwise we use EH FRAME + newdi.format = UNW_INFO_FORMAT_REMOTE_TABLE; +#endif + if (fillUDI(newdi, *symbolsFile, mmap, unwindInfoPtr->thread)) { + dumpUDI(newdi); + // we make a option empty value first + std::optional &odi = dynFileMap[symbolsFile->filePath_]; + odi = newdi; + } else { + HLOGV("fillUDI failed()"); + return -UNW_EUNSPEC; + } + } + + HLOG_ASSERT(dynInfoProcessMap.find(unwindInfoPtr->thread.pid_) != dynInfoProcessMap.end()); + HLOG_ASSERT_MESSAGE(dynFileMap.find(symbolsFile->filePath_) != dynFileMap.end(), "%s", + symbolsFile->filePath_.c_str()); + std::optional &odi = + dynInfoProcessMap.at(unwindInfoPtr->thread.pid_).at(symbolsFile->filePath_); + + if (odi.has_value()) { + unw_dyn_info_t &di = odi.value(); + /* + we don't use dwarf_search_unwind_table + because in arm it will search two function: + 1 arm_search_unwind_table first + 2 dwarf_search_unwind_table + + see libunwind_i.h for arm + define tdep_search_unwind_table UNW_OBJ(search_unwind_table) + + */ + int ret = static_cast( + tdep_search_unwind_table(as, ip, &di, pi, need_unwind_info, arg)); + + HLOGM("search_unwind_table ret %d:%s", ret, GetUnwErrorName(ret).c_str()); + + if (UNW_ESUCCESS != ret) { + if (UNW_ENOINFO != ret) { + HLOGW("search_unwind_table ret error %d:%s", ret, GetUnwErrorName(ret).c_str()); + } + return -UNW_EUNSPEC; + } else { + return UNW_ESUCCESS; + } + } else { + HLOGW("no debug info found for thread %d:%s", unwindInfoPtr->thread.tid_, + unwindInfoPtr->thread.name_.c_str()); + return -UNW_EUNSPEC; + } +} + +int CallStack::FindProcInfo(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, + int need_unwind_info, void *arg) +{ + UnwindInfo *unwindInfoPtr = static_cast(arg); + + HLOGM("need_unwind_info ret %d ip %" UNW_WORD_PFLAG "", need_unwind_info, ip); + const MemMapItem *mmap = unwindInfoPtr->thread.FindMapByAddr(ip); + if (mmap != nullptr) { + SymbolsFile *symbolsFile = unwindInfoPtr->thread.FindSymbolsFileByMap(*mmap); + if (symbolsFile != nullptr) { + return FindUnwindTable(symbolsFile, *mmap, unwindInfoPtr, as, ip, pi, need_unwind_info, + arg); + } else { + HLOGW("no symbols file found for thread %d:%s", unwindInfoPtr->thread.tid_, + unwindInfoPtr->thread.name_.c_str()); + } + } else { + HLOGE("ip 0x%016" UNW_WORD_PFLAG " not found in thread %d:%s", ip, + unwindInfoPtr->thread.tid_, unwindInfoPtr->thread.name_.c_str()); + } + + return -UNW_EUNSPEC; +} + +bool CallStack::ReadVirtualThreadMemory(UnwindInfo &unwindInfoPtr, unw_word_t addr, + unw_word_t *data) +{ + auto process = unwindInfoPtr.callStack.porcessMemoryMap_.find(unwindInfoPtr.thread.pid_); + if (process != unwindInfoPtr.callStack.porcessMemoryMap_.end()) { + auto memory = process->second.find(addr); + if (memory != process->second.end()) { + *data = memory->second; + return true; + } + } + + if (unwindInfoPtr.thread.ReadRoMemory(addr, (uint8_t *)data, sizeof(unw_word_t))) { + unwindInfoPtr.callStack.porcessMemoryMap_[unwindInfoPtr.thread.pid_][addr] = *data; + return true; + } else { + return false; + } +} + +int CallStack::AccessMem([[maybe_unused]] unw_addr_space_t as, unw_word_t addr, + unw_word_t *valuePoint, int writeOperation, void *arg) +{ + UnwindInfo *unwindInfoPtr = static_cast(arg); + *valuePoint = 0; + HLOGDUMMY("try access addr 0x%" UNW_WORD_PFLAG " ", addr); + HLOG_ASSERT(writeOperation == 0); + + /* Check overflow. */ + if (addr + sizeof(unw_word_t) < addr) { + HLOGE("address overfolw at 0x%" UNW_WORD_PFLAG " increase 0x%zu", addr, sizeof(unw_word_t)); + return -UNW_EUNSPEC; + } + + if (addr < unwindInfoPtr->callStack.stackPoint_ or + addr + sizeof(unw_word_t) >= unwindInfoPtr->callStack.stackEnd_) { + if (ReadVirtualThreadMemory(*unwindInfoPtr, addr, valuePoint)) { + HLOGM("access_mem addr %p get val 0x%" UNW_WORD_PFLAG ", from mmap", + reinterpret_cast(addr), *valuePoint); + } else { + HLOGW("access_mem addr %p failed, from mmap, ", reinterpret_cast(addr)); + HLOGW("stack range 0x%" PRIx64 " - 0x%" PRIx64 "(0x%" PRIx64 ")", + unwindInfoPtr->callStack.stackPoint_, unwindInfoPtr->callStack.stackEnd_, + unwindInfoPtr->callStack.stackEnd_ - unwindInfoPtr->callStack.stackPoint_); + return -UNW_EUNSPEC; + } + } else { + size_t stackOffset = addr - unwindInfoPtr->callStack.stackPoint_; + *valuePoint = *(unw_word_t *)&unwindInfoPtr->callStack.stack_[stackOffset]; + HLOGM("access_mem addr %p val %" UNW_WORD_PFLAG ", from stack offset %zu", + reinterpret_cast(addr), *valuePoint, stackOffset); + } + + return UNW_ESUCCESS; +} + +int CallStack::AccessReg([[maybe_unused]] unw_addr_space_t as, unw_regnum_t regnum, + unw_word_t *valuePoint, int writeOperation, void *arg) +{ + UnwindInfo *unwindInfoPtr = static_cast(arg); + uint64_t val; + int perfRegIndex = LibunwindRegIdToPerfReg(regnum); + if (perfRegIndex < 0) { + HLOGE("can't read reg %d", perfRegIndex); + return perfRegIndex; + } + /* Don't support write, I suspect we don't need it. */ + if (writeOperation) { + HLOGE("access_reg %d", regnum); + return -UNW_EINVAL; + } + + if (unwindInfoPtr->callStack.regsNum_ == 0) { + return -UNW_EUNSPEC; + } + + if (!RegisterGetValue(val, unwindInfoPtr->callStack.regs_, static_cast(perfRegIndex), + unwindInfoPtr->callStack.regsNum_)) { + HLOGE("can't read reg %d", perfRegIndex); + return -UNW_EUNSPEC; + } + + *valuePoint = (unw_word_t)val; + HLOGM("reg %d:%s, val 0x%" UNW_WORD_PFLAG "", regnum, RegisterGetName(static_cast(perfRegIndex)).c_str(), + *valuePoint); + return UNW_ESUCCESS; +} + +void CallStack::PutUnwindInfo([[maybe_unused]] unw_addr_space_t as, + [[maybe_unused]] unw_proc_info_t *pi, [[maybe_unused]] void *arg) +{ +} + +int CallStack::AccessFpreg([[maybe_unused]] unw_addr_space_t as, [[maybe_unused]] unw_regnum_t num, + [[maybe_unused]] unw_fpreg_t *val, [[maybe_unused]] int writeOperation, + [[maybe_unused]] void *arg) +{ + return -UNW_EINVAL; +} + +int CallStack::GetDynInfoListAaddr([[maybe_unused]] unw_addr_space_t as, + [[maybe_unused]] unw_word_t *dil_vaddr, + [[maybe_unused]] void *arg) +{ + return -UNW_ENOINFO; +} + +int CallStack::Resume([[maybe_unused]] unw_addr_space_t as, [[maybe_unused]] unw_cursor_t *cu, + [[maybe_unused]] void *arg) +{ + return -UNW_EINVAL; +} + +int CallStack::getProcName([[maybe_unused]] unw_addr_space_t as, [[maybe_unused]] unw_word_t addr, + [[maybe_unused]] char *bufp, [[maybe_unused]] size_t buf_len, + [[maybe_unused]] unw_word_t *offp, [[maybe_unused]] void *arg) +{ + return -UNW_EINVAL; +} + +void CallStack::UnwindStep(unw_cursor_t &c, std::vector &callStack, size_t maxStackLevel) +{ + while (callStack.size() < maxStackLevel) { + int ret = unw_step(&c); + if (ret > 0) { + unw_word_t ip, sp; + unw_get_reg(&c, UNW_REG_IP, &ip); + unw_get_reg(&c, UNW_REG_SP, &sp); + + if (ip == 0) { + HLOGD("ip == 0 something is wrong. break"); + break; + } + + /* + * Decrement the IP for any non-activation frames. + * this is required to properly find the srcline + * for caller frames. + * See also the documentation for dwfl_frame_pc(), + * which this code tries to replicate. + */ + if (unw_is_signal_frame(&c) <= 0) { + --ip; + } + HLOGV("unwind:%zu: ip 0x%" UNW_WORD_PFLAG " sp 0x%" UNW_WORD_PFLAG "", callStack.size(), + ip, sp); + if (callStack.back().ip_ == ip && callStack.back().sp_ == sp) { + HLOGW("we found a same frame, stop here"); + break; + } + callStack.emplace_back(ip, sp); + } else { + HLOGV("no more frame step found. ret %d:%s", ret, GetUnwErrorName(ret).c_str()); + break; + } + } +} +#endif + +bool CallStack::GetIpSP(uint64_t &ip, uint64_t &sp, const u64 *regs, size_t regNum) const +{ + if (regNum > 0) { + if (!RegisterGetSPValue(sp, arch_, regs, regNum)) { + HLOGW("unable get sp"); + return false; + } + if (!RegisterGetIPValue(ip, arch_, regs, regNum)) { + HLOGW("unable get ip"); + return false; + } + if (ip != 0) { + return true; + } + } else { + HLOGW("reg size is 0"); + return false; + } + return false; +} + +#if HAVE_LIBUNWIND +bool CallStack::DoUnwind(const VirtualThread &thread, std::vector &callStack, + size_t maxStackLevel) +{ + unw_addr_space_t addr_space; + UnwindInfo unwindInfo = { + .thread = thread, + .callStack = *this, + }; + unw_cursor_t c; + if (unwindAddrSpaceMap_.count(thread.tid_) == 0) { + addr_space = unw_create_addr_space(&accessors_, 0); + if (!addr_space) { + HLOGE("Can't create unwind vaddress space."); + return false; + } + unwindAddrSpaceMap_.emplace(thread.tid_, addr_space); + unw_set_caching_policy(addr_space, UNW_CACHE_GLOBAL); + unw_flush_cache(addr_space, 0, 0); + } else { + addr_space = unwindAddrSpaceMap_.at(thread.tid_); + } + + int ret = unw_init_remote(&c, addr_space, &unwindInfo); + if (ret) { + HLOGE("unwind error %d:%s see unw_error_t.", ret, GetUnwErrorName(ret).c_str()); + return false; + } else { + UnwindStep(c, callStack, maxStackLevel); + } + return true; +} +#endif + +bool CallStack::UnwindCallStack(const VirtualThread &thread, bool abi32, u64 *regs, u64 regsNum, + const u8 *stack, u64 stackSize, std::vector &callStack, + size_t maxStackLevel) +{ + regs_ = regs; + regsNum_ = regsNum; + stack_ = stack; + stackSize_ = stackSize; + + arch_ = GetArchTypeFromABI(abi32); + UpdateRegForABI(arch_, regs_); + if (!RegisterGetSPValue(stackPoint_, arch_, regs_, regsNum_)) { + HLOGE("RegisterGetSPValue failed"); + return false; + } else { + stackEnd_ = stackPoint_ + stackSize_; + } + +#if HAVE_LIBUNWIND + uint64_t ip, sp; + if (!GetIpSP(ip, sp, regs_, regsNum_)) { + HLOGW("unable get sp or sp , unable unwind"); + return false; + } else { + if (ip != 0) { + HLOGV("unwind:%zu: ip 0x%" PRIx64 " sp 0x%" PRIx64 "", callStack.size(), ip, sp); + callStack.emplace_back(ip, sp); + } + } + + /* + * If we need more than one entry, do the DWARF + * unwind itself. + */ + if (maxStackLevel - 1 > 0) { + return DoUnwind(thread, callStack, maxStackLevel); + } +#endif + return true; +} + +void CallStack::LogFrame(const std::string msg, const std::vector &frames) +{ + HLOGM("%s", msg.c_str()); + int level = 0; + for (auto frame : frames) { + HLOGM("%d:%s", level++, frame.ToString().c_str()); + } +} + +/* +we should have CallStack cache for each thread +end begin +0. A -> B -> C -> E -> F +1. C -> E -> F +2. B -> C +3. A -> B -> C +4. B -> G -> H +5. J -> C + +0 is our cache +1 2 3... is from record + +use expandLimit to setup how may frame match is needs + +*/ +size_t CallStack::DoExpandCallStack(std::vector &newCallFrames, + const std::vector &cachedCallFrames, + size_t expandLimit) +{ + int maxCycle = 0; + + if (expandLimit == 0 or newCallFrames.size() < expandLimit or + cachedCallFrames.size() < expandLimit) { + HLOGM("expandLimit %zu not match new %zu cache %zu", expandLimit, newCallFrames.size(), + cachedCallFrames.size()); + return 0; // size not enough + } + + // called (Stack Buttom) , this will NOT change when compare + // in case1 newIt -> C + // in case2 newIt -> B + const auto newIt = newCallFrames.end() - expandLimit; + + HLOGM("try find new call chain bottom %s for limit %zu", newIt->ToString().c_str(), + expandLimit); + + // first frame search, from called - > caller + // for case 2 it should found B + size_t distances = expandLimit - 1; + auto cachedIt = find(cachedCallFrames.begin(), cachedCallFrames.end(), *newIt); + if (cachedIt == cachedCallFrames.end()) { + HLOGM("not found in first search"); + } + + // cache frame found + while (std::distance(cachedIt, cachedCallFrames.end()) >= signed(expandLimit)) { + HLOG_ASSERT_MESSAGE(maxCycle++ < MAX_CALL_FRAME_EXPAND_CYCLE, "MAX_UNWIND_CYCLE = %d reach", + MAX_CALL_FRAME_EXPAND_CYCLE); + + if (std::equal(newIt, newIt + expandLimit, cachedIt)) { + HLOGM("match %s + %zu", newIt->ToString().c_str(), expandLimit); + cachedIt += expandLimit; // in while we check the boundary safe + if (cachedIt == cachedCallFrames.end()) { + // same but no more need expand + break; + } + + // expand the frame and make some log ? + LogFrame("newCallStack:", newCallFrames); + LogFrame("cachedCallStack:", cachedCallFrames); + + newCallFrames.insert(newCallFrames.end(), cachedIt, cachedCallFrames.end()); + auto expands = std::distance(cachedIt, cachedCallFrames.end()); + HLOGV("merge callstack increse to %zu (+%zd) ", newCallFrames.size(), expands); + // we done the deal + return expands; + } else { + // quick search next same farme again + cachedIt++; + if (cachedIt != cachedCallFrames.end()) { + HLOGM("search next"); + cachedIt = find(cachedIt, cachedCallFrames.end(), *newIt); + } + } + } + HLOGM("cachedIt distance %zd , need %zd", std::distance(cachedCallFrames.begin(), cachedIt), + distances); + return 0u; // nothing expand +} + +size_t CallStack::ExpandCallStack(pid_t tid, std::vector &callFrames, size_t expandLimit) +{ + size_t expand = 0u; + if (expandLimit == 0) { + return expand; // nothing need to do + } else if (callFrames.size() < expandLimit) { + HLOGM("new callstack is too small, skip it"); + return expand; + } + if (!cachedCallFramesMap_.count(tid)) { + cachedCallFramesMap_[tid].reserve(MAX_CALL_FRAME_EXPAND_CACHE_SIZE); + } + if (callFrames.size() >= 1u) { + // get top (Earliest caller) + HashList> &cachedCallFrames = cachedCallFramesMap_[tid]; + HLOGV("find call stack frames in cache size %zu", cachedCallFrames.size()); + // compare + using namespace std::rel_ops; // enable complement comparing operators + for (auto itr = cachedCallFrames.begin(); itr < cachedCallFrames.end(); ++itr) { + // each cached callstack + /* + stack 2 1 0 + cache A -> B -> C + new B -> C + check: + 1 if new B == cache C + 2 if new B == cache B + 3 if new C == new C (if limit > 0) + 4 insert A after B in new stack + */ + const std::vector &cachedCallStack = *itr; + if (cachedCallStack.size() < expandLimit) { + HLOGM("cache callstack is too small, skip it"); + continue; // check next + } + expand = DoExpandCallStack(callFrames, cachedCallStack, expandLimit); + if (expand > 0) { + break; + } + } + // add new one in to cache cachedCallFrames. + // further optimization can be done by caching pointer which avoids copying + // vector + cachedCallFrames[callFrames[0].ip_] = callFrames; + } + HLOGM("expand %zu", expand); + return expand; +} + +CallStack::CallStack() {} + +CallStack::~CallStack() +{ +#if HAVE_LIBUNWIND + for (auto &pair : unwindAddrSpaceMap_) { + unw_destroy_addr_space(pair.second); + } +#endif +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/debug_logger.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/debug_logger.cpp new file mode 100644 index 0000000..171585d --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/debug_logger.cpp @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "debug_logger.h" + +#include + +#include "option.h" +#if is_ohos +#include "hiperf_hilog.h" +#endif + +using namespace std::literals::chrono_literals; +using namespace std::chrono; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +#ifdef HIPERF_DEBUG +DebugLogger::DebugLogger() : timeStamp_(steady_clock::now()), logPath_(DEFAULT_LOG_PATH) +{ + OpenLog(); +} + +ScopeDebugLevel::ScopeDebugLevel(DebugLevel level, bool mix) +{ + savedDebugLevel_ = DebugLogger::GetInstance()->SetLogLevel(level); + savedMixOutput_ = DebugLogger::GetInstance()->SetMixLogOutput(mix); +} + +ScopeDebugLevel::~ScopeDebugLevel() +{ + DebugLogger::GetInstance()->SetLogLevel(savedDebugLevel_); + DebugLogger::GetInstance()->SetMixLogOutput(savedMixOutput_); +} + +DebugLogger::~DebugLogger() +{ + Disable(); + if (file_ != nullptr) { + fclose(file_); + file_ = nullptr; + } +} + +void DebugLogger::Disable(bool disable) +{ + if (logDisabled_ != disable) { + logDisabled_ = disable; + if (!disable) { + // reopen the log file + OpenLog(); + } + } +} + +#if is_ohos +#ifndef CONFIG_NO_HILOG +int DebugLogger::HiLog(std::string &buffer) const +{ + size_t lastLF = buffer.find_last_of('\n'); + if (lastLF != std::string::npos) { + buffer.erase(lastLF, 1); + } + return OHOS::HiviewDFX::HiLog::Debug(HIPERF_HILOG_LABLE[MODULE_DEFAULT], "%{public}s", + buffer.c_str()); +} +#endif +#endif + +int DebugLogger::Log(DebugLevel level, const std::string &logTag, const char *fmt, ...) const +{ + constexpr const int DEFAULT_STRING_BUF_SIZE = 4096; +#ifdef HIPERF_DEBUG_TIME + const auto startSprintf = steady_clock::now(); +#endif + const auto startTime = steady_clock::now(); + if (!ShouldLog(level, logTag) or logDisabled_ or fmt == nullptr) { +#ifdef HIPERF_DEBUG_TIME + logTimes_ += duration_cast(steady_clock::now() - startSprintf); +#endif + return 0; + } + va_list va; + int ret = 0; + + std::string buffer(DEFAULT_STRING_BUF_SIZE, '\0'); + va_start(va, fmt); + ret = vsnprintf_s(buffer.data(), buffer.size(), buffer.size() - 1, fmt, va); + va_end(va); +#ifdef HIPERF_DEBUG_TIME + logSprintfTimes_ += duration_cast(steady_clock::now() - startSprintf); +#endif + if ((mixLogOutput_ and level < LEVEL_FATAL) or level == LEVEL_FATAL) { + ret = fprintf(stdout, "%s", buffer.data()); // to the stdout + } + + if (enableHilog_) { +#if is_ohos && !defined(CONFIG_NO_HILOG) + std::lock_guard lock(logMutex_); + ret = HiLog(buffer); // to the hilog +#endif + } else if (file_ != nullptr) { + std::lock_guard lock(logMutex_); +#ifdef HIPERF_DEBUG_TIME + const auto startWriteTime = steady_clock::now(); +#endif + milliseconds timeStamp = duration_cast(startTime - timeStamp_); + fprintf(file_, "%05" PRId64 "ms %s", (int64_t)timeStamp.count(), buffer.data()); // to the file +#ifdef HIPERF_DEBUG_TIME + logWriteTimes_ += duration_cast(steady_clock::now() - startWriteTime); +#endif + } + +#ifdef HIPERF_DEBUG_TIME + logTimes_ += duration_cast(steady_clock::now() - startTime); + logCount_++; +#endif + if (level == LEVEL_FATAL && exitOnFatal_) { + fflush(file_); + logDisabled_ = true; + exit(-1); + } + return ret; +} + +bool DebugLogger::EnableHiLog(bool enable) +{ + enableHilog_ = enable; + if (enable) { + if (fprintf(stdout, "change to use hilog\n") < 0) { + // what can we do here ??? + } + } + return enableHilog_; +} + +bool DebugLogger::ShouldLog(DebugLevel level, const std::string &logtag) const +{ + return GetLogLevelByTag(logtag) <= level; +} + +DebugLevel DebugLogger::SetLogLevel(DebugLevel debugLevel) +{ + DebugLevel lastLevel = DebugLogger::GetInstance()->debugLevel_; + debugLevel_ = debugLevel; + // force print + printf("setLogLevel %d\n", debugLevel); + return lastLevel; +} + +bool DebugLogger::SetMixLogOutput(bool enable) +{ + bool lastMixLogOutput = mixLogOutput_; + mixLogOutput_ = enable; + return lastMixLogOutput; +} + +bool DebugLogger::SetLogPath(const std::string &newLogPath) +{ + // make sure not write happend when rename + std::lock_guard lock(logMutex_); + if (newLogPath.empty() and newLogPath != logPath_) { + return false; + } + if (file_ != nullptr) { + fclose(file_); + file_ = nullptr; + if (rename(logPath_.c_str(), newLogPath.c_str()) != 0) { + // reopen the old log file path + OpenLog(); + return false; + } + } + logPath_ = newLogPath; + return OpenLog(); +} + +void DebugLogger::SetLogTags(const std::string &tags) +{ + HLOGI(" tags is '%s'", tags.c_str()); + auto tagLevels = StringSplit(tags, ","); + logTagLevelmap_.clear(); + for (auto tagLevel : tagLevels) { + auto tagLevelPair = StringSplit(tagLevel, ":"); + if (tagLevelPair.size() == 1) { // only tag + logTagLevelmap_[tagLevelPair[0]] = LEVEL_MUCH; + } else { // tag:level + logTagLevelmap_[tagLevelPair[0]] = GetLogLevelByName(tagLevelPair[1].c_str()); + } + } + for (auto it = logTagLevelmap_.begin(); it != logTagLevelmap_.end(); it++) { + HLOGD(" '%s'='%s'", it->first.c_str(), GetLogLevelName(it->second).c_str()); + } +} + +DebugLevel DebugLogger::GetLogLevelByTag(const std::string &tag) const +{ + if (logTagLevelmap_.count(tag) > 0) { + return logTagLevelmap_.at(tag); + } else { + return GetLogLevel(); + } +} + +const std::string DebugLogger::GetLogLevelName(DebugLevel level) const +{ + return DebugLevelMap.at(level); +} + +DebugLevel DebugLogger::GetLogLevelByName(const std::string &name) const +{ + for (auto it = DebugLevelMap.begin(); it != DebugLevelMap.end(); it++) { + if (it->second == name) { + return it->first; + } + } + // not found ? + return LEVEL_MUCH; +} + +// only use for UT +void DebugLogger::Reset() +{ + EnableHiLog(false); + SetLogLevel(LEVEL_VERBOSE); + Disable(false); + SetLogPath(DEFAULT_LOG_PATH); + SetLogTags(""); +} + +bool DebugLogger::RestoreLog() +{ + // use append not write for continually write + return OpenLog(logPath_, "a"); +} + +bool DebugLogger::OpenLog(const std::string &tempLogPath, const std::string &flags) +{ + std::lock_guard lock(logMutex_); + + if (logDisabled_) { + // don't reopen it when we crash or something else. + return false; + } + if (!tempLogPath.empty()) { + fclose(file_); + std::string resolvedPath = CanonicalizeSpecPath(tempLogPath.c_str()); + file_ = fopen(resolvedPath.c_str(), flags.c_str()); + } + if (file_ != nullptr) { + // already open + return true; + } else { + std::string resolvedPath = CanonicalizeSpecPath(logPath_.c_str()); + file_ = fopen(resolvedPath.c_str(), "w"); + } + if (file_ == nullptr) { + fprintf(stdout, "unable save log file to '%s' because '%d'\n", logPath_.c_str(), errno); + return false; + } else { + fseek(file_, 0, SEEK_SET); + // ecach log can save 6ms (29ms -> 23ms) + fprintf(stdout, "log will save at '%s'\n", logPath_.c_str()); + return true; + } +} + +__attribute__((weak)) DebugLevel DebugLogger::debugLevel_ = LEVEL_DEBUG; +__attribute__((weak)) bool DebugLogger::logDisabled_ = true; +std::unique_ptr DebugLogger::logInstance_; + +DebugLogger *DebugLogger::GetInstance() +{ + if (logInstance_ == nullptr) { + logInstance_ = std::make_unique(); + } + return logInstance_.get(); +} +#endif +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/dwarf_encoding.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/dwarf_encoding.cpp new file mode 100644 index 0000000..1cfb7bc --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/dwarf_encoding.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "Dwarf" + +#include "dwarf_encoding.h" + +#include "utilities.h" +namespace OHOS { +namespace Developtools { +namespace HiPerf { +DwarfEncoding::DwarfEncoding(dw_encode_t dw, const unsigned char *&data, uint64_t vaddrBase, + uint64_t vaddrPC, uint64_t vaddrText) + : dw_(dw), data_(data), vaddrBase_(vaddrBase), vaddrPC_(vaddrPC), vaddrText_(vaddrText) +{ + value_[0] = ReadValue(data); +} + +const std::string DwarfEncoding::ToString() const +{ + std::string debugString = ApplicationName() + ":" + FormatName() + " format:" + ToHex(dw_) + + " value size:" + std::to_string(GetSize()) + " raw:"; + + size_t size = GetSize(); + const unsigned char *data = data_; + while (size-- > 0) { + debugString.append(ToHex(data[0]) + " "); + data++; + } + + debugString.append(" | " + ToHex(GetValue(), GetSize(), true)); + debugString.append(" applied:" + ToHex(GetAppliedValue(), GetSize())); + return debugString; +} + +const unsigned char *DwarfEncoding::GetEnd() const +{ + return data_ + GetSize(); +} + +const unsigned char *DwarfEncoding::GetData() const +{ + return data_; +} + +size_t DwarfEncoding::GetSize() const +{ + return DWFormatSizeMap.at((dw_encode_t)Format()); +} + +uint64_t DwarfEncoding::GetValue() const +{ + return value_[0]; +} + +uint64_t DwarfEncoding::GetAppliedValue() const +{ + if ((Application() & DW_EH_PE_datarel) == DW_EH_PE_datarel) { + return value_[0] + vaddrBase_; + } else if ((Application() & DW_EH_PE_textrel) == DW_EH_PE_textrel) { + return value_[0] + vaddrText_; + } else if ((Application() & DW_EH_PE_pcrel) == DW_EH_PE_pcrel) { + return value_[0] + vaddrPC_; + } + HLOGM("Application is empty"); + + return value_[0]; +} + +bool DwarfEncoding::IsOmit() const +{ + return (dw_ == DW_EH_PE_omit); +} + +dw_encode_t DwarfEncoding::Format() const +{ + return (dw_ & 0x0F); +} +dw_encode_t DwarfEncoding::Application() const +{ + return (dw_ & 0xF0); +} +uint64_t DwarfEncoding::ReadValue(const unsigned char *&data) const +{ + switch (Format()) { + case DW_EH_PE_udata2: + return dwReadAnyTypeData(data, uint16_t()); + case DW_EH_PE_udata4: + return dwReadAnyTypeData(data, uint32_t()); + case DW_EH_PE_udata8: + return dwReadAnyTypeData(data, uint64_t()); + case DW_EH_PE_sdata2: + return dwReadAnyTypeData(data, int16_t()); + case DW_EH_PE_sdata4: + return dwReadAnyTypeData(data, int32_t()); + case DW_EH_PE_sdata8: + return dwReadAnyTypeData(data, int64_t()); + default: + return -1; + } +} +const std::string DwarfEncoding::FormatName() const +{ + switch (Format()) { + case DW_EH_PE_absptr: + return "DW_EH_PE_absptr"; + case DW_EH_PE_uleb128: + return "DW_EH_PE_uleb128"; + case DW_EH_PE_udata2: + return "DW_EH_PE_udata2"; + case DW_EH_PE_udata4: + return "DW_EH_PE_udata4"; + case DW_EH_PE_udata8: + return "DW_EH_PE_udata8"; + case DW_EH_PE_sleb128: + return "DW_EH_PE_sleb128"; + case DW_EH_PE_sdata2: + return "DW_EH_PE_data2"; + case DW_EH_PE_sdata4: + return "DW_EH_PE_sdata4"; + case DW_EH_PE_sdata8: + return "DW_EH_PE_sdata8"; + case DW_EH_PE_omit: + return "DW_EH_PE_omit"; + default: + return "unknown format"; + } +} +const std::string DwarfEncoding::ApplicationName() const +{ + switch (Application()) { + case DW_EH_PE_pcrel: + return "DW_EH_PE_pcrel"; + case DW_EH_PE_textrel: + return "DW_EH_PE_textrel"; + case DW_EH_PE_datarel: + return "DW_EH_PE_datarel"; + case DW_EH_PE_funcrel: + return "DW_EH_PE_funcrel"; + case DW_EH_PE_aligned: + return "DW_EH_PE_aligned"; + case DW_EH_PE_omit: + return "DW_EH_PE_omit"; + case DW_EH_PE_nothing: + return "DW_EH_PE_empty"; + default: + return "unknown format"; + } +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_file.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_file.cpp new file mode 100644 index 0000000..53894c9 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_file.cpp @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "string_help.h" +#include "utilities.h" + +using namespace OHOS::Developtools::HiPerf::ELF; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +ElfFile::ElfFile(const std::string &filename) +{ +#if is_mingw + std::string resolvedPath = CanonicalizeSpecPath(filename.c_str()); + fd_ = open(resolvedPath.c_str(), O_RDONLY | O_BINARY); +#else + std::string resolvedPath = CanonicalizeSpecPath(filename.c_str()); + fd_ = open(resolvedPath.c_str(), O_RDONLY); +#endif + if (fd_ != -1) { + struct stat sb; + if (fstat(fd_, &sb) == -1) { + HLOGE("unable to check the file size"); + } else { + HLOGD("file stat size %" PRIu64 "", sb.st_size); + + mmap_ = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fd_, 0); + if (mmap_ == MMAP_FAILED) { + HLOGE("unable to map the file size %" PRIu64 " ", sb.st_size); + mmapSize_ = 0; + } else { + mmapSize_ = sb.st_size; + HLOGD("mmap build with size %" PRIu64 " ", mmapSize_); + } + } + } +} + +ElfFile::~ElfFile() +{ + if (mmap_ != MMAP_FAILED) { + munmap(mmap_, mmapSize_); + } + + if (fd_ != -1) { + close(fd_); + fd_ = -1; + } +} + +std::unique_ptr ElfFile::MakeUnique(const std::string &filename) +{ + std::unique_ptr file {new (std::nothrow) ElfFile(filename)}; + if (file == nullptr) { + HLOGE("Error in ElfFile::MakeUnique(): ElfFile::ElfFile() failed"); + return nullptr; + } + if (!file->IsOpened()) { + HLOGE("Error in ElfFile::MakeUnique(): elf file not opended"); + return nullptr; + } + if (!file->ParseFile()) { + HLOGE("parse elf file failed"); + return nullptr; + } + return file; +} + +bool ElfFile::ParseFile() +{ + if (!ParseElfHeader()) { + HLOGE("Error in ElfFile::MakeUnique(): ElfFile::ParseElfHeader() failed"); + return false; + } + if (!ParsePrgHeaders()) { + HLOGE("Error in ElfFile::MakeUnique(): ElfFile::ParsePrgHeaders() failed"); + return false; + } + if (!ParseSecNamesStr()) { + HLOGE("Error in ElfFile::MakeUnique(): ElfFile::ParseSecNamesStr() failed"); + return false; + } + if (!ParseSecHeaders()) { + HLOGE("Error in ElfFile::MakeUnique(): ElfFile::ParseSecHeaders() failed"); + return false; + } + return true; +} + +bool ElfFile::ParseElfHeader() +{ + ssize_t ret = lseek(fd_, 0, SEEK_SET); + if (ret != 0) { + HLOGW("lseek ret %zu", ret); + return false; + } + HLOG_ASSERT(ret == 0); + unsigned char ehdrBuf[ehdr64Size] {0}; + size_t readsize = ReadFile(ehdrBuf, ehdr64Size); + if (readsize < ehdr64Size) { + HLOGW("file size not enough, try read %zu, only have %zu", ehdr64Size, readsize); + } + HLOG_ASSERT(readsize > 0); + ehdr_ = ElfHeader::MakeUnique(ehdrBuf, readsize); + return !(ehdr_ == nullptr); +} + +bool ElfFile::ParsePrgHeaders() +{ + size_t phdrSize = ehdr_->phdrEntSize_; + size_t numPhdrs = ehdr_->phdrNumEnts_; + uint64_t phdrOffset = ehdr_->phdrOffset_; + int64_t ret = lseek(fd_, phdrOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(phdrOffset)); + char *phdrsBuf = new (std::nothrow) char[phdrSize * numPhdrs]; + if (phdrsBuf == nullptr) { + HLOGE("Error in ELF::ElfFile::ParsePrgHeaders(): new failed"); + return false; + } + (void)memset_s(phdrsBuf, phdrSize * numPhdrs, 0, phdrSize * numPhdrs); + ret = ReadFile(phdrsBuf, phdrSize * numPhdrs); + if (ret != static_cast(phdrSize * numPhdrs)) { + delete[] phdrsBuf; + phdrsBuf = nullptr; + return false; + } + char *phdrBuf = phdrsBuf; + for (size_t count = 0; count < numPhdrs; ++count) { + std::unique_ptr phdr = ProgramHeader::MakeUnique(phdrBuf, phdrSize); + if (phdr == nullptr) { + delete[] phdrsBuf; + phdrsBuf = nullptr; + HLOGE("Error in Elf::ParsePrgHeaders(): ProgramHeader::MakeUnique() failed"); + return false; + } + phdrs_.push_back(std::move(phdr)); + phdrBuf += phdrSize; + } + delete[] phdrsBuf; + phdrsBuf = nullptr; + return true; +} + +bool ElfFile::ParseSecNamesStr() +{ + // get string table section header + size_t shdrSize = ehdr_->shdrEntSize_; + size_t shdrIndex = ehdr_->shdrStrTabIdx_; + uint64_t shdrOffset = ehdr_->shdrOffset_ + ((uint64_t)shdrIndex) * shdrSize; + int64_t ret = lseek(fd_, shdrOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(shdrOffset)); + char *shdrBuf = new (std::nothrow) char[shdrSize]; + if (shdrBuf == nullptr) { + HLOGE("Error in ElfFile::ParseSecNamesStr(): new failed"); + return false; + } + (void)memset_s(shdrBuf, shdrSize, 0, shdrSize); + ret = ReadFile(shdrBuf, shdrSize); + HLOG_ASSERT(ret == static_cast(shdrSize)); + const std::string secName {".shstrtab"}; + shdrs_[secName] = SectionHeader::MakeUnique(shdrBuf, shdrSize, shdrIndex); + if (shdrs_[secName] == nullptr) { + HLOGE("Error in ElfFile::ParseSecNamesStr(): SectionHeader::MakeUnique() failed"); + delete[] shdrBuf; + shdrBuf = nullptr; + return false; + } + delete[] shdrBuf; + shdrBuf = nullptr; + + // get content of string section table + uint64_t secOffset = shdrs_[secName]->fileOffset_; + size_t secSize = shdrs_[secName]->secSize_; + ret = lseek(fd_, secOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(secOffset)); + char *secNamesBuf = new (std::nothrow) char[secSize]; + if (secNamesBuf == nullptr) { + HLOGE("Error in ElfFile::ParseSecNamesStr(): new secNamesBuf failed"); + return false; + } + (void)memset_s(secNamesBuf, secSize, '\0', secSize); + ret = ReadFile(secNamesBuf, secSize); + if (ret != static_cast(secSize)) { + delete[] secNamesBuf; + secNamesBuf = nullptr; + return false; + } + secNamesStr_ = std::string(secNamesBuf, secNamesBuf + secSize); + delete[] secNamesBuf; + secNamesBuf = nullptr; + return true; +} + +bool ElfFile::ParseSecHeaders() +{ + size_t shdrSize = ehdr_->shdrEntSize_; + size_t numShdrs = ehdr_->shdrNumEnts_; + uint64_t shdrOffset = ehdr_->shdrOffset_; + int64_t ret = lseek(fd_, shdrOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(shdrOffset)); + char *shdrsBuf = new (std::nothrow) char[shdrSize * numShdrs]; + if (shdrsBuf == nullptr) { + HLOGE("Error in ELF::ElfFile::ParseSecHeaders(): new failed"); + return false; + } + (void)memset_s(shdrsBuf, shdrSize * numShdrs, '\0', shdrSize * numShdrs); + ret = ReadFile(shdrsBuf, shdrSize * numShdrs); + HLOG_ASSERT(ret == static_cast(shdrSize * numShdrs)); + char *shdrBuf = shdrsBuf; + for (size_t count = 0; count < numShdrs; ++count) { + if (count == ehdr_->shdrStrTabIdx_) { + shdrBuf += shdrSize; + continue; + } + std::unique_ptr shdr = SectionHeader::MakeUnique(shdrBuf, shdrSize, count); + if (shdr == nullptr) { + delete[] shdrsBuf; + shdrsBuf = nullptr; + return false; + } + std::string secName = GetSectionName(shdr->nameIndex_); + shdrs_[secName] = std::move(shdr); + shdr.reset(nullptr); + shdrBuf += shdrSize; + } + delete[] shdrsBuf; + shdrsBuf = nullptr; + return true; +} + +bool ElfFile::ParseSymTable(const std::string secName) +{ + if (shdrs_.find(secName) == shdrs_.end()) { + HLOGE("Error in ELF::ElfFile::ParseSymTable(): section %s does not exist", secName.c_str()); + return false; + } else { + return ParseSymTable(shdrs_[secName].get()); + } +} + +bool ElfFile::ParseSymTable(const SectionHeader *shdr) +{ + if (shdr == nullptr) { + return false; + } + uint64_t secOffset = shdr->fileOffset_; + int64_t ret = lseek(fd_, secOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(secOffset)); + uint64_t secSize = shdr->secSize_; + uint64_t entrySize = shdr->secEntrySize_; + char *secBuf = new (std::nothrow) char[secSize]; + if (secBuf == nullptr) { + HLOGE("Error in EFL::ElfFile::ParseSymTable(): new failed"); + return false; + } + ret = ReadFile(secBuf, secSize); + HLOG_ASSERT(ret == static_cast(secSize)); + symTable_ = SymbolTable::MakeUnique(symNamesStr_, secBuf, secSize, entrySize); + if (symTable_ == nullptr) { + delete[] secBuf; + secBuf = nullptr; + return false; + } + delete[] secBuf; + secBuf = nullptr; + return true; +} + +bool ElfFile::ParseSymNamesStr() +{ + const std::string secName {".strtab"}; + if (shdrs_.find(secName) == shdrs_.end()) { + HLOGE("Error in ElfFile::ParseSymNamesStr(): section %s does not exist", secName.c_str()); + return false; + } + const auto &shdr = shdrs_[secName]; + uint64_t secOffset = shdr->fileOffset_; + uint64_t secSize = shdr->secSize_; + int64_t ret = lseek(fd_, secOffset, SEEK_SET); + char *secBuf = new (std::nothrow) char[secSize]; + if (secBuf == nullptr) { + HLOGE("Error in ElfFile::ParsesymNamesStr(): new failed"); + return false; + } + (void)memset_s(secBuf, secSize, '\0', secSize); + ret = ReadFile(secBuf, secSize); + HLOG_ASSERT(ret == static_cast(secSize)); + symNamesStr_ = std::string(secBuf, secSize); + if (symNamesStr_ == "") { + delete[] secBuf; + secBuf = nullptr; + return false; + } + delete[] secBuf; + secBuf = nullptr; + return true; +} + +bool ElfFile::ParseDynSymTable() +{ + const std::string secName {".dynsym"}; + if (shdrs_.find(secName) == shdrs_.end()) { + HLOGE("Error in ELF::ElfFile::ParseSymTable(): section %s does not exist", secName.c_str()); + return false; + } + const auto &shdr = shdrs_[secName]; + uint64_t secOffset = shdr->fileOffset_; + int64_t ret = lseek(fd_, secOffset, SEEK_SET); + HLOG_ASSERT(ret == static_cast(secOffset)); + uint64_t secSize = shdr->secSize_; + uint64_t entrySize = shdr->secEntrySize_; + char *secBuf = new (std::nothrow) char[secSize]; + if (secBuf == nullptr) { + HLOGE("Error in EFL::ElfFile::ParseDynSymTable(): new failed"); + return false; + } + ret = ReadFile(secBuf, secSize); + HLOG_ASSERT(ret == static_cast(secSize)); + dynSymTable_ = SymbolTable::MakeUnique(symNamesStr_, secBuf, secSize, entrySize); + if (dynSymTable_ == nullptr) { + delete[] secBuf; + secBuf = nullptr; + return false; + } + delete[] secBuf; + secBuf = nullptr; + return true; +} + +std::string ElfFile::GetSectionName(const uint32_t startIndex) +{ + if (startIndex >= secNamesStr_.size()) { + HLOGF("out_of_range %s ,endIndex %d ", secNamesStr_.c_str(), startIndex); + return ""; + } + size_t endIndex {startIndex}; + for (; endIndex < secNamesStr_.size(); ++endIndex) { + if (secNamesStr_[endIndex] == '\0') { + break; + } + } + return secNamesStr_.substr(startIndex, endIndex - startIndex); +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_header.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_header.cpp new file mode 100644 index 0000000..c444eb9 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_header.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "elf_parser.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +namespace ELF { +std::unique_ptr ElfHeader::MakeUnique(unsigned char * const ehdrBuf, + const std::size_t bufSize) +{ + std::unique_ptr ehdr {new (std::nothrow) ElfHeader()}; + if (ehdr == nullptr) { + HLOGV("ElfHeader() failed"); + return nullptr; + } + if (!ehdr->Init(ehdrBuf, bufSize)) { + HLOGV("ElfHeader::Init(ehdrBuf, bufSize) failed\n"); + DumpEhdrBuf(reinterpret_cast(ehdrBuf), bufSize); + return nullptr; + } + return ehdr; +} + +bool ElfHeader::Init(unsigned char * const ehdrBuf, const std::size_t bufSize) +{ + std::string magicStr {ehdrBuf, ehdrBuf + SELFMAG}; + std::string elfMagic {ELFMAG}; + if (magicStr.compare(elfMagic) != 0) { + HLOGE("elf magic not found"); + return false; + } + if (memcpy_s(ehdrIdent_, EI_NIDENT, ehdrBuf, EI_NIDENT) != 0) { + HLOGE("init ehdrIdent_ failed"); + return false; + } + if (ehdrBuf[EI_CLASS] == ELFCLASS32 and ParseElf32Header(ehdrBuf, bufSize)) { + return true; + } + if (ehdrBuf[EI_CLASS] == ELFCLASS64 and ParseElf64Header(ehdrBuf, bufSize)) { + return true; + } + HLOGE("init elf header failed, elf header buffer dumped"); + return false; +} + +bool ElfHeader::ParseElf32Header(unsigned char * const ehdrBuf, const std::size_t bufSize) +{ + if (bufSize < ehdr32Size) { + HLOGE("bad elf32 header buffer"); + return false; + } + size_t curIndex {EI_NIDENT}; + uint16_t *u2Buf = reinterpret_cast(ehdrBuf + curIndex); + type_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + machine_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + uint32_t *u4Buf = reinterpret_cast(ehdrBuf + curIndex); + elfVersion_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u4Buf = reinterpret_cast(ehdrBuf + curIndex); + prgEntryVaddr_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u4Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrOffset_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u4Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrOffset_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u4Buf = reinterpret_cast(ehdrBuf + curIndex); + ehdrFlags_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + ehdrSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrEntSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrNumEnts_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrEntSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrNumEnts_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrStrTabIdx_ = u2Buf[0]; + +#ifdef HIPERF_DEBUG_ASSERT + curIndex += sizeof(uint16_t); + HLOG_ASSERT(curIndex == ehdrSize_); + HLOG_ASSERT(shdr32Size == ehdrSize_); +#endif + return true; +} + +bool ElfHeader::ParseElf64Header(unsigned char * const ehdrBuf, const std::size_t bufSize) +{ + if (bufSize < ehdr64Size) { + HLOGE("bad elf64 header buffer"); + return false; + } + size_t curIndex {EI_NIDENT}; + uint16_t *u2Buf = reinterpret_cast(ehdrBuf + curIndex); + type_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + machine_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + uint32_t *u4Buf = reinterpret_cast(ehdrBuf + curIndex); + elfVersion_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + uint64_t *u8Buf = reinterpret_cast(ehdrBuf + curIndex); + prgEntryVaddr_ = u8Buf[0]; + curIndex += sizeof(uint64_t); + + u8Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrOffset_ = u8Buf[0]; + curIndex += sizeof(uint64_t); + + u8Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrOffset_ = u8Buf[0]; + curIndex += sizeof(uint64_t); + + u4Buf = reinterpret_cast(ehdrBuf + curIndex); + ehdrFlags_ = u4Buf[0]; + curIndex += sizeof(uint32_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + ehdrSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrEntSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + phdrNumEnts_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrEntSize_ = u2Buf[0]; + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrNumEnts_ = static_cast(*u2Buf); + curIndex += sizeof(uint16_t); + + u2Buf = reinterpret_cast(ehdrBuf + curIndex); + shdrStrTabIdx_ = u2Buf[0]; + +#ifdef HIPERF_DEBUG_ASSERT + curIndex += sizeof(uint16_t); + HLOG_ASSERT(curIndex == ehdrSize_); + HLOG_ASSERT(shdr64Size == ehdrSize_); +#endif + return true; +} +} // namespace ELF +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_symbol.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_symbol.cpp new file mode 100644 index 0000000..7f26810 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/elf_symbol.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 + +using namespace OHOS::Developtools::HiPerf::ELF; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +std::unique_ptr ElfSymbol::MakeUnique(char * const symBuf, const std::size_t bufSize) +{ + std::unique_ptr sym {new (std::nothrow) ElfSymbol()}; + if (sym == nullptr) { + HLOGE("Error in ElfSymbol::MakeUnique(): ElfSymbol::ElfSymbol() failed"); + return nullptr; + } + if (!sym->Init(symBuf, bufSize)) { + HLOGE("ElfSymbol::Init(symBuf, bufSize) failed"); + DumpSymBuf(symBuf, bufSize); + return nullptr; + } + return sym; +} + +bool ElfSymbol::ParseElf32Symbol(char * const symBuf) +{ + uint32_t *u4Buf = reinterpret_cast(symBuf); + constexpr uint32_t nameOffset {0}; + nameIndex_ = u4Buf[nameOffset]; + constexpr uint32_t valueOffset {1}; + symValue_ = u4Buf[valueOffset]; + constexpr uint32_t sizeOffset {2}; + symSize_ = u4Buf[sizeOffset]; + constexpr uint32_t infoOffset {12}; + symInfo_ = symBuf[infoOffset]; + constexpr uint32_t otherInfoOffset {13}; + symOtherInfo_ = symBuf[otherInfoOffset]; + uint16_t *u2Buf = reinterpret_cast(symBuf); + constexpr uint32_t secOffset {7}; + secIndex_ = u2Buf[secOffset]; + return true; +} + +bool ElfSymbol::ParseElf64Symbol(char * const symBuf) +{ + uint32_t *u4Buf = reinterpret_cast(symBuf); + constexpr uint32_t nameOffset {0}; + nameIndex_ = u4Buf[nameOffset]; + constexpr uint32_t infoOffset {4}; + symInfo_ = symBuf[infoOffset]; + constexpr uint32_t otherInfoOffset {5}; + symOtherInfo_ = symBuf[otherInfoOffset]; + uint16_t *u2Buf = reinterpret_cast(symBuf); + constexpr uint32_t secOffset {3}; + secIndex_ = u2Buf[secOffset]; + uint64_t *u8Buf = reinterpret_cast(symBuf); + constexpr uint32_t valueOffset {1}; + symValue_ = u8Buf[valueOffset]; + constexpr uint32_t sizeOffset {2}; + symSize_ = u8Buf[sizeOffset]; + return true; +} + +std::unique_ptr SymbolTable::MakeUnique(const std::string &symNamesStr, + const char * const secBuf, + const uint64_t secSize, + const uint64_t entrySize) +{ + std::unique_ptr symTable {new (std::nothrow) SymbolTable(symNamesStr)}; + if (symNamesStr.empty()) { + HLOGE("symNamesStr is empty"); + } + if (symTable == nullptr) { + HLOGE("Error in SymbleTable::MakeUnique(): SymbleTable::SymbolTable() failed"); + return nullptr; + } + char *symBuf = const_cast(secBuf); + for (uint64_t curPos = 0; curPos < secSize; curPos += entrySize) { + symBuf = const_cast(secBuf + curPos); + /* + not >= , change to > + Section Headers: + [Nr] Name Type Address Offset + Size EntSize Flags Link Info Align + [ 0] NULL 0000000000000000 00000000 + 0000000000000000 0000000000000000 0 0 0 + [ 1] .text NOBITS 000000009c868f20 00000000 + 0000000000000164 0000000000000000 AX 0 0 4096 + [ 2] .strtab STRTAB 0000000000000000 00000040 + 0000000000000042 0000000000000000 0 0 4096 + [ 3] .symtab SYMTAB 0000000000000000 00000082 + 0000000000000030 0000000000000018 2 1 8 + [ 4] .debug_frame PROGBITS 0000000000000000 000000b2 + 00000000000000c8 0000000000000000 0 0 8 + [ 5] .shstrtab STRTAB 0000000000000000 0000017a + 000000000000002e 0000000000000000 0 0 1 + + Symbol table '.symtab' contains 2 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 000000009c868f20 356 FUNC GLOBAL DEFAULT 1 + */ + if ((curPos + entrySize) > secSize) { + break; + } + std::unique_ptr sym = ElfSymbol::MakeUnique(symBuf, entrySize); + if (sym == nullptr) { + HLOGE("Error in SymbolTable::MakeUnique(): ElfSymbol::MakeUnique() failed"); + return nullptr; + } + symTable->symbols_.emplace_back(std::move(sym)); + } + return symTable; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/hashlist.hpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/hashlist.hpp new file mode 100644 index 0000000..718c434 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/hashlist.hpp @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_HASHLIST_HPP +#define HIPERF_HASHLIST_HPP +#include "hashlist.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_HASHLIST_HPP diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/callstack.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/callstack.h new file mode 100644 index 0000000..57eb169 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/callstack.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 HIPERF_CALLSTACK_H +#define HIPERF_CALLSTACK_H + +#if HAVE_LIBUNWIND +// for libunwind.h empty struct has size 0 in c, size 1 in c++ +#define UNW_EMPTY_STRUCT uint8_t unused +#include +#endif + +#include +#include +#include +#include + +#if !is_mingw +#include +#endif + +#include "hashlist.h" +#include "register.h" +#include "utilities.h" +#include "virtual_thread.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +const int MAX_CALL_FRAME_EXPAND_CYCLE = 10; +const size_t MAX_CALL_FRAME_EXPAND_CACHE_SIZE = 10; +const size_t MAX_CALL_FRAME_UNWIND_SIZE = 256; +// if ip is 0 , 1 both not useful +const uint64_t BAD_IP_ADDRESS = 2; + +#if HAVE_LIBUNWIND +struct UnwindInfo; +#endif + +class CallStack { +public: + CallStack(); + ~CallStack(); + bool UnwindCallStack(const VirtualThread &thread, bool abi32, u64 *regs, u64 regsNum, + const u8 *stack, u64 stackSize, std::vector &, + size_t maxStackLevel = MAX_CALL_FRAME_UNWIND_SIZE); + size_t ExpandCallStack(pid_t tid, std::vector &callFrames, size_t expandLimit = 1u); + +private: + uint64_t stackPoint_ = 0; + uint64_t stackEnd_ = 0; + u64 *regs_ = nullptr; // not const , be cause we will fix it for arm64 cpu in UpdateRegForABI + u64 regsNum_ = 0; + const u8 *stack_ = nullptr; + u64 stackSize_ = 0; + + void LogFrame(const std::string msg, const std::vector &frames); + size_t DoExpandCallStack(std::vector &newCallFrames, + const std::vector &cachedCallFrames, size_t expandLimit); + + // we have a cache for all thread + std::map>> cachedCallFramesMap_; + bool GetIpSP(uint64_t &ip, uint64_t &sp, const u64 *regs, size_t regNum) const; + ArchType arch_ = ArchType::UNSUPPORT; +#if HAVE_LIBUNWIND + static bool ReadVirtualThreadMemory(UnwindInfo &unwindInfoPtr, unw_word_t addr, + unw_word_t *data); + static const std::string GetUnwErrorName(int error); + static void dumpUDI(unw_dyn_info_t &di); + static bool fillUDI(unw_dyn_info_t &di, SymbolsFile &symbolsFile, const MemMapItem &mmap, + const VirtualThread &thread); + static int FindProcInfo(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, + int need_unwind_info, void *arg); + static int AccessMem(unw_addr_space_t as, unw_word_t addr, unw_word_t *valuePoint, + int writeOperation, void *arg); + static int AccessReg(unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valuePoint, + int writeOperation, void *arg); + static void PutUnwindInfo(unw_addr_space_t as, unw_proc_info_t *pi, void *arg); + static int AccessFpreg(unw_addr_space_t as, unw_regnum_t num, unw_fpreg_t *val, + int writeOperation, void *arg); + static int GetDynInfoListAaddr(unw_addr_space_t as, unw_word_t *dil_vaddr, void *arg); + static int Resume(unw_addr_space_t as, unw_cursor_t *cu, void *arg); + static int getProcName(unw_addr_space_t as, unw_word_t addr, char *bufp, size_t buf_len, + unw_word_t *offp, void *arg); + static int FindUnwindTable(SymbolsFile *symbolsFile, const MemMapItem &mmap, + UnwindInfo *unwindInfoPtr, unw_addr_space_t as, unw_word_t ip, + unw_proc_info_t *pi, int need_unwind_info, void *arg); + void UnwindStep(unw_cursor_t &c, std::vector &callFrames, size_t maxStackLevel); + std::unordered_map unwindAddrSpaceMap_; + + using dsoUnwDynInfoMap = std::unordered_map>; + std::unordered_map unwindDynInfoMap_; + + using unwMemoryCache = std::unordered_map; + std::unordered_map porcessMemoryMap_; + + unw_accessors_t accessors_ = { + .find_proc_info = FindProcInfo, + .put_unwind_info = PutUnwindInfo, + .get_dyn_info_list_addr = GetDynInfoListAaddr, + .access_mem = AccessMem, + .access_reg = AccessReg, + .access_fpreg = AccessFpreg, + .resume = Resume, + .get_proc_name = getProcName, + }; + bool DoUnwind(const VirtualThread &thread, std::vector &callStack, + size_t maxStackLevel); +#endif +}; + +#if HAVE_LIBUNWIND +struct UnwindInfo { + const VirtualThread &thread; + const u64 *regs; + size_t regNumber; + ArchType arch; + CallStack &callStack; +}; +#endif +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_CALLSTACK_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/debug_logger.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/debug_logger.h new file mode 100644 index 0000000..b3e2bef --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/debug_logger.h @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_DEBUG_H +#define HIPERF_DEBUG_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#if !is_mingw +#include +#undef gettid +#define gettid() syscall(SYS_gettid) +#else +#include "windows.h" +inline long gettid() +{ + return GetCurrentThreadId(); +} +#endif // !is_mingw + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +enum DebugLevel { + LEVEL_MUCH = 1, + LEVEL_VERBOSE, + LEVEL_DEBUG, + LEVEL_INFO, + LEVEL_WARNING, + LEVEL_ERROR, + LEVEL_FATAL, + LEVEL_STDOUT, // printf + LEVEL_MAX, // max +}; + +#ifdef HIPERF_DEBUG +#if is_ohos || is_double_framework +const std::string DEFAULT_UT_LOG_DIR = "/data/local/tmp/"; +const std::string DEFAULT_LOG_PATH = "/data/local/tmp/hiperf_log.txt"; +#elif is_mingw +const std::string DEFAULT_LOG_PATH = ".\\hiperf_log.txt"; +#elif is_linux +const std::string DEFAULT_UT_LOG_DIR = "./"; +const std::string DEFAULT_LOG_PATH = "hiperf_log.txt"; +#else +#error unkow os +#endif + +#define HILOG_BASE_TAG "HILOG" +#ifndef HILOG_TAG +#define HILOG_TAG "" +#define HILOG_TAG_NAME HILOG_BASE_TAG +#else +#define HILOG_TAG_NAME HILOG_BASE_TAG "_" HILOG_TAG +#endif + +#define SHORT_FILENAME \ + (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__) + +const std::map DebugLevelMap = { + {LEVEL_MUCH, "M"}, {LEVEL_VERBOSE, "V"}, {LEVEL_DEBUG, "D"}, {LEVEL_INFO, "I"}, + {LEVEL_WARNING, "W"}, {LEVEL_ERROR, "E"}, {LEVEL_FATAL, "F"}, +}; +constexpr const int LOG_BUFFER_SIZE = 4 * 1024 * 1024; + +class DebugLogger { +public: + DebugLogger(); + ~DebugLogger(); + + static DebugLogger *GetInstance(); + DebugLevel SetLogLevel(DebugLevel debugLevel); + bool SetMixLogOutput(bool enable); + bool SetLogPath(const std::string &logPath); + void SetLogTags(const std::string &tags); + + int Log(DebugLevel level, const std::string &logTag, const char *fmt, ...) const + __attribute__((format(printf, 4, 5))); + // for class, pointer need add 1 offset (first one is *this) + + bool EnableHiLog(bool = true); + DebugLevel GetLogLevel() const + { + return debugLevel_; + }; + + void Disable(bool disable = true); + static bool logDisabled_; + +#ifdef HIPERF_DEBUG_TIME + mutable size_t logCount_ = 0; + mutable std::chrono::microseconds logTimes_ = std::chrono::microseconds::zero(); + mutable std::chrono::microseconds logWriteTimes_ = std::chrono::microseconds::zero(); + mutable std::chrono::microseconds logSprintfTimes_ = std::chrono::microseconds::zero(); +#endif + + // used in UT + bool OpenLog(const std::string & = "", const std::string & = "w"); + bool RestoreLog(); + void Reset(); + +private: + bool ShouldLog(DebugLevel debugLevel, const std::string &logTag) const; + DebugLevel GetLogLevelByName(const std::string &) const; + DebugLevel GetLogLevelByTag(const std::string &) const; + const std::string GetLogLevelName(DebugLevel) const; + + int HiLog(std::string &buffer) const; + + static std::unique_ptr logInstance_; + + mutable std::recursive_mutex logMutex_; + static DebugLevel debugLevel_; + const std::chrono::steady_clock::time_point timeStamp_; + FILE *file_ = nullptr; + bool mixLogOutput_ = false; // log mix to std + bool enableHilog_ = false; + bool exitOnFatal_ = true; + std::string logPath_; + std::map logTagLevelmap_; + + friend class OptionDebugTest; + friend class DebugLoggerTest; + FRIEND_TEST(DebugLoggerTest, SetLogTags); + FRIEND_TEST(DebugLoggerTest, Disable); +}; + +#ifdef HIPERF_DEBUG_PRINTF +#ifndef printf +#define printf(format, ...) \ + do { \ + std::printf(format, ##__VA_ARGS__); \ + DebugLogger::GetInstance()->Log(LEVEL_STDOUT, HILOG_TAG, format, ##__VA_ARGS__); \ + } while (0) +#endif + +#ifndef perror +#define perror(format, ...) \ + do { \ + std::perror(format); \ + DebugLogger::GetInstance()->Log(LEVEL_STDOUT, HILOG_TAG, format "<%d>\n", \ + ##__VA_ARGS__, errno); \ + } while (0) +#endif +#endif + +class ScopeDebugLevel { +public: + ScopeDebugLevel(DebugLevel level, bool mix = false); + ~ScopeDebugLevel(); + +private: + DebugLevel savedDebugLevel_; + bool savedMixOutput_ = false; // log mix to std +}; +#define TempMixLogLevel(level) ScopeDebugLevel tempLogLevel(level, true) + +#define LOG_LEVEL(LEVEL) LOG_##LEVEL +#define LOG_LEVEL_MUCH "M:" +#define LOG_LEVEL_VERBOSE "V:" +#define LOG_LEVEL_DEBUG "D:" +#define LOG_LEVEL_INFO "I:" +#define LOG_LEVEL_WARNING "W:" +#define LOG_LEVEL_ERROR "E:" +#define LOG_LEVEL_FATAL "F:" + +#ifndef HLOG +#define HLOG(level, format, ...) \ + do { \ + if (__builtin_expect(!DebugLogger::logDisabled_, false)) { \ + DebugLogger::GetInstance()->Log( \ + level, HILOG_TAG, \ + HILOG_TAG_NAME "/" LOG_LEVEL(level) "<%ld>[%s:%d]%s:" format "\n", gettid(), \ + SHORT_FILENAME, __LINE__, __FUNCTION__, ##__VA_ARGS__); \ + } \ + } while (0) +#endif + +// only log first n times +#ifndef HLOGV_FIRST +#define HLOGV_FIRST(first, format, ...) \ + do { \ + static int limit = first; \ + if (limit > 0) { \ + HLOG(LEVEL_VERBOSE, format, ##__VA_ARGS__); \ + if (--limit == 0) { \ + HLOG(LEVEL_VERBOSE, " nexttime log will be suppressed..."); \ + } \ + } \ + } while (0) +#endif + +#ifndef HLOGV_FIRST_LOCAL +#define HLOGV_FIRST_LOCAL(local_limit, format, ...) \ + { \ + if (local_limit != 0) { \ + HLOG(LEVEL_VERBOSE, format, ##__VA_ARGS__); \ + if (local_limit > 0 && --local_limit == 0) { \ + HLOG(LEVEL_VERBOSE, " nexttime log will be suppressed..."); \ + } \ + } \ + } +#endif + +#ifndef HLOGV +#define HLOGV_IF(condition, format, ...) \ + if (condition) { \ + HLOG(LEVEL_VERBOSE, format, ##__VA_ARGS__) \ + } +#define HLOGVVV HLOGV +#endif + +#ifndef HLOGDUMMY +#define HLOGDUMMY(format, ...) while (0) +#endif + +#ifndef HLOGM +#define HLOGM(format, ...) HLOG(LEVEL_MUCH, format, ##__VA_ARGS__) +#define HLOGMMM HLOGM +#endif + +#ifndef HLOGV +#define HLOGV(format, ...) HLOG(LEVEL_VERBOSE, format, ##__VA_ARGS__) +#endif + +#ifndef HLOGD +#define HLOGD(format, ...) HLOG(LEVEL_DEBUG, format, ##__VA_ARGS__) +#define HLOGDDD HLOGM +#endif + +#ifndef HLOGI +#define HLOGI(format, ...) HLOG(LEVEL_INFO, format, ##__VA_ARGS__) +#endif + +#ifndef HLOGW +#define HLOGW(format, ...) HLOG(LEVEL_WARNING, format, ##__VA_ARGS__) +#endif + +#ifndef HLOGE +#define HLOGE(format, ...) HLOG(LEVEL_ERROR, format, ##__VA_ARGS__) +#endif + +#ifndef HLOGEP +#define HLOGEP(format, ...) \ + HLOG(LEVEL_ERROR, format "(errno %d)", ##__VA_ARGS__, errno) +#endif + +#ifndef HLOGF +#define HLOGF(format, ...) \ + HLOG(LEVEL_FATAL, "FATAL error at %s:%d " format, __FILE__, __LINE__, ##__VA_ARGS__) +#endif + +#ifndef HLOG_ASSERT_MESSAGE +#define HLOG_ASSERT_MESSAGE(condition, format, ...) \ + if (!(condition)) { \ + HLOG(LEVEL_FATAL, " assert failed: '%s' " format, #condition, ##__VA_ARGS__); \ + } +#endif + +#ifndef HLOG_ASSERT +#define HLOG_ASSERT(condition) HLOG_ASSERT_MESSAGE(condition, "") +#endif + +#undef assert +#else +#define HLOGDUMMY(...) \ + do { \ + } while (0) +#define HLOGEP(...) \ + do { \ + } while (0) +#define HLOGM(...) \ + do { \ + } while (0) +#define HLOGMMM(...) \ + do { \ + } while (0) +#define HLOGV(...) \ + do { \ + } while (0) +#define HLOGVVV(...) \ + do { \ + } while (0) +#define HLOGD(...) \ + do { \ + } while (0) +#define HLOGDDD(...) \ + do { \ + } while (0) +#define HLOGI(...) \ + do { \ + } while (0) +#define HLOGW(...) \ + do { \ + } while (0) +#define HLOGE(...) \ + do { \ + } while (0) +#define HLOGF(...) \ + do { \ + } while (0) +#define HLOG_ASSERT_MESSAGE(...) \ + do { \ + } while (0) +#define HLOG_ASSERT(...) \ + do { \ + } while (0) + +class ScopeDebugLevel { +public: + ScopeDebugLevel(DebugLevel level, bool mix = false) {} +}; +#endif +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // _HIPERF_DEBUG_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/dwarf_encoding.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/dwarf_encoding.h new file mode 100644 index 0000000..0417890 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/dwarf_encoding.h @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 DWARF_ENCODING_H +#define DWARF_ENCODING_H + +#include "utilities.h" + +// now we only support 64 bit. +using uleb128_t = uint64_t; +using sleb128_t = int64_t; + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static constexpr const int LEB_BYTE_EFFECTIVE_LENGTH = 7; +static constexpr const int SIGN_BIT_OF_BYTE = 0x40; +static constexpr const int MAX_VALUE_OF_BYTE = 0x7f; +static constexpr const int MORE_BIT_OF_BYTE = 0x80; + +/* +10.5.1. DWARF Exception Header Encoding +The DWARF Exception Header Encoding is used to describe the type of data used in the .eh_frame and +.eh_frame_hdr section. The upper 4 bits indicate how the value is to be applied. The lower 4 bits +indicate the format of the data. +using dw_encode_t = unsigned char; // 4 bits + 4 bits +*/ + +using dw_encode_t = unsigned char; // 4 bits + 4 bits + +// Table 10-5. DWARF Exception Header value format + +enum DW_EH_PE_VF { + DW_EH_PE_absptr = 0x00, // a literal pointer whose size is determined by the architecture. + DW_EH_PE_uleb128 = 0x01, // Unsigned value is encoded using the Little Endian Base 128 (LEB128) + DW_EH_PE_udata2 = 0x02, // A 2 bytes unsigned value. + DW_EH_PE_udata4 = 0x03, // A 4 bytes unsigned value. + DW_EH_PE_udata8 = 0x04, // An 8 bytes unsigned value. + DW_EH_PE_sleb128 = 0x09, // Signed value is encoded using the Little Endian Base 128(LEB128) + DW_EH_PE_sdata2 = 0x0A, // A 2 bytes signed value. + DW_EH_PE_sdata4 = 0x0B, // A 4 bytes signed value. + DW_EH_PE_sdata8 = 0x0C, // An 8 bytes signed value. +}; + +// Table 10-6. DWARF Exception Header application +enum DW_EH_PE_A { + DW_EH_PE_nothing = 0x00, // nothing to do + DW_EH_PE_pcrel = 0x10, // relative to the current program counter. + DW_EH_PE_textrel = 0x20, // relative to the beginning of the .text section. + DW_EH_PE_datarel = 0x30, // relative to the beginning of the .got or .eh_frame_hdr section. + DW_EH_PE_funcrel = 0x40, // relative to the beginning of the function. + DW_EH_PE_aligned = 0x50, // aligned to an address unit sized boundary. + DW_EH_PE_omit = 0xff, // indicate that no value ispresent. +}; + +const std::map DWFormatSizeMap = { +#ifdef ARM + {DW_EH_PE_absptr, 4}, +#else + {DW_EH_PE_absptr, 8}, +#endif +#ifdef NOT_USE + {DW_EH_PE_uleb128, sizeof(char) * 128}, +#endif + {DW_EH_PE_udata2, sizeof(char) * 2}, + {DW_EH_PE_udata4, sizeof(char) * 4}, + {DW_EH_PE_udata8, sizeof(char) * 8}, +#ifdef NOT_USE + {DW_EH_PE_sleb128, sizeof(char) * 128}, +#endif + {DW_EH_PE_sdata2, sizeof(char) * 2}, + {DW_EH_PE_sdata4, sizeof(char) * 4}, + {DW_EH_PE_sdata8, sizeof(char) * 8}, +}; + +template +uint64_t dwReadAnyTypeData(const unsigned char *&buffer, T) +{ + T value; + if (memcpy_s(&value, sizeof(T), buffer, sizeof(T)) != 0) { + return 0; + } + buffer += sizeof(T); + return static_cast(value); +} + +class DwarfEncoding { +public: + DwarfEncoding(dw_encode_t dw, const unsigned char *&data, uint64_t vaddrBase = 0, + uint64_t vaddrPC = 0, uint64_t vaddrText = 0); + + const std::string ToString() const; + + const unsigned char *GetEnd() const; + + const unsigned char *GetData() const; + + size_t GetSize() const; + + uint64_t GetValue() const; + + uint64_t GetAppliedValue() const; + + bool IsOmit() const; + +private: + dw_encode_t dw_; + const unsigned char *data_; + uint64_t vaddrBase_ = 0; + uint64_t vaddrPC_ = 0; + uint64_t vaddrText_ = 0; + uint64_t value_[2] = {0, 0}; + + dw_encode_t Format() const; + + dw_encode_t Application() const; + + uint64_t ReadValue(const unsigned char *&data) const; + + const std::string FormatName() const; + + const std::string ApplicationName() const; +}; + +/* +Linux Standard Base Core Specification 4.1 +Chapter 10. Object Format +10.6.2. The .eh_frame_hdr section + +Table 10-11. .eh_frame_hdr Section Format + +Encoding Field +unsigned byte version +unsigned byte eh_frame_ptr_enc +unsigned byte fde_count_enc +unsigned byte table_enc +encoded eh_frame_ptr +encoded fde_count + binary search table +*/ + +struct binary_search_table { + uint64_t ipVaddrOffset; + uint64_t fdeVaddrOffset; +}; + +struct eh_frame_hdr { + // Version of the .eh_frame_hdr format. This value shall be 1. + dw_encode_t version; + + // The encoding format of the eh_frame_ptr field. + dw_encode_t eh_frame_ptr_enc; + + // The encoding format of the fde_count field. A value of DW_EH_PE_omit indicates the binary + // search table is not present. + dw_encode_t fde_count_enc; + + // The encoding format of the entries in the binary search table. A value of DW_EH_PE_omit + // indicates the binary search table is not present. + dw_encode_t table_enc; + + // The encoded value of the pointer to the start of the .eh_frame section. + /* + dw_encode_t eh_frame_ptr + dw_encode_t fde_count + */ + // A binary search table containing fde_count entries. Each entry of the table consist of two + // encoded values, the initial location, and the address. The entries are sorted in an + // increasing order by the initial location value. + + /* + * struct { + * encoded start_ip + * encoded fde_addr + * } binary_search_table[fde_count] + */ + unsigned char encode_data[0]; +} PACKED; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // DWARF_ENCODING_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/elf_parser.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/elf_parser.h new file mode 100644 index 0000000..f757d24 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/elf_parser.h @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 ELF_PARSER_H_ +#define ELF_PARSER_H_ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "debug_logger.h" +#include "noncopyable.h" +#include "utilities.h" + +#if !is_mingw +#include +#include +#endif + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +namespace ELF { +using namespace std::string_literals; + +constexpr std::size_t ehdr32Size {52}; +constexpr std::size_t ehdr64Size {64}; +constexpr std::size_t shdr32Size {40}; +constexpr std::size_t shdr64Size {64}; +constexpr std::size_t phdr32Size {32}; +constexpr std::size_t phdr64Size {56}; +constexpr std::size_t symEnt32Size {16}; +constexpr std::size_t symEnt64Size {24}; + +class ElfHeader { +public: + static std::unique_ptr MakeUnique(unsigned char * const ehdrBuf, + const std::size_t bufSize); + bool Init(unsigned char * const ehdrBuf, const std::size_t bufSize); + + unsigned char ehdrIdent_[EI_NIDENT]; + uint16_t type_; + uint16_t machine_; + uint16_t ehdrSize_; + uint16_t phdrEntSize_; + uint16_t phdrNumEnts_; + uint16_t shdrEntSize_; + uint16_t shdrNumEnts_; + uint16_t shdrStrTabIdx_; + uint32_t elfVersion_; + uint32_t ehdrFlags_; + uint64_t prgEntryVaddr_; + uint64_t phdrOffset_; + uint64_t shdrOffset_; + +private: + explicit ElfHeader() = default; + bool ParseElf32Header(unsigned char * const ehdrBuf, const std::size_t bufSize); + bool ParseElf64Header(unsigned char * const ehdrBuf, const std::size_t bufSize); + static inline void DumpEhdrBuf(const char * const ehdrBuf, const std::size_t bufSize) + { + const std::string fileName {"ehdr_buffer_dump"}; + std::ofstream ofs {fileName, std::ios::binary}; + if (ofs.is_open()) { + ofs.write(ehdrBuf, bufSize); + } + } +}; + +class ProgramHeader { +public: + static std::unique_ptr MakeUnique(char * const phdrBuf, const size_t bufSize); + inline bool Init(char * const phdrBuf, const size_t bufSize) + { + if (bufSize == phdr32Size and ParsePrgHeader32(phdrBuf)) { + return true; + } + if (bufSize == phdr64Size and ParsePrgHeader64(phdrBuf)) { + return true; + } + HLOGE("parse program header failed, program header buffer dumped"); + return false; + } + + uint32_t type_; + uint32_t flags_; + uint64_t offset_; + uint64_t vaddr_; + uint64_t paddr_; + uint64_t fileSize_; + uint64_t memSize_; + uint64_t secAlign_; + +private: + explicit ProgramHeader() = default; + bool ParsePrgHeader32(char * const phdrBuf); + bool ParsePrgHeader64(char * const phdrBuf); + static inline void DumpPhdrBuf(const char * const phdrBuf, const std::size_t bufSize) + { + const std::string fileName {"phdr_buffer_dump"}; + std::ofstream ofs {fileName, std::ios::binary}; + if (ofs.is_open()) { + ofs.write(phdrBuf, bufSize); + } + } +}; + +class SectionHeader { +public: + static std::unique_ptr MakeUnique(char * const shdrBuf, const size_t bufSize, + const size_t index); + + inline bool Init(char * const shdrBuf, const size_t bufSize, const size_t index) + { + secIndex_ = index; + if (bufSize == shdr32Size and ParseSecHeader32(shdrBuf)) { + return true; + } + if (bufSize == shdr64Size and ParseSecHeader64(shdrBuf)) { + return true; + } + HLOGE("parse section header failed, section header buffer dumped"); + return false; + } + + uint32_t nameIndex_; + uint32_t link_; + uint32_t info_; + uint64_t secFlags_; + uint64_t secVaddr_; + uint64_t fileOffset_; + uint64_t secSize_; + uint64_t secAddrAlign_; + uint64_t secEntrySize_; + uint64_t secType_; + uint32_t secIndex_; + std::string secTypeName_; + +private: + explicit SectionHeader() = default; + bool ParseSecHeader32(char * const shdrBuf); + bool ParseSecHeader64(char * const shdrBuf); + static inline void DumpShdrBuf(const char * const shdrBuf, const std::size_t bufSize) + { + const std::string fileName {"shdr_buffer_dump"}; + std::ofstream ofs {fileName, std::ios::binary}; + if (ofs.is_open()) { + ofs.write(shdrBuf, bufSize); + } + } +}; + +class ElfSymbol { +public: + static std::unique_ptr MakeUnique(char * const symBuf, const std::size_t bufSize); + inline bool Init(char * const symBuf, const std::size_t bufSize) + { + if (bufSize == symEnt32Size and ParseElf32Symbol(symBuf)) { + return true; + } + if (bufSize == symEnt64Size and ParseElf64Symbol(symBuf)) { + return true; + } + HLOGE("parse elf symbol failed, symbol buffer dumped"); + return false; + } + + uint16_t secIndex_; + uint32_t nameIndex_; + uint64_t symValue_; + uint64_t symSize_; + unsigned char symInfo_; + unsigned char symOtherInfo_; + +private: + explicit ElfSymbol() = default; + bool ParseElf32Symbol(char * const symBuf); + bool ParseElf64Symbol(char * const symBuf); + static inline void DumpSymBuf(const char * const symBuf, const std::size_t bufSize) + { + const std::string fileName {"shdr_buffer_dump"}; + std::ofstream ofs {fileName, std::ios::binary}; + if (ofs.is_open()) { + ofs.write(symBuf, bufSize); + } + } +}; + +class SymbolTable { +public: + static std::unique_ptr MakeUnique(const std::string &symNamesStr, + const char * const secBuf, + const uint64_t secSize, + const uint64_t entrySize); + + std::vector> symbols_; + +private: + explicit SymbolTable(const std::string &symNamesStr) : symNamesStr_ {symNamesStr} {} + + const std::string symNamesStr_ {}; +}; + +class ElfFile : public Noncopyable { +public: + virtual ~ElfFile(); + static std::unique_ptr MakeUnique(const std::string &filename); + bool ParseFile(); + bool ParseSymTable(const SectionHeader *shdr); + std::string GetSectionName(const uint32_t startIndex); + + inline bool IsOpened() const + { + return fd_ != -1; + } + + inline const char *GetStrPtr(uint32_t sh_link, uint32_t st_name) + { + for (const auto &shdrsItem : shdrs_) { + if (shdrsItem.second->secIndex_ == sh_link) { + if (mmap_ != MMAP_FAILED) { + char *elfFileBegin = (char *)mmap_; + return elfFileBegin + shdrsItem.second->fileOffset_ + st_name; + } + } + } + HLOGE("string not found sh_link %u st_name %d", sh_link, st_name); + return nullptr; + } + + inline const unsigned char *GetSectionData(uint32_t shIndex) + { + for (const auto &shdrsItem : shdrs_) { + if (shdrsItem.second->secIndex_ == shIndex) { + if (mmap_ != MMAP_FAILED) { + const unsigned char *elfFileBegin = (const unsigned char *)mmap_; + return elfFileBegin + shdrsItem.second->fileOffset_; + } + } + } + HLOGE("string not found shIndex %u ", shIndex); + return nullptr; + } + + using SecHeaderTableType = std::unordered_map>; + using PrgHeaderTableType = std::vector>; + int fd_ {-1}; + std::unique_ptr ehdr_ {nullptr}; + SecHeaderTableType shdrs_ {}; + PrgHeaderTableType phdrs_ {}; + std::string secNamesStr_ {}; + std::string symNamesStr_ {}; + std::unique_ptr symTable_ {nullptr}; + std::unique_ptr dynSymTable_ {nullptr}; + +protected: + // for fuzz test we make a virtual function + virtual ssize_t ReadFile(void *buf, size_t count) + { + return read(fd_, buf, count); + }; + explicit ElfFile(const std::string &filename); + +private: + bool ParseElfHeader(); + bool ParsePrgHeaders(); + bool ParseSecNamesStr(); + bool ParseSecHeaders(); + bool ParseSymNamesStr(); + bool ParseSymTable(const std::string = ".symtab"); + bool ParseDynSymTable(); + + void *mmap_ = MMAP_FAILED; + uint64_t mmapSize_ = 0; +}; +} // namespace ELF +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // ELF_PARSER_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/hashlist.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/hashlist.h new file mode 100644 index 0000000..02f81c1 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/hashlist.h @@ -0,0 +1,1146 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 HIPERF_HASHLIST_H +#define HIPERF_HASHLIST_H + +#include + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class Link { +public: + Link() = default; + ~Link() = default; + Link(const Link &link) : prev_ {link.prev_}, next_ {link.next_} {} + Link(Link &&link) : prev_ {link.prev_}, next_ {link.next_} + { + link.prev_ = nullptr; + link.next_ = nullptr; + } + Link &operator=(const Link &link) + { + prev_ = link.prev_; + next_ = link.next_; + return *this; + } + Link &operator=(Link &&link) + { + prev_ = link.prev_; + link.prev_ = nullptr; + next_ = link.next_; + link.next_ = nullptr; + return *this; + } + Link *prev_ {nullptr}; + Link *next_ {nullptr}; +}; + +template +class LinkNode { +public: + Link link_ {}; + Key key_ {}; + Val val_ {}; + + explicit LinkNode() = default; + ~LinkNode() = default; + explicit LinkNode(const Key &key); + explicit LinkNode(const Key &key, const Val &val); + explicit LinkNode(const Key &key, Val &&val); + LinkNode(const LinkNode &node); + LinkNode(LinkNode &&node); + LinkNode &operator=(const LinkNode &node); + LinkNode &operator=(LinkNode &&node); + static LinkNode *GetLinkNode(Val *pval); + static LinkNode *GetLinkNode(Link *plink); +}; + +template +class HashList { +public: + class Iterator { + public: + Iterator() = default; + ~Iterator() = default; + explicit Iterator(LinkNode *pnode, HashList *phashList); + explicit Iterator(const LinkNode *pnode, const HashList *phashList); + Iterator(const Iterator &itr); + Iterator(Iterator &&itr); + Iterator &operator=(const Iterator &itr); + Iterator &operator=(Iterator &&itr); + Iterator &operator++() noexcept; + Iterator operator++(int) noexcept; + Iterator &operator--() noexcept; + Iterator operator--(int) noexcept; + bool operator<(const Iterator &itr) const noexcept; + bool operator==(const Iterator &itr) const noexcept; + Val &operator*(); + const Val &operator*() const; + Val *operator->(); + const Val *operator->() const; + void swap(HashList::Iterator &other); + LinkNode *GetNode() const + { + return pnode_; + } + + private: + bool IsDangled() const noexcept + { + return phashList_ == nullptr; + } + + LinkNode *pnode_ {nullptr}; + HashList *phashList_ {nullptr}; + }; + + class ReverseIterator { + public: + ReverseIterator() = default; + ~ReverseIterator() = default; + explicit ReverseIterator(LinkNode *pnode, HashList *phashList); + explicit ReverseIterator(const LinkNode *pnode, const HashList *phashList); + ReverseIterator(const ReverseIterator &itr); + ReverseIterator(ReverseIterator &&itr); + ReverseIterator &operator=(const ReverseIterator &itr); + ReverseIterator &operator=(ReverseIterator &&itr); + ReverseIterator &operator++() noexcept; + ReverseIterator operator++(int) noexcept; + ReverseIterator &operator--() noexcept; + ReverseIterator operator--(int) noexcept; + bool operator<(const ReverseIterator &itr) const noexcept; + bool operator==(const ReverseIterator &itr) const noexcept; + Val &operator*(); + const Val &operator*() const; + Val *operator->(); + const Val *operator->() const; + void swap(HashList::ReverseIterator &other); + + LinkNode *GetNode() + { + return pnode_; + } + + private: + bool IsDangled() const noexcept + { + return phashList_ == nullptr; + } + + LinkNode *pnode_ {nullptr}; + HashList *phashList_ {nullptr}; + }; + +public: + explicit HashList(const std::size_t numItem = 0); + ~HashList(); + + HashList(const HashList &source) = delete; + HashList &operator=(const HashList &source) = delete; + HashList(HashList &&source); + HashList &operator=(HashList &&source); + + // capacity + inline std::size_t size() const + { + return valueTab_.size(); + } + inline bool empty() const + { + return (dataHead_.next_ == &dataHead_) and (dataHead_.prev_ == &dataHead_); + } + inline std::size_t capacity() const + { + return numItem_; + } + inline bool IsFull() const + { + return freeHead_.next_ == &freeHead_; + } + inline std::size_t count(const Key &key) const + { + return valueTab_.count(key); + } + + int reserve(const std::size_t numItem); + // iterators + Iterator begin(); + const Iterator cbegin() const; + Iterator end(); + const Iterator cend() const; + ReverseIterator rbegin(); + const ReverseIterator crbegin() const; + ReverseIterator rend(); + const ReverseIterator crend() const; + // element access + Val &front(); + const Val &front() const; + Val &back(bool prepend = false); + Val &operator[](const Key &key); + // lookup + Iterator find(const Key &key); + // modifiers + void push_front(const Key &key, const Val &val); + void push_front(const Key &key, Val &&val); + void push_back(const Key &key, const Val &val); + void push_back(const Key &key, Val &&val); + void pop_front(); + void pop_back(); + Iterator erase(const Key &key); + Iterator erase(const Iterator pos); + Iterator erase(const Iterator first, const Iterator last); + +private: + void MoveToHead(LinkNode *&pnode); + void MoveToTail(LinkNode *&pnode); + bool MoveNode(const Iterator &pos, LinkNode *&pnode); + LinkNode *AllocateNode(const Key &key); + LinkNode *AllocateNode(const Key &key, const Val &val); + LinkNode *AllocateNode(const Key &key, Val &&val); + void ReclaimNode(LinkNode *&pnode); + + std::size_t numItem_ {0}; + LinkNode *pData_ {nullptr}; + Link dataHead_ {}; + Link freeHead_ {}; + std::unordered_map *> valueTab_ {}; +}; +// implementation of template class LinkNode +template +LinkNode::LinkNode(const Key &key) : key_ {key} {} + +template +LinkNode::LinkNode(const Key &key, const Val &val) : key_ {key}, val_ {val} {} + +template +LinkNode::LinkNode(const Key &key, Val &&val) : key_ {key}, val_ {std::move(val)} {} + +template +LinkNode::LinkNode(const LinkNode& node) + :link_ {node.link_}, + key_ {node.key_}, + val_ {node.val_} +{} + +template +LinkNode::LinkNode(LinkNode&& node) + :link_ {std::move(node.link_)}, + key_ {std::move(node.key_)}, + val_ {std::move(node.val_)} +{} + +template +auto LinkNode::operator=(const LinkNode& node) +-> LinkNode& +{ + link_ = node.link_; + key_ = node.key_; + val_ = node.val_; +} + +template +auto LinkNode::operator=(LinkNode&& node) +-> LinkNode& +{ + link_ = std::move(node.link_); + key_ = std::move(node.key_); + val_ = std::move(node.val_); +} + +template +auto LinkNode::GetLinkNode(Val *pval) +-> LinkNode* +{ + if (pval) { + LinkNode *pnode {nullptr}; + Val* offset = &pnode->val_; + auto nodeAddr = reinterpret_cast(pval) - reinterpret_cast(offset); + return reinterpret_cast*>(nodeAddr); + } + return nullptr; +} + +template +auto LinkNode::GetLinkNode(Link *plink) +-> LinkNode* +{ + if (plink) { + LinkNode *pnode {nullptr}; + Link* offset = &pnode->link_; + auto nodeAddr = reinterpret_cast(plink) - reinterpret_cast(offset); + return reinterpret_cast*>(nodeAddr); + } + return nullptr; +} +// end of LinkNode + +// implementation of template class Iterator +template +HashList::Iterator::Iterator(LinkNode *pnode, HashList *phashList) + : pnode_ {pnode}, phashList_ {phashList} +{ + if (phashList_ == nullptr) { + pnode_ = nullptr; + } +} + +template +HashList::Iterator::Iterator(const LinkNode* pnode, const HashList* phashList) + : pnode_{const_cast*>(pnode)}, phashList_{const_cast(phashList)} +{ + if (phashList_ == nullptr) { + pnode_ = nullptr; + } +} + +template +HashList::Iterator::Iterator(const Iterator& itr) + : pnode_ {itr.pnode_}, phashList_ {itr.phashList_} +{} + +template +HashList::Iterator::Iterator(Iterator&& itr) + : pnode_ {itr.pnode_}, phashList_ {itr.phashList_} +{ + itr.pnode_ = nullptr; + itr.phashList_ = nullptr; +} + +template +auto HashList::Iterator::operator=(const Iterator& itr) +-> HashList::Iterator& +{ + Iterator temp {itr}; + swap(temp); + return *this; +} + +template +auto HashList::Iterator::operator=(Iterator&& itr) +-> HashList::Iterator& +{ + Iterator temp {std::move(itr)}; + swap(temp); + return *this; +} + +template +auto HashList::Iterator::operator++() noexcept +-> HashList::Iterator & +{ + if (pnode_ == nullptr or phashList_ == nullptr) { + phashList_ = nullptr; + return *this; + } + Link* plink = pnode_->link_.next_; + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + return *this; + } + auto pnode = LinkNode::GetLinkNode(plink); + pnode_ = pnode; + return *this; +} + +template +auto HashList::Iterator::operator++(int) noexcept +-> HashList::Iterator +{ + Iterator res {*this}; + if (pnode_ == nullptr or phashList_ == nullptr) { + phashList_ = nullptr; + return res; + } + Link* plink = pnode_->link_.next_; + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + return res; + } + auto pnode = LinkNode::GetLinkNode(plink); + pnode_ = pnode; + return res; +} + +template +auto HashList::Iterator::operator--() noexcept +-> HashList::Iterator & +{ + if (phashList_ == nullptr) { + return *this; + } + Link* plink {nullptr}; + if (pnode_ == nullptr) { + plink = phashList_->dataHead_.prev_; + } else { + plink = pnode_->link_.prev_; + } + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + phashList_ = nullptr; + return *this; + } + pnode_ = LinkNode::GetLinkNode(plink); + return *this; +} + +template +auto HashList::Iterator::operator--(int) noexcept +-> HashList::Iterator +{ + Iterator res {*this}; + if (phashList_ == nullptr) { + return res; + } + Link* plink {nullptr}; + if (pnode_ == nullptr) { + plink = phashList_->dataHead_.prev_; + } else { + plink = pnode_->link_.prev_; + } + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + phashList_ = nullptr; + return res; + } + pnode_ = LinkNode::GetLinkNode(plink); + return res; +} + +template +bool HashList::Iterator::operator<(const HashList::Iterator &itr) const noexcept +{ + if (IsDangled() or itr.IsDangled()) { + return false; + } + if (phashList_ != itr.phashList_) { + return false; + } + Iterator tempItr {*this}; + if (tempItr == itr) { + return false; + } + while (!tempItr.IsDangled()) { + tempItr++; + if (tempItr == itr) { + return true; + } + } + return false; +} + +template +bool HashList::Iterator::operator==(const HashList::Iterator &itr) const noexcept +{ + if (IsDangled() or itr.IsDangled()) { + return false; + } + if (phashList_ != itr.phashList_) { + return false; + } + return pnode_ == itr.pnode_; +} + +template +Val& HashList::Iterator::operator*() +{ + return pnode_->val_; +} + +template +const Val& HashList::Iterator::operator*() const +{ + return pnode_->val_; +} + +template +Val* HashList::Iterator::operator->() +{ + return &pnode_->val_; +} + +template +const Val* HashList::Iterator::operator->() const +{ + return &pnode_->val_; +} + +template +void HashList::Iterator::swap(HashList::Iterator& other) +{ + using std::swap; + swap(pnode_, other.pnode_); + swap(phashList_, other.phashList_); +} +// end of Iterator + +// Implementation of ReverseIterator +template +HashList::ReverseIterator::ReverseIterator(LinkNode *pnode, HashList *phashList) + : pnode_ {pnode}, phashList_ {phashList} +{ + if (phashList_ == nullptr) { + pnode_ = nullptr; + } +} + +template +HashList::ReverseIterator::ReverseIterator(const LinkNode *pnode, const HashList *phashList) + : pnode_ {const_cast *>(pnode)}, + phashList_ {const_cast(phashList)} +{ + if (phashList_ == nullptr) { + pnode_ = nullptr; + } +} + +template +HashList::ReverseIterator::ReverseIterator(const ReverseIterator &itr) + : pnode_ {itr.pnode_}, phashList_ {itr.phashList_} +{} + +template +HashList::ReverseIterator::ReverseIterator(ReverseIterator &&itr) + : pnode_ {itr.pnode_}, phashList_ {itr.phashList_} +{ + itr.pnode_ = nullptr; + itr.phashList_ = nullptr; +} + +template +auto HashList::ReverseIterator::operator=(const ReverseIterator& itr) +-> HashList::ReverseIterator& +{ + ReverseIterator temp {itr}; + swap(temp); + return *this; +} + +template +auto HashList::ReverseIterator::operator=(ReverseIterator&& itr) +-> HashList::ReverseIterator& +{ + ReverseIterator temp {std::move(itr)}; + swap(temp); + return *this; +} + +template +auto HashList::ReverseIterator::operator++() noexcept +-> HashList::ReverseIterator & +{ + if (pnode_ == nullptr or phashList_ == nullptr) { + phashList_ = nullptr; + return *this; + } + Link* plink = &pnode_->link_; + plink = plink->prev_; + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + return *this; + } + pnode_ = LinkNode::GetLinkNode(plink); + return *this; +} + +template +auto HashList::ReverseIterator::operator++(int) noexcept +-> HashList::ReverseIterator +{ + ReverseIterator res {*this}; + if (pnode_ == nullptr or phashList_ == nullptr) { + phashList_ = nullptr; + return res; + } + Link* plink = &pnode_->link_; + plink = plink->prev_; + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + return res; + } + pnode_ = LinkNode::GetLinkNode(plink); + return res; +} + +template +auto HashList::ReverseIterator::operator--() noexcept +-> HashList::ReverseIterator & +{ + if (phashList_ == nullptr) { + return *this; + } + Link* plink {nullptr}; + if (pnode_ == nullptr) { + plink = phashList_->dataHead_.next_; + } else { + plink = pnode_->link_.next_; + } + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + phashList_ = nullptr; + return *this; + } + pnode_ = LinkNode::GetLinkNode(plink); + return *this; +} + +template +auto HashList::ReverseIterator::operator--(int) noexcept +-> HashList::ReverseIterator +{ + ReverseIterator res {*this}; + if (phashList_ == nullptr) { + return res; + } + Link* plink {nullptr}; + if (pnode_ == nullptr) { + plink = phashList_->dataHead_.next_; + } else { + plink = pnode_->link_.next_; + } + if (plink == &phashList_->dataHead_) { + pnode_ = nullptr; + phashList_ = nullptr; + return res; + } + pnode_ = LinkNode::GetLinkNode(plink); + return res; +} + +template +bool HashList::ReverseIterator::operator<( + const HashList::ReverseIterator &itr) const noexcept +{ + if (IsDangled() or itr.IsDangled()) { + return false; + } + if (phashList_ != itr.phashList_) { + return false; + } + HashList::ReverseIterator tempItr {*this}; + if (tempItr == itr) { + return false; + } + while (!tempItr.IsDangled()) { + tempItr++; + if (tempItr == itr) { + return true; + } + } + return false; +} + +template +bool HashList::ReverseIterator::operator==( + const HashList::ReverseIterator &itr) const noexcept +{ + if (IsDangled() or itr.IsDangled()) { + return false; + } + if (phashList_ != itr.phashList_) { + return false; + } + return pnode_ == itr.pnode_; +} + +template +Val& HashList::ReverseIterator::operator*() +{ + return pnode_->val_; +} + +template +const Val& HashList::ReverseIterator::operator*() const +{ + return pnode_->val_; +} + +template +Val* HashList::ReverseIterator::operator->() +{ + return &pnode_->val_; +} + +template +const Val* HashList::ReverseIterator::operator->() const +{ + return &pnode_->val_; +} + +template +void HashList::ReverseIterator::swap(HashList::ReverseIterator& other) +{ + using std::swap; + swap(pnode_, other.pnode_); + swap(phashList_, other.phashList_); +} +// end of ReverseIterator + +// implementation of template class HashList +template +HashList::HashList(const std::size_t numItem) : numItem_ {numItem} +{ + dataHead_.next_ = &dataHead_; + dataHead_.prev_ = &dataHead_; + if (numItem_) { + valueTab_.reserve(numItem_); + pData_ = new(std::nothrow) LinkNode[numItem_]; + if (pData_) { + freeHead_.next_ = &(pData_[0].link_); + std::size_t last {numItem_ - 1}; + for (std::size_t index = 0; index < last;) { + LinkNode &curNnode = pData_[index]; + curNnode.link_.next_ = &(pData_[++index].link_); + } + pData_[last].link_.next_ = &freeHead_; + } else { + numItem_ = 0; + freeHead_.next_ = &freeHead_; + freeHead_.prev_ = &freeHead_; + } + } +} + +template +int HashList::reserve(const std::size_t numItem) +{ + if (numItem_ != 0) { + return -1; + } + if (numItem) { + numItem_ = numItem; + valueTab_.reserve(numItem_); + pData_ = new(std::nothrow) LinkNode[numItem_]; + dataHead_.next_ = &dataHead_; + dataHead_.prev_ = &dataHead_; + if (pData_) { + freeHead_.next_ = &(pData_[0].link_); + std::size_t last {numItem_ - 1}; + for (std::size_t index = 0; index < last;) { + LinkNode &curNnode = pData_[index]; + curNnode.link_.next_ = &(pData_[++index].link_); + } + pData_[last].link_.next_ = &freeHead_; + } else { + numItem_ = 0; + freeHead_.next_ = &freeHead_; + freeHead_.prev_ = &freeHead_; + } + } + return numItem_; +} + +template +HashList::~HashList() +{ + if (pData_) { + delete[] pData_; + pData_ = nullptr; + } + valueTab_.clear(); + dataHead_.next_ = &dataHead_; + dataHead_.prev_ = &dataHead_; + freeHead_.next_ = nullptr; + freeHead_.prev_ = nullptr; + numItem_ = 0; +} + +template +HashList::HashList(HashList &&source) + : numItem_ {source.numItem_}, + pData_ {source.pData_}, + dataHead_ {std::move(source.dataHead_)}, + freeHead_ {std::move(source.freeHead_)}, + valueTab_ {std::move(source.valueTab_)} +{ + source.pData_ = nullptr; +} + +template +auto HashList::operator=(HashList &&source) +-> HashList& +{ + if (this == &source) { + return *this; + } + if (pData_) { + delete[] pData_; + pData_ = nullptr; + } + numItem_ = source.numItem_; + pData_ = source.pData_; + source.pData_ = nullptr; + dataHead_ = std::move(source.dataHead_); + freeHead_ = std::move(source.freeHead_); + valueTab_ = std::move(source.valueTab_); + return *this; +} + +template +auto HashList::begin() +-> HashList::Iterator +{ + if (empty()) { + return end(); + } + return Iterator(LinkNode::GetLinkNode(dataHead_.next_), this); +} + +template +auto HashList::cbegin() const +-> const HashList::Iterator +{ + if (empty()) { + return cend(); + } + return Iterator(LinkNode::GetLinkNode(dataHead_.next_), this); +} + +template +auto HashList::end() +-> HashList::Iterator +{ + return Iterator(nullptr, this); +} + +template +auto HashList::cend() const +-> const HashList::Iterator +{ + return Iterator(nullptr, this); +} + +template +auto HashList::rbegin() +-> HashList::ReverseIterator +{ + if (empty()) { + return rend(); + } + return ReverseIterator(LinkNode::GetLinkNode(dataHead_.prev_), this); +} + +template +auto HashList::crbegin() const +-> const HashList::ReverseIterator +{ + if (empty()) { + return crend(); + } + return ReverseIterator(LinkNode::GetLinkNode(dataHead_.prev_), this); +} + +template +auto HashList::rend() +-> HashList::ReverseIterator +{ + return ReverseIterator(nullptr, this); +} + +template +auto HashList::crend() const +-> const HashList::ReverseIterator +{ + return ReverseIterator(nullptr, this); +} + +template +Val& HashList::front() +{ + LinkNode *pnode = LinkNode::GetLinkNode(dataHead_.next_); + return pnode->val_; +} + +template +const Val& HashList::front() const +{ + return front(); +} + +template +Val& HashList::back(bool prepend) +{ + auto pnode = LinkNode::GetLinkNode(dataHead_.prev_); + if (prepend) { + MoveToHead(pnode); + } + return pnode->val_; +} + +template +Val& HashList::operator[](const Key &key) +{ + LinkNode *pnode {nullptr}; + if (valueTab_.find(key) == valueTab_.end()) { + pnode = AllocateNode(key); + valueTab_[key] = pnode; + } else { + pnode = valueTab_[key]; + } + if (pnode) { + MoveToHead(pnode); + } + return pnode->val_; +} + +template +auto HashList::find(const Key &key) +-> HashList::Iterator +{ + const auto &itr = valueTab_.find(key); + if (itr == valueTab_.end()) { + return end(); + } + return Iterator(itr->second, this); +} + +template +void HashList::push_front(const Key& key, const Val& val) +{ + if (valueTab_.find(key) == valueTab_.end()) { + LinkNode* pnode = AllocateNode(key, val); + MoveToHead(pnode); + valueTab_[pnode->key_] = pnode; + } else { + MoveToHead(valueTab_[key]); + this->operator[](key) = val; + } +} + +template +void HashList::push_front(const Key& key, Val&& val) +{ + if (valueTab_.find(key) == valueTab_.end()) { + LinkNode* pnode = AllocateNode(key, std::move(val)); + MoveToHead(pnode); + valueTab_[pnode->key_] = pnode; + } else { + MoveToHead(valueTab_[key]); + this->operator[](key) = val; + } +} + +template +void HashList::push_back(const Key& key, const Val& val) +{ + if (valueTab_.find(key) == valueTab_.end()) { + LinkNode* pnode = AllocateNode(key, val); + MoveToTail(pnode); + valueTab_[pnode->key_] = pnode; + } else { + MoveToTail(valueTab_[key]); + this->operator[](key) = val; + } +} + +template +void HashList::push_back(const Key& key, Val&& val) +{ + if (valueTab_.find(key) == valueTab_.end()) { + LinkNode* pnode = AllocateNode(key, std::move(val)); + MoveToTail(pnode); + valueTab_[pnode->key_] = pnode; + } else { + MoveToTail(valueTab_[key]); + this->operator[](key) = val; + } +} + +template +void HashList::pop_front() +{ + if (empty()) { + return; + } + LinkNode* pnode = LinkNode::GetLinkNode(dataHead_.next_); + valueTab_.erase(pnode->key_); + ReclaimNode(pnode); +} + +template +void HashList::pop_back() +{ + if (empty()) { + return; + } + LinkNode* pnode = LinkNode::GetLinkNode(dataHead_.prev_); + valueTab_.erase(pnode->key_); + ReclaimNode(pnode); +} + +template +auto HashList::erase(const Key& key) +-> HashList::Iterator +{ + if (valueTab_.find(key) == valueTab_.end()) { + return end(); + } + LinkNode *pnode = valueTab_[key]; + valueTab_.erase(key); + Link* plink = pnode->link_.next_; + Iterator tempItr {LinkNode::GetLinkNode(plink), this}; + ReclaimNode(pnode); + return tempItr; +} + +template +auto HashList::erase(const Iterator pos) +-> HashList::Iterator +{ + // assume pos is valid, otherwise the result is undefined + Iterator tempItr {pos}; + ++tempItr; + LinkNode *pnode = pos.GetNode(); + valueTab_.erase(pnode->key_); + ReclaimNode(pnode); + return tempItr; +} + +template +auto HashList::erase(const Iterator first, const Iterator last) +-> HashList::Iterator +{ + // assume pos is valid, otherwise the result is undefined + if (first <= last) { + Iterator curPos {first}; + while (curPos < last) { + curPos = erase(curPos); + } + return last; + } + return end(); +} + +template +bool HashList::MoveNode(const Iterator& pos, LinkNode *&pnode) +{ + LinkNode *curNode = pos.GetNode(); + if (curNode == pnode) { + return true; + } + if (pnode->link_.next_ == &curNode->link_) { + return true; + } + Link* prevLink = pnode->link_.prev_; + Link* nextLink = pnode->link_.next_; + if (prevLink and nextLink) { + prevLink->next_ = nextLink; + nextLink->prev_ = prevLink; + } + Link *currLink = &curNode->link_; + prevLink = currLink->prev_; + nextLink = &pnode->link_; + prevLink->next_ = nextLink; + nextLink->prev_ = prevLink; + nextLink->next_ = currLink; + currLink->prev_ = nextLink; + return true; +} + +template +void HashList::MoveToHead(LinkNode *&pnode) +{ + if (pnode->link_.prev_ and pnode->link_.next_) { + Link* prev = pnode->link_.prev_; + Link* next = pnode->link_.next_; + prev->next_ = next; + next->prev_ = prev; + } + pnode->link_.next_ = dataHead_.next_; + dataHead_.next_->prev_ = &pnode->link_; + dataHead_.next_ = &pnode->link_; + pnode->link_.prev_ = &dataHead_; +} + +template +void HashList::MoveToTail(LinkNode *&pnode) +{ + if (pnode->link_.prev_ and pnode->link_.next_) { + Link* prev = pnode->link_.prev_; + Link* next = pnode->link_.next_; + prev->next_ = next; + next->prev_ = prev; + } + pnode->link_.prev_ = dataHead_.prev_; + dataHead_.prev_->next_ = &pnode->link_; + pnode->link_.next_ = &dataHead_; + dataHead_.prev_ = &pnode->link_; +} + +template +auto HashList::AllocateNode(const Key &key) +->LinkNode * +{ + if (IsFull()) { + pop_back(); + } + LinkNode * pnode = LinkNode::GetLinkNode(freeHead_.next_); + freeHead_.next_ = freeHead_.next_->next_; + pnode->link_.next_ = nullptr; + pnode->link_.prev_ = nullptr; + pnode->key_ = key; + pnode->val_ = Val(); + return pnode; +} + +template +auto HashList::AllocateNode(const Key &key, const Val &val) +->LinkNode * +{ + if (IsFull()) { + pop_back(); + } + LinkNode *pnode = LinkNode::GetLinkNode(freeHead_.next_); + freeHead_.next_ = freeHead_.next_->next_; + pnode->link_.next_ = nullptr; + pnode->link_.prev_ = nullptr; + pnode->key_ = key; + pnode->val_ = val; + return pnode; +} + +template +auto HashList::AllocateNode(const Key &key, Val &&val) +->LinkNode * +{ + if (IsFull()) { + pop_back(); + } + LinkNode * pnode = LinkNode::GetLinkNode(freeHead_.next_); + freeHead_.next_ = freeHead_.next_->next_; + pnode->link_.next_ = nullptr; + pnode->link_.prev_ = nullptr; + pnode->key_ = key; + pnode->val_ = std::move(val); + return pnode; +} + +template +void HashList::ReclaimNode(LinkNode *&pnode) +{ + Link *prevLink = pnode->link_.prev_; + Link *nextLink = pnode->link_.next_; + prevLink->next_ = nextLink; + nextLink->prev_ = prevLink; + pnode->link_.prev_ = nullptr; + pnode->link_.next_ = freeHead_.next_; + freeHead_.next_ = &pnode->link_; + return; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_HASHLIST_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/mem_map_item.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/mem_map_item.h new file mode 100644 index 0000000..c0501a1 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/mem_map_item.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 MEMMAPITEM_H +#define MEMMAPITEM_H + +#include + +#include +#include + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class MemMapItem { +public: + uint64_t begin_ = 0; + uint64_t end_ = 0; + uint16_t type_ = 0; // rwx : PROT_READ | PROT_WRITE | PROT_EXEC + uint16_t flags = 0; // ps : MAP_PRIVATE | MAP_SHARED + uint64_t pageoffset_ = 0; + uint64_t major_ = 0; + uint64_t minor_ = 0; + ino_t inode = 0; + std::string name_; + std::string_view nameHold_; + + MemMapItem() {} + MemMapItem(uint64_t begin, uint64_t end, uint64_t offset, const std::string &name) + : begin_(begin), + end_(end), + pageoffset_(offset), + name_(name), + nameHold_(MemoryHold::Get().HoldStringView(name)) + { + } + + // use for find + inline bool operator==(const std::string &name) const + { + return name_ == name; + } + + inline bool operator<(const MemMapItem &other) const + { + return end_ < other.end_; + } + + uint64_t FileOffsetFromAddr(uint64_t addr) const + { + // real vaddr - real map begin = addr offset in section + // section offset + page off set = file offset + return addr - begin_ + pageoffset_; + } + // debug only + const std::string ToString() const + { + std::stringstream sstream; + sstream << "0x" << std::hex << begin_; + sstream << "-0x" << std::hex << end_; + sstream << " type 0x" << std::hex << type_; + sstream << " flags 0x" << std::hex << flags; + sstream << " pageoffset 0x" << std::hex << pageoffset_; + sstream << " " << name_; + return sstream.str(); + } + static bool GreaterSort(const MemMapItem &a, const MemMapItem &b) + { + return (a.begin_ > b.begin_); + } + static bool LessSort(const MemMapItem &a, const MemMapItem &b) + { + return (a.begin_ < b.begin_); + } + // The range [first, last) must be partitioned with respect to the expression !(value < element) + // or !comp(value, element) + static bool ValueLessThan(uint64_t vaddr, const MemMapItem &a) + { + return vaddr <= a.begin_; + } + bool Contain(uint64_t addr) const + { + return addr >= begin_ and addr < end_; + } +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // MEMMAPITEM_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/noncopyable.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/noncopyable.h new file mode 100644 index 0000000..846fbd8 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/noncopyable.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 NONCOPYABLE_H_ +#define NONCOPYABLE_H_ +class Noncopyable { +public: + Noncopyable() = default; + ~Noncopyable() = default; + +private: + Noncopyable(const Noncopyable &); + const Noncopyable &operator=(const Noncopyable &); +}; +#endif // NONCOPYABLE_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/option.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/option.h new file mode 100644 index 0000000..ad67aec --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/option.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_OPTION_H_ +#define HIPERF_OPTION_H_ + +#include +#include +#include +#include +#include + +#include "debug_logger.h" +#include "utilities.h" + +using argsVector = std::vector; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +namespace Option { +struct MainOption { + std::string help; + std::function &)> callBackFunction; +}; + +// called from main +bool RegisterMainOption(const std::string &, const std::string &, + std::function &)>); + +void ClearMainOptions(); + +bool CheckOptionFormat(const std::string &optionName); + +argsVector::iterator FindOption(argsVector &args, const std::string &optionName); + +// some option function +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, bool &value); +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, int &); +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + float &value); +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::string &value); +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::vector &value); +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::vector &value); + +bool GetOptionTrackedCommand(argsVector &args, std::vector &trackedCommand); + +/* +Return false to indicate that the parameter is illegal +The program should exit with an error. + +Return true, indicating that the parameter is legal (but the user does not necessarily enter the +parameter) +*/ +template +bool GetOptionValue(argsVector &args, std::string optionName, T &value) +{ + // we need keep the ref if we got failed + // so we use a local value first. + T localValues = {}; + if constexpr (std::is_same>>::value) { + // try unitl failed. + while (true) { + if (!GetOptionValue(args, optionName, localValues.emplace_back())) { + printf("incorrect option %s\n", optionName.c_str()); + return false; // format error + } else if (localValues.back().size() == 0) { + // if the last one we request is empty , we remove it + localValues.pop_back(); + // nothing more needed + // we don't allow empty value + break; + } + } + if (localValues.size() > 0) { + value = localValues; + } + return true; + } else { + if (!CheckOptionFormat(optionName)) { + if (optionName.empty()) { + printf("unable to use empty option name!\n"); + } else { + printf("format error. must use '-' at the begin of option '%s'!\n", + optionName.c_str()); + } + return false; // something wrong + } + auto it = FindOption(args, optionName); + if (it == args.end()) { + HLOGV("not found option, return default value"); + return true; // not found but also not error + } else { + it = args.erase(it); + // some special case + if constexpr (std::is_same::value) { + // for bool we don't need get value. + // this always return true + GetValueFromString(optionName, optionName, value); + return true; + } else if (it == args.end()) { + // no value means failed + printf("option %s value missed\n", optionName.c_str()); + return false; + } else if (GetValueFromString(*it, optionName, localValues)) { + // got some value + value = localValues; + args.erase(it); + return true; + } else { + // have value but convert failed. + printf("incorrect option value '%s'. View the usage with the --help option.\n", + (*it).c_str()); + return false; + } + } + } +} + +const MainOption *FindMainOption(std::string); + +const std::map> &GetMainOptions(); +} // namespace Option +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_OPTION_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_event_record.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_event_record.h new file mode 100644 index 0000000..8663ce9 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_event_record.h @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_PERF_EVENT_RECORD_H +#define HIPERF_PERF_EVENT_RECORD_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug_logger.h" +#include "mem_map_item.h" +#include "perf_record_format.h" +#include "utilities.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static constexpr uint32_t RECORD_SIZE_LIMIT = 65535; + +enum perf_event_hiperf_ext_type { + PERF_RECORD_HIPERF_CALLSTACK = UINT32_MAX / 2, +}; + +struct CallFrame { + uint64_t ip_ = 0; + uint64_t sp_ = 0; + + uint64_t vaddrInFile_ = 0; // in symbol file vaddr + int32_t symbolIndex_ = -1; // symbols index , should update after sort + std::string_view symbolName_; + std::string_view filePath_; // lib path , elf path + + CallFrame(uint64_t ip, uint64_t sp = 0) : ip_(ip), sp_(sp) {} + + // this is for ut test + CallFrame(uint64_t ip, uint64_t vaddrInFile, const char *name, const char *filePath) + : ip_(ip), vaddrInFile_(vaddrInFile), symbolName_(name), filePath_(filePath) + { + } + bool operator==(const CallFrame &b) const + { + return (ip_ == b.ip_) && (sp_ == b.sp_); + } + bool operator!=(const CallFrame &b) const + { + return (ip_ != b.ip_) || (sp_ != b.sp_); + } + std::string ToString() const + { + return StringPrintf("ip: 0x%016llx sp: 0x%016llx", ip_, sp_); + } + std::string ToSymbolString() const + { + std::string output; + if (vaddrInFile_ != 0) { + output = StringPrintf("va: 0x%016llx(%llx) ", vaddrInFile_, ip_); + } else { + output = StringPrintf("ip: 0x%016llx ", ip_); + } + output.append(": "); + output.append(symbolName_); + + output.append("@"); + output.append(filePath_); + if (symbolIndex_ != -1) { + output.append(":"); + output.append(std::to_string(symbolIndex_)); + } + return output; + } +}; + +struct AttrWithId { + perf_event_attr attr; + std::vector ids; + std::string name; // will be empty in GetAttrSection +}; + +class PerfEventRecord { +public: + PerfEventRecord(const PerfEventRecord &) = delete; + PerfEventRecord &operator=(const PerfEventRecord &) = delete; + + struct perf_event_header header; + const std::string name_ {}; + + PerfEventRecord(perf_event_type type, bool in_kernel, const std::string &name); + PerfEventRecord(perf_event_hiperf_ext_type type, const std::string &name); + + PerfEventRecord(uint8_t *p, const std::string &name); + + virtual ~PerfEventRecord() {} + + virtual size_t GetSize() const + { + return header.size; + }; + size_t GetHeaderSize() const + { + return sizeof(header); + }; + void GetHeaderBinary(std::vector &buf) const; + + uint32_t GetType() const + { + return header.type; + }; + uint16_t GetMisc() const + { + return header.misc; + }; + bool inKernel() + { + return header.misc & PERF_RECORD_MISC_KERNEL; + } + bool inUser() + { + return header.misc & PERF_RECORD_MISC_USER; + } + const std::string &GetName() const + { + return name_; + }; + + // to support --exclude-hiperf, return sample_id.pid to filter record, + virtual pid_t GetPid() const + { + return 0; + }; + + virtual bool GetBinary(std::vector &buf) const = 0; + void Dump(int indent = 0) const; + virtual void DumpData(int indent) const = 0; + virtual void DumpLog(const std::string &prefix) const; +}; + +// define convert from linux/perf_event.h +// description from https://man7.org/linux/man-pages/man2/perf_event_open.2.html + +constexpr __u64 SAMPLE_ID = PERF_SAMPLE_TID | PERF_SAMPLE_TIME | PERF_SAMPLE_ID | + PERF_SAMPLE_STREAM_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_IDENTIFIER; + +constexpr __u64 SAMPLE_TYPE = PERF_SAMPLE_IP | SAMPLE_ID | PERF_SAMPLE_PERIOD; + +constexpr __u32 MIN_SAMPLE_STACK_SIZE = 8; +constexpr __u32 MAX_SAMPLE_STACK_SIZE = 65528; + +class PerfRecordMmap : public PerfEventRecord { +public: + PerfRecordMmapData data_; + + explicit PerfRecordMmap(uint8_t *p); + + PerfRecordMmap(bool inKernel, u32 pid, u32 tid, u64 addr, u64 len, u64 pgoff, + const std::string &filename); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; + void DumpLog(const std::string &prefix) const override; +}; + +class PerfRecordMmap2 : public PerfEventRecord { +public: + PerfRecordMmap2Data data_; + + explicit PerfRecordMmap2(uint8_t *p); + + PerfRecordMmap2(bool inKernel, u32 pid, u32 tid, u64 addr, u64 len, u64 pgoff, u32 maj, u32 min, + u64 ino, u32 prot, u32 flags, const std::string &filename); + + PerfRecordMmap2(bool inKernel, u32 pid, u32 tid, const MemMapItem &item); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; + void DumpLog(const std::string &prefix) const override; +}; + +class PerfRecordLost : public PerfEventRecord { +public: + PerfRecordLostData data_; + + explicit PerfRecordLost(uint8_t *p); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; + + // only for UT + PerfRecordLost(bool inKernel, u64 id, u64 lost) + : PerfEventRecord(PERF_RECORD_LOST, inKernel, "lost") + { + data_.id = id; + data_.lost = lost; + header.size = sizeof(header) + sizeof(data_); + } +}; + +class PerfRecordComm : public PerfEventRecord { +public: + PerfRecordCommData data_; + + explicit PerfRecordComm(uint8_t *p); + + PerfRecordComm(bool inKernel, u32 pid, u32 tid, const std::string &comm); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; + void DumpLog(const std::string &prefix) const override; +}; + +class PerfRecordSample : public PerfEventRecord { +public: + PerfRecordSampleData data_ = {}; + uint64_t sampleType_ = SAMPLE_TYPE; + + // extend + // hold the new ips memory (after unwind) + // used for data_.ips replace (ReplaceWithCallStack) + std::vector ips_; + std::vector callFrames_; + + // referenced input(p) in PerfRecordSample, require caller keep input(p) together + PerfRecordSample(uint8_t *p, const perf_event_attr &attr); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent = 0) const override; + void DumpLog(const std::string &prefix) const override; + + // originalSize is use for expand callstack + void ReplaceWithCallStack(size_t originalSize = 0); + pid_t GetPid() const override; + + // only for UT + PerfRecordSample(bool inKernel, u32 pid, u32 tid, u64 period = 0, u64 time = 0, u64 id = 0) + : PerfEventRecord(PERF_RECORD_SAMPLE, inKernel, "sample") + { + data_.pid = pid; + data_.tid = tid; + data_.period = period; + data_.time = time; + data_.id = 0; + header.size = sizeof(header) + sizeof(data_); + }; +}; + +class PerfRecordExit : public PerfEventRecord { +public: + PerfRecordExitData data_; + + explicit PerfRecordExit(uint8_t *p); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +class PerfRecordThrottle : public PerfEventRecord { +public: + PerfRecordThrottleData data_; + + PerfRecordThrottle(uint8_t *p); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +class PerfRecordUnthrottle : public PerfEventRecord { +public: + PerfRecordThrottleData data_; + + explicit PerfRecordUnthrottle(uint8_t *p); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +class PerfRecordFork : public PerfEventRecord { +public: + PerfRecordForkData data_; + + explicit PerfRecordFork(uint8_t *p); + + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +/* + This record indicates a read event. +*/ +class PerfRecordRead : public PerfEventRecord { +public: + PerfRecordReadData data_; + + explicit PerfRecordRead(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +/* + This record reports that new data is available in the + separate AUX buffer region. + + aux_offset + offset in the AUX mmap region where the new + data begins. + aux_size + size of the data made available. + flags describes the AUX update. + PERF_AUX_FLAG_TRUNCATED + if set, then the data returned was + truncated to fit the available buffer + size. + + PERF_AUX_FLAG_OVERWRITE + if set, then the data returned has + overwritten previous data. +*/ +class PerfRecordAux : public PerfEventRecord { +public: + PerfRecordAuxData data_; + + explicit PerfRecordAux(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +/* + This record indicates which process has initiated an + instruction trace event, allowing tools to properly + correlate the instruction addresses in the AUX buffer + with the proper executable. + + pid process ID of the thread starting an + instruction trace. + tid thread ID of the thread starting an instruction + trace. +*/ +class PerfRecordItraceStart : public PerfEventRecord { +public: + PerfRecordItraceStartData data_; + + explicit PerfRecordItraceStart(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +/* + When using hardware sampling (such as Intel PEBS) this + record indicates some number of samples that may have + been lost. +*/ +class PerfRecordLostSamples : public PerfEventRecord { +public: + PerfRecordLostSamplesData data_; + + explicit PerfRecordLostSamples(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +/* + This record indicates a context switch has happened. + The PERF_RECORD_MISC_SWITCH_OUT bit in the misc field + indicates whether it was a context switch into or away + from the current process. +*/ +class PerfRecordSwitch : public PerfEventRecord { +public: + PerfRecordSwitchData data_; + explicit PerfRecordSwitch(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData([[maybe_unused]] int indent) const override {}; +}; + +/* + As with PERF_RECORD_SWITCH this record indicates a + context switch has happened, but it only occurs when + sampling in CPU-wide mode and provides additional + information on the process being switched to/from. + The PERF_RECORD_MISC_SWITCH_OUT bit in the misc field + indicates whether it was a context switch into or away + from the current process. + + next_prev_pid + The process ID of the previous (if switching + in) or next (if switching out) process on the + CPU. + + next_prev_tid + The thread ID of the previous (if switching in) + or next (if switching out) thread on the CPU. +*/ +class PerfRecordSwitchCpuWide : public PerfEventRecord { +public: + PerfRecordSwitchCpuWideData data_; + explicit PerfRecordSwitchCpuWide(uint8_t *p); + bool GetBinary(std::vector &buf) const override; + void DumpData(int indent) const override; +}; + +std::unique_ptr GetPerfEventRecord(const int type, uint8_t *data, + const perf_event_attr &attr); + +template +void PushToBinary(bool condition, uint8_t *&p, const T &v); + +template +void PushToBinary2(bool condition, uint8_t *&p, const T1 &v1, const T2 &v2); + +template +void PopFromBinary(bool condition, uint8_t *&p, T &v); + +template +void PopFromBinary2(bool condition, uint8_t *&p, T1 &v1, T2 &v2); +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_PERF_EVENT_RECORD_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_events.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_events.h new file mode 100644 index 0000000..b39d9e1 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_events.h @@ -0,0 +1,523 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_PERF_EVENTS_H +#define HIPERF_PERF_EVENTS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !is_mingw +#include +#endif + +#include +#include + +#include "debug_logger.h" +#include "perf_event_record.h" +#include "ring_buffer.h" +#include "tracked_command.h" +#include "utilities.h" +#include "virtual_runtime.h" + +// this for some performance debug +#define HIDEBUG_SKIP_CALLBACK 0 + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +using ConfigTable = std::map<__u64, const std::string>; +using SharedConfigTable = std::unique_ptr; + +static const std::string PERF_EVENT_PARANOID = "/proc/sys/kernel/perf_event_paranoid"; +static const std::string PERF_DISABLE_PARAM = "security.perf_harden"; + +// define convert from linux/perf_event.h +// description from https://man7.org/linux/man-pages/man2/perf_event_open.2.html + +static const ConfigTable PERF_HW_CONFIGS = { + {PERF_COUNT_HW_CPU_CYCLES, "hw-cpu-cycles"}, + {PERF_COUNT_HW_INSTRUCTIONS, "hw-instructions"}, + {PERF_COUNT_HW_CACHE_REFERENCES, "hw-cache-references"}, + {PERF_COUNT_HW_CACHE_MISSES, "hw-cache-misses"}, + {PERF_COUNT_HW_BRANCH_INSTRUCTIONS, "hw-branch-instructions"}, + {PERF_COUNT_HW_BRANCH_MISSES, "hw-branch-misses"}, + {PERF_COUNT_HW_BUS_CYCLES, "hw-bus-cycles"}, + {PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, "hw-stalled-cycles-backend"}, + {PERF_COUNT_HW_STALLED_CYCLES_BACKEND, "hw-stalled-cycles-frontend"}, + {PERF_COUNT_HW_REF_CPU_CYCLES, "hw-ref-cpu-cycles"}, +}; +static const ConfigTable PERF_HW_CACHE_CONFIGS = { + {PERF_COUNT_HW_CACHE_L1D, "hw-cache-l1d"}, {PERF_COUNT_HW_CACHE_L1I, "hw-cache-l1i"}, + {PERF_COUNT_HW_CACHE_LL, "hw-cache-ll"}, {PERF_COUNT_HW_CACHE_DTLB, "hw-cache-dtlb"}, + {PERF_COUNT_HW_CACHE_ITLB, "hw-cache-itlb"}, {PERF_COUNT_HW_CACHE_BPU, "hw-cache-bpu"}, + {PERF_COUNT_HW_CACHE_NODE, "hw-cache-node"}, +}; +static const ConfigTable PERF_HW_CACHE_OP_CONFIGS = { + {PERF_COUNT_HW_CACHE_OP_READ, "hw-cache-op-read"}, + {PERF_COUNT_HW_CACHE_OP_WRITE, "hw-cache-op-write"}, + {PERF_COUNT_HW_CACHE_OP_PREFETCH, "hw-cache-op-prefetch"}, +}; +static const ConfigTable PERF_HW_CACHE_OP_RESULT_CONFIGS = { + {PERF_COUNT_HW_CACHE_RESULT_ACCESS, "hw-cache-result-access"}, + {PERF_COUNT_HW_CACHE_RESULT_MISS, "hw-cache-result-miss"}, +}; +static const ConfigTable PERF_SW_CONFIGS = { + {PERF_COUNT_SW_CPU_CLOCK, "sw-cpu-clock"}, + {PERF_COUNT_SW_TASK_CLOCK, "sw-task-clock"}, + {PERF_COUNT_SW_PAGE_FAULTS, "sw-page-faults"}, + {PERF_COUNT_SW_CONTEXT_SWITCHES, "sw-context-switches"}, + {PERF_COUNT_SW_CPU_MIGRATIONS, "sw-cpu-migrations"}, + {PERF_COUNT_SW_PAGE_FAULTS_MIN, "sw-page-faults-min"}, + {PERF_COUNT_SW_PAGE_FAULTS_MAJ, "sw-page-faults-maj"}, + {PERF_COUNT_SW_ALIGNMENT_FAULTS, "sw-alignment-faults"}, + {PERF_COUNT_SW_EMULATION_FAULTS, "sw-emulation-faults"}, + {PERF_COUNT_SW_DUMMY, "sw-dummy"}, + {PERF_COUNT_SW_BPF_OUTPUT, "sw-bpf-output"}, +}; +static const ConfigTable PERF_RAW_CONFIGS = { + {0x0, "raw-sw-incr"}, + {0x1, "raw-l1-icache-refill"}, + {0x2, "raw-l1-itlb-refill"}, + {0x3, "raw-l1-dcache-refill"}, + {0x4, "raw-l1-dcache"}, + {0x5, "raw-l1-dtlb-refill"}, + {0x6, "raw-load-retired"}, + {0x7, "raw-store-retired"}, + {0x8, "raw-instruction-retired"}, + {0x9, "raw-exception-taken"}, + {0xa, "raw-exception-return"}, + {0xb, "raw-cid-write-retired"}, + {0xc, "raw-pc-write-retired"}, + {0xd, "raw-br-immed-retired"}, + {0xe, "raw-br-return-retired"}, + {0xf, "raw-unaligned-ldst-retired"}, + {0x10, "raw-br-mis-pred"}, + {0x11, "raw-cpu-cycles"}, + {0x12, "raw-br-pred"}, + {0x13, "raw-mem-access"}, + {0x14, "raw-l1-icache"}, + {0x15, "raw-l1-dcache-wb"}, + {0x16, "raw-l2-dcache"}, + {0x17, "raw-l2-dcache-refill"}, + {0x18, "raw-l2-dcache-wb"}, + {0x19, "raw-bus-access"}, + {0x1a, "raw-memory-error"}, + {0x1b, "raw-inst-spec"}, + {0x1c, "raw-ttbr-write-retired"}, + {0x1d, "raw-bus-cycles"}, + {0x1f, "raw-l1-dcache-allocate"}, + {0x20, "raw-l2-dcache-allocate"}, + {0x21, "raw-br-retired"}, + {0x22, "raw-br-mis-pred-retired"}, + {0x23, "raw-stall-frontend"}, + {0x24, "raw-stall-backend"}, + {0x25, "raw-l1-dtlb"}, + {0x26, "raw-l1-itlb"}, + {0x27, "raw-l2-icache"}, + {0x28, "raw-l2-icache-refill"}, + {0x29, "raw-l3-dcache-allocate"}, + {0x2a, "raw-l3-dcache-refill"}, + {0x2b, "raw-l3-dcache"}, + {0x2c, "raw-l3-dcache-wb"}, + {0x2d, "raw-l2-dtlb-refill"}, + {0x2e, "raw-l2-itlb-refill"}, + {0x2f, "raw-l2-dtlb"}, + {0x30, "raw-l2-itlb"}, +}; +static ConfigTable PERF_TRACEPOINT_CONFIGS = { + +}; + +static const std::map PERF_TYPES = { + {PERF_TYPE_HARDWARE, "hardware"}, + {PERF_TYPE_SOFTWARE, "software"}, + {PERF_TYPE_TRACEPOINT, "tracepoint"}, + {PERF_TYPE_HW_CACHE, "hardware cache"}, + {PERF_TYPE_RAW, "raw"}, +}; + +static std::map TYPE_CONFIGS = { + {PERF_TYPE_HARDWARE, (PERF_HW_CONFIGS)}, {PERF_TYPE_SOFTWARE, (PERF_SW_CONFIGS)}, + {PERF_TYPE_HW_CACHE, (PERF_HW_CACHE_CONFIGS)}, {PERF_TYPE_RAW, (PERF_RAW_CONFIGS)}, + {PERF_TYPE_TRACEPOINT, (PERF_TRACEPOINT_CONFIGS)}, +}; + +// default config +static const std::vector<__u64> DEFAULT_HW_CONFIGS = { + PERF_COUNT_HW_CPU_CYCLES, +#if defined(__aarch64__) + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND, +#endif + PERF_COUNT_HW_INSTRUCTIONS, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS, + PERF_COUNT_HW_BRANCH_MISSES, +}; +static const std::vector<__u64> DEFAULT_SW_CONFIGS = { + PERF_COUNT_SW_TASK_CLOCK, + PERF_COUNT_SW_CONTEXT_SWITCHES, + PERF_COUNT_SW_PAGE_FAULTS, +}; +static const std::map> DEFAULT_TYPE_CONFIGS = { + {PERF_TYPE_HARDWARE, DEFAULT_HW_CONFIGS}, + {PERF_TYPE_SOFTWARE, DEFAULT_SW_CONFIGS}, +}; + +struct read_format_event { + __u64 value; /* The value of the event */ + __u64 id; /* if PERF_FORMAT_ID */ +}; + +struct read_format_group { + __u64 nr; /* The number of events */ + __u64 time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */ + __u64 time_running; /* if PERF_FORMAT_TOTAL_TIME_RUNNING */ + read_format_event events[1]; +}; + +struct read_format_no_group { + __u64 value; /* The value of the event */ + __u64 time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */ + __u64 time_running; /* if PERF_FORMAT_TOTAL_TIME_RUNNING */ + __u64 id; /* if PERF_FORMAT_ID */ +}; + +/* +2 allow only user-space measurements (default since + Linux 4.6). +1 allow both kernel and user measurements (default + before Linux 4.6). +0 allow access to CPU-specific data but not raw + tracepoint samples. +-1 no restrictions. +*/ +enum PerfEventParanoid { + NOLIMIT = -1, + KERNEL_USER_CPU = 0, + KERNEL_USER = 1, + USER = 2, + UNKNOW = 99, +}; + +class PerfEvents { +public: + static constexpr uint64_t DEFAULT_SAMPLE_FREQUNCY = 4000; + static constexpr uint64_t DEFAULT_SAMPLE_PERIOD = 1; + static constexpr uint64_t DEFAULT_TIMEOUT = 10 * 1000; + static constexpr size_t MIN_BUFFER_SIZE = 64 * 1024 * 1024; +#ifdef LITTLE_MEMORY + static constexpr size_t MAX_BUFFER_SIZE = 128 * 1024 * 1024; +#else + static constexpr size_t MAX_BUFFER_SIZE = 256 * 1024 * 1024; +#endif + static constexpr size_t BUFFER_LOW_LEVEL = 10 * 1024 * 1024; + static constexpr size_t BUFFER_CRITICAL_LEVEL = 5 * 1024 * 1024; + + PerfEvents(); + ~PerfEvents(); + + bool AddEvents(const std::vector &eventStrings, bool group = false); + bool PrepareTracking(void); + bool StartTracking(bool immediately = true); + bool StopTracking(void); + bool PauseTracking(void); + bool ResumeTracking(void); + /* call sequence + 1. setXXX + 2. AddEvents() + 3. PrepareTracking + 4. StartTracking (blocking...) + */ + bool EnableTracking(); + bool IsTrackRunning(); + + void SetSystemTarget(bool); + void SetCpu(const std::vector cpus); // cpu id must be [0~N] + void SetPid(const std::vector pids); // tis is same as pid in kernel + void SetTimeOut(float timeOut); + void SetTimeReport(int); + void SetVerboseReport(bool); + bool AddOffCpuEvent(); + + inline void SetTrackedCommand(const std::vector &trackedCommand) + { + if (!trackedCommand.empty()) { + trackedCommand_ = TrackedCommand::CreateInstance(trackedCommand); + } + } + + void SetSampleFrequency(unsigned int frequency); + void SetSamplePeriod(unsigned int period); + + enum SampleStackType { + NONE, + FP, + DWARF, + }; + void SetSampleStackType(SampleStackType type); + void SetDwarfSampleStackSize(uint32_t stackSize); + void SetMmapPages(size_t mmapPages); + std::vector GetAttrWithId() const; + + void SetInherit(bool inherit) + { + inherit_ = inherit; + }; + void SetClockId(int clockId) + { + clockId_ = clockId; + }; + bool SetBranchSampleType(uint64_t value); + bool AddDefaultEvent(perf_type_id type); + + std::map<__u64, std::string> GetSupportEvents(perf_type_id type); + + struct CountEvent { + bool userOnly = false; + bool kernelOnly = false; + __u64 eventCount = 0; + __u64 time_enabled = 0; + __u64 time_running = 0; + __u64 id = 0; + double used_cpus = 0; + }; + using StatCallBack = + std::function> &)>; + using RecordCallBack = std::function)>; + + void SetStatCallBack(StatCallBack reportCallBack); + void SetRecordCallBack(RecordCallBack recordCallBack); + void GetLostSamples(size_t &lostSamples, size_t &lostNonSamples) + { + lostSamples = lostSamples_; + lostNonSamples = lostNonSamples_; + } + + // review: remove this function. + static const std::string GetStaticConfigName(perf_type_id type_id, __u64 config_id) + { + auto typeConfigs = TYPE_CONFIGS.find(type_id); + if (typeConfigs != TYPE_CONFIGS.end()) { + auto configs = typeConfigs->second; + auto config = configs.find(config_id); + if (config != configs.end()) { + return config->second; + } else { + HLOGW("config not found for %u:%lld in %zu:%zu", type_id, config_id, + TYPE_CONFIGS.size(), configs.size()); + // dump all config size + for (auto types : TYPE_CONFIGS) { + HLOGV("type id %d %zu", types.first, types.second.size()); + } + } + } else { + HLOGW("type not found for %d in %zu", type_id, TYPE_CONFIGS.size()); + } + return ""; + }; + + const std::string GetTraceConfigName(__u64 config_id) + { + auto config = traceConfigTable.find(config_id); + if (config != traceConfigTable.end()) { + return config->second; + } else { + HLOGW("config not found for %lld in traceConfigTable.", config_id); + } + return ""; + }; + + static const std::string GetTypeName(perf_type_id type_id); + bool ParseEventName(const std::string &nameStr, std::string &name, bool &excludeUser, + bool &excludeKernel, bool &isTracePoint); + + // mmap one fd for each cpu + struct MmapFd { + int fd; + perf_event_mmap_page *mmapPage = nullptr; + uint8_t *buf = nullptr; + size_t bufSize = 0; + // for read and sort + size_t dataSize = 0; + perf_event_header header; + uint64_t timestamp = 0; + const perf_event_attr *attr = nullptr; + size_t posCallChain = 0; + }; + +private: + size_t recordEventCount_ = 0; // only for debug time +#ifdef HIPERF_DEBUG_TIME + std::chrono::microseconds recordCallBackTime_ = std::chrono::microseconds::zero(); + std::chrono::microseconds recordWaitDataTime_ = std::chrono::microseconds::zero(); + std::chrono::microseconds recordSleepTime_ = std::chrono::microseconds::zero(); + std::chrono::microseconds recordKernelReadTime_ = std::chrono::microseconds::zero(); +#endif + size_t lostSamples_ = 0; + size_t lostNonSamples_ = 0; + + std::unique_ptr recordBuf_ {nullptr}; + std::mutex mtxRrecordBuf_; + std::condition_variable cvRecordBuf_; + std::thread readRecordBufThread_; + std::atomic_bool readRecordThreadRunning_ = false; + bool startedTracking_ = false; + bool isLowPriorityThread_ = false; + void RecordLoop(); + void StatLoop(); + bool IsRecordInMmap(); + void ReadRecordsFromMmaps(); + bool GetRecordFromMmap(MmapFd &mmap); + void GetRecordFieldFromMmap(MmapFd &mmap, void *dest, size_t pos, size_t size); + void MoveRecordToBuf(MmapFd &mmap); + size_t GetCallChainPosInSampleRecord(const perf_event_attr &attr); + size_t GetStackSizePosInSampleRecord(MmapFd &mmap); + bool CutStackAndMove(MmapFd &mmap); + void ReadRecordFromBuf(); + size_t CalcBufferSize(); + bool PrepareRecordThread(); + void WaitRecordThread(); + bool HaveTargetsExit(const std::chrono::steady_clock::time_point &startTime); + void ExitReadRecordBufThread(); + + enum EventSpaceType { + UNKNOW = 0, + USER = 1, + KERNEL = 2, + USER_KERNEL = 3, + }; + uint8_t eventSpaceType_ = EventSpaceType::UNKNOW; + + PerfEventParanoid requestPermission_ = PerfEventParanoid::USER; + bool CheckPermissions(PerfEventParanoid request = KERNEL_USER_CPU); + bool CheckOhosPermissions(); + + static PerfEventParanoid perfEventParanoid_; + + bool inherit_ = false; + std::vector pids_; + std::vector cpus_; + std::vector groups_; + std::chrono::milliseconds timeOut_; // milliseconds + std::chrono::milliseconds timeReport_; // means same as timeOut + bool verboseReport_ = false; + bool prepared_ = false; + ConfigTable traceConfigTable; + + unsigned int samplePeriod_ = 0; + unsigned int sampleFreq_ = 0; + + struct FdItem { + OHOS::UniqueFd fd; + int cpu; + pid_t pid; + __u64 eventCount; + mutable uint64_t perf_id_ = 0; + uint64_t GetPrefId() const + { + if (perf_id_ == 0) { + read_format_no_group readNoGroupValue; + if (read(fd, &readNoGroupValue, sizeof(readNoGroupValue)) > 0) { + perf_id_ = readNoGroupValue.id; + } else { + HLOGW("read failed with fd %d", fd.Get()); + } + } + return perf_id_; + } + }; + struct EventItem { + std::string typeName; + std::string configName; + perf_event_attr attr = {}; + std::vector fdItems; + }; + struct EventGroupItem { + std::vector eventItems; + }; + std::vector eventGroupItem_; + + std::map cpuMmap_; + std::vector MmapRecordHeap_; + +#if !is_mingw + std::vector pollFds_; +#endif + const int pollTimeOut_ = 100; // ms + size_t pageSize_ = 4096; + bool systemTarget_ = false; + bool excludeHiperf_ = false; + pid_t selfPid_ = -1; + unsigned int mmapPages_ = 0; + int clockId_ = -1; + uint64_t branchSampleType_ = 0; + + SampleStackType sampleStackType_ = SampleStackType::NONE; + uint32_t dwarfSampleStackSize_ = MAX_SAMPLE_STACK_SIZE; + + // read records from the ring buffer singleton + void ReadRecordFromBuffer(); + void ReadRecordFromBufferThread(); + + std::unique_ptr trackedCommand_ = {}; + + StatCallBack reportCallBack_; + RecordCallBack recordCallBack_; + + void LoadTracepointEventTypesFromSystem(); + bool PerfEventsEnable(bool); + bool AddEvent(perf_type_id type, __u64 config, bool excludeUser = false, + bool excludeKernel = false, bool followGroup = false); + bool AddEvent(const std::string &eventString, bool followGroup = false); + bool IsEventSupport(perf_type_id type, __u64 config); + bool IsEventAttrSupport(perf_event_attr &attr); + + std::chrono::time_point trackingStartTime_; + std::chrono::time_point trackingEndTime_; + std::chrono::time_point readingStartTime_; + + std::map> countEvents_; + + void PutAllCpus(); + bool PrepareFdEvents(); + bool CreateFdEvents(); + bool StatReport(const __u64 &durationInSec); + bool CreateMmap(const FdItem &item, const perf_event_attr &attr); + + const perf_event_attr *GetDefaultAttr() + { + HLOG_ASSERT(eventGroupItem_.size() > 0); + HLOG_ASSERT(eventGroupItem_[0].eventItems.size() > 0); + return &(eventGroupItem_.at(0).eventItems.at(0).attr); + }; + + OHOS::UniqueFd Open(perf_event_attr &attr, pid_t pid = 0, int cpu = -1, int group_fd = -1, + unsigned long flags = 0); + std::unique_ptr CreateDefaultAttr(perf_type_id type, __u64 config); +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_PERF_EVENTS_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_format.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_format.h new file mode 100644 index 0000000..84f28f9 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_format.h @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_PERF_FILE_FORMAT_H +#define HIPERF_PERF_FILE_FORMAT_H + +#include + +#include "perf_event_record.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +enum class FEATURE { + RESERVED = 0, /* always cleared */ + FIRST_FEATURE = 1, + TRACING_DATA = 1, + BUILD_ID, // build_id_event + + HOSTNAME, // A perf_header_string with the hostname where the data was collected (uname -n) + OSRELEASE, // A perf_header_string with the os release where the data was collected (uname -r) + VERSION, // A perf_header_string with the perf user tool version where the data was collected. + // This is the same as the version of the source tree the perf tool was built from. + ARCH, // A perf_header_string with the CPU architecture (uname -m) + NRCPUS, // A structure defining the number of CPUs. + CPUDESC, // A perf_header_string with description of the CPU. On x86 this is the model name + // in /proc/cpuinfo + CPUID, // A perf_header_string with the exact CPU type. On x86 this is + // vendor,family,model,stepping. For example: GenuineIntel,6,69,1 + TOTAL_MEM, // An uint64_t with the total memory in kilobytes. + CMDLINE, // A perf_header_string_list with the perf arg-vector used to collect the data. + EVENT_DESC, // Another description of the perf_event_attrs + CPU_TOPOLOGY, // + NUMA_TOPOLOGY, // A list of NUMA node descriptions + BRANCH_STACK, // Not implemented in perf. + PMU_MAPPINGS, // A list of PMU structures, defining the different PMUs supported by perf. + GROUP_DESC, // Description of counter groups ({...} in perf syntax) + AUXTRACE, // Define additional auxtrace areas in the perf.data. auxtrace is used to store + // undecoded hardware tracing information, such as Intel Processor Trace data. + STAT, + CACHE, + SAMPLE_TIME, + MEM_TOPOLOGY, + LAST_FEATURE, + + HIPERF_FIRST_FEATURE = 192, + HIPERF_FILES_SYMBOL = HIPERF_FIRST_FEATURE, + HIPERF_WORKLOAD_CMD, + HIPERF_RECORD_TIME, + HIPERF_CPU_OFF, + HIPERF_LAST_FEATURE = HIPERF_CPU_OFF, + + FEATURE_MAX_BITS = 256, +}; + +const static std::vector FeatureStrings = { + FEATURE::HOSTNAME, + FEATURE::OSRELEASE, + FEATURE::VERSION, + FEATURE::ARCH, + FEATURE::CPUDESC, + FEATURE::CPUID, + FEATURE::CMDLINE, + + FEATURE::HIPERF_WORKLOAD_CMD, + FEATURE::HIPERF_RECORD_TIME, +}; + +struct perf_file_section { + uint64_t offset; + uint64_t size; +}; + +struct perf_file_attr { + perf_event_attr attr; + perf_file_section ids; +}; + +struct perf_header_string { + uint32_t len; + char string[0]; /* zero terminated */ +}; + +constexpr char PERF_MAGIC[] = "PERFILE2"; +constexpr int BITS_IN_BYTE = 8; +constexpr int NUM_FEATURES_FILE_HEADER = 256; + +struct perf_file_header { + char magic[8] = {'P', 'E', 'R', 'F', 'I', 'L', 'E', '2'}; + uint64_t size = sizeof(perf_file_header); + uint64_t attrSize = sizeof(perf_file_attr); + perf_file_section attrs; + perf_file_section data; + perf_file_section eventTypes; + uint8_t features[NUM_FEATURES_FILE_HEADER / BITS_IN_BYTE] = {0}; +}; + +static const std::vector extFeatureNames = { + "hiperf_files_symbol", + "hiperf_workloader_cmd", + "hiperf_record_time", + "hiperf_cpu_off", +}; +static const std::vector featureNames = { + "unknown_feature", "tracing_data", "build_id", "hostname", "osrelease", + "version", "arch", "nrcpus", "cpudesc", "cpuid", + "total_mem", "cmdline", "event_desc", "cpu_topology", "numa_topology", + "branch_stack", "pmu_mappings", "group_desc", "auxtrace", "stat", + "cache", "sample_time", "mem_topology", "last_feature", +}; + +class PerfFileSection { +public: + struct perf_file_section header; + const FEATURE featureId_; + + virtual bool GetBinary(char *buf, size_t size) = 0; + virtual size_t GetSize() = 0; + virtual ~PerfFileSection() {} + explicit PerfFileSection(const FEATURE featureId) : featureId_(featureId) + { + header.size = 0; + header.offset = 0; + } + static std::string GetFeatureName(FEATURE featureId); + +protected: + const char *rBuffer_ = nullptr; + char *wBuffer_ = nullptr; + size_t maxSize_ = 0; + size_t offset_ = 0; + + // for read + void Init(const char *buffer, size_t maxSize); + // for write + void Init(char *buffer, size_t maxSize); + bool Write(uint32_t u32); + bool Write(uint64_t u64); + bool Write(const std::string &str); + + bool Write(const char *buf, size_t size); + bool Write(const char *buf, size_t size, size_t max); + + bool Read(uint32_t &value); + bool Read(uint64_t &value); + bool Read(std::string &value); + bool Read(char *buf, size_t size); + void Skip(size_t size); + + uint32_t SizeOf(std::string &string); +}; + +class PerfFileSectionString : public PerfFileSection { + std::string stdString_; + +public: + // convert buff to PerfFileSectionString, used to read file + // if the data in buf is incorrect, ...... + PerfFileSectionString(FEATURE id, const char *buf, size_t size); + PerfFileSectionString(FEATURE id, const std::string &charString); + + bool GetBinary(char *buf, size_t size); + size_t GetSize(); + const std::string toString() const; +}; + +// ref struct +struct SymbolStruct { + uint64_t vaddr_ = 0; + uint32_t len_ = 0; + std::string symbolName_ = EMPTY_STRING; + SymbolStruct() {} + SymbolStruct(uint64_t vaddr, uint32_t len, const std::string &symbolName) + : vaddr_(vaddr), len_(len), symbolName_(symbolName) + { + } +}; + +struct SymbolFileStruct { + std::string filePath_ = EMPTY_STRING; + uint32_t symbolType_; + uint64_t textExecVaddr_; + uint64_t textExecVaddrFileOffset_; + std::string buildId_; + std::vector symbolStructs_; +}; + +class PerfFileSectionSymbolsFiles : public PerfFileSection { +public: + std::vector symbolFileStructs_; + + size_t GetSize(); + PerfFileSectionSymbolsFiles(FEATURE id, const std::vector &symbolFileStructs) + : PerfFileSection(id), symbolFileStructs_(symbolFileStructs) + { + } + // if the data in buf is incorrect, ...... + PerfFileSectionSymbolsFiles(FEATURE id, const char *buf, size_t size); + + bool GetBinary(char *buf, size_t size); + +private: + // issue from fuzz test + const size_t MAX_SYMBOLS_FILE_NUMBER = 300; + const size_t MAX_SYMBOLS_NUMBER = 3000; +}; + +// NRCPUS: A structure defining the number of CPUs. +class PerfFileSectionNrCpus : public PerfFileSection { + uint32_t nrCpusAvailable_; /* CPUs not yet onlined */ + uint32_t nrCpusOnline_; + +public: + PerfFileSectionNrCpus(FEATURE id, const char *buf, size_t size); + PerfFileSectionNrCpus(FEATURE id, uint32_t nrCpusAvailable, uint32_t nrCpusOnline); + + bool GetBinary(char *buf, size_t size); + size_t GetSize(); + void GetValue(uint32_t &nrCpusAvailable, uint32_t &nrCpusOnline) const; +}; + +class PerfFileSectionU64 : public PerfFileSection { + uint64_t value_; + +public: + PerfFileSectionU64(FEATURE id, const char *buf, size_t size); + PerfFileSectionU64(FEATURE id, uint64_t v); + + bool GetBinary(char *buf, size_t size); + size_t GetSize(); + void GetValue(uint64_t &v) const; +}; + +struct AttrWithId; +class PerfFileSectionEventDesc : public PerfFileSection { +public: + std::vector eventDesces_; + + PerfFileSectionEventDesc(FEATURE id, const char *buf, size_t size); + PerfFileSectionEventDesc(FEATURE id, const std::vector &eventDesces); + + bool GetBinary(char *buf, size_t size); + size_t GetSize(); + void GetValue(std::vector &eventDesces) const; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_PERF_FILE_FORMAT_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_reader.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_reader.h new file mode 100644 index 0000000..fb68017 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_file_reader.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_FILE_READER +#define HIPERF_FILE_READER + +#include +#include +#include +#include "perf_event_record.h" +#include "perf_file_format.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +using ProcessRecordCB = const std::function record)>; +// read record from data file, like perf.data. +// format of file follow +// tools/perf/Documentation/perf.data-file-format.txt +class PerfFileReader { +public: + virtual ~PerfFileReader(); + + static std::unique_ptr Instance(const std::string &fileName, size_t begin = 0); + static std::unique_ptr Instance(const uint8_t *buff, size_t size); + + const perf_file_header &GetHeader() const; + + std::vector GetAttrSection() const; + + // read data section, construct record, call callback for each record + bool ReadDataSection(ProcessRecordCB &callback); + + bool ReadFeatureSection(); + const std::vector &GetFeatures() const; + const std::vector> &GetFeatureSections() const; + const PerfFileSection *GetFeatureSection(FEATURE feature) const; + explicit PerfFileReader(const std::string &fileName, FILE *fp, size_t begin = 0); + explicit PerfFileReader(const uint8_t *buff, size_t size); + + const std::string GetFeatureString(const FEATURE feature) const; + + bool IsFeatrureStringSection(const FEATURE featureId) const + { + return find(FeatureStrings.begin(), FeatureStrings.end(), featureId) != + FeatureStrings.end(); + } + + // fuzz user this +protected: + virtual bool Read(void *buf, size_t len); + virtual bool Read(char *buf, uint64_t offset, size_t len); + FILE *fp_ = nullptr; + bool ReadFileHeader(); + bool ReadAttrSection(); + +private: + bool ReadRecord(ProcessRecordCB &callback); + bool IsValidDataFile(); + bool IsGzipFile(); + + // file header must be read first + + bool ReadIdsForAttr(const perf_file_attr &attr, std::vector *ids); + + const perf_event_attr *GetDefaultAttr(); + + const std::string fileName_; + uint64_t dataSectionSize_; + bool compressData_ = false; + + perf_file_header header_; + std::vector vecAttr_; + std::vector> vecAttrIds_; + + std::unordered_map mapId2Attr_; + uint64_t featureSectionOffset_; + std::vector features_; + std::vector> perfFileSections_; + + size_t fileSize_ = 0; + size_t fileBegin_ = 0; + bool isMemory_ = false; + const uint8_t *buff_ = nullptr; + const size_t buffSize_ = 0; + size_t buffCurrent_ = 0; + + bool SeekFromBegin(size_t offset) + { + if (isMemory_) { + if (offset > buffSize_) { + HLOGE("seek offset(%zu) >= buffer size(%zu)", offset, buffSize_); + return false; + } + buffCurrent_ = offset; + } else { + if (fseek(fp_, fileBegin_ + offset, SEEK_SET) != 0) { + HLOGE("fseek(%zu) failed", offset); + return false; + } + } + + return true; + } + +#ifdef HIPERF_DEBUG_TIME + std::chrono::microseconds readRecordTime_ = std::chrono::microseconds::zero(); + std::chrono::microseconds readCallbackTime_ = std::chrono::microseconds::zero(); +#endif +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_FILE_READER diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_record_format.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_record_format.h new file mode 100644 index 0000000..6a1fc90 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/perf_record_format.h @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_PERF_RECORD_FORMAT_H +#define HIPERF_PERF_RECORD_FORMAT_H + +#include +#include "utilities.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +// description from https://man7.org/linux/man-pages/man2/perf_event_open.2.html + +#define SAMPLE_ID_ALL 0 + +struct sample_id { + u32 pid; + u32 tid; /* if PERF_SAMPLE_TID set */ + u64 time; /* if PERF_SAMPLE_TIME set */ + u64 id; /* if PERF_SAMPLE_ID set */ + u64 stream_id; /* if PERF_SAMPLE_STREAM_ID set */ + u32 cpu, res; /* if PERF_SAMPLE_CPU set */ + u64 id2; /* if PERF_SAMPLE_IDENTIFIER set */ +}; + +// If PERF_FORMAT_GROUP was not specified +struct read_format { + __u64 value; /* The value of the event */ + __u64 time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */ + __u64 time_running; /* if PERF_FORMAT_TOTAL_TIME_RUNNING */ + __u64 id; /* if PERF_FORMAT_ID */ +}; + +/* + The MMAP events record the PROT_EXEC mappings so that + we can correlate user-space IPs to code. They have + the following structure: + pid is the process ID. + tid is the thread ID. + addr is the address of the allocated memory. + len is the length of the allocated memory. + pgoff is the page offset of the allocated memory. + filename + is a string describing the backing of + the allocated memory. +*/ +struct PerfRecordMmapData { + u32 pid, tid; + u64 addr; + u64 len; + u64 pgoff; + char filename[KILO]; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record includes extended information on mmap(2) + calls returning executable mappings. The format is + similar to that of the PERF_RECORD_MMAP record, but + includes extra values that allow uniquely identifying + shared mappings. + + pid is the process ID. + tid is the thread ID. + addr is the address of the allocated memory. + len is the length of the allocated memory. + pgoff is the page offset of the allocated memory. + maj is the major ID of the underlying device. + min is the minor ID of the underlying device. + ino is the inode number. + ino_generation + is the inode generation. + prot is the protection information. + flags is the flags information. + filename + is a string describing the backing of the + allocated memory. +*/ +struct PerfRecordMmap2Data { + u32 pid; + u32 tid; + u64 addr; + u64 len; + u64 pgoff; + u32 maj; + u32 min; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + char filename[KILO]; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates when events are lost. + id is the unique event ID for the samples that were lost. + lost is the number of events that were lost. +*/ +struct PerfRecordLostData { + u64 id; + u64 lost; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates a change in the process name. + pid is the process ID. + tid is the thread ID. + comm is a string containing the new name of the process. +*/ +struct PerfRecordCommData { + u32 pid; + u32 tid; + char comm[KILO]; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +// This record indicates a sample. +struct PerfRecordSampleData { + u64 sample_id; /* if PERF_SAMPLE_IDENTIFIER */ + u64 ip; /* if PERF_SAMPLE_IP */ + u32 pid, tid; /* if PERF_SAMPLE_TID */ + u64 time; /* if PERF_SAMPLE_TIME */ + u64 addr; /* if PERF_SAMPLE_ADDR */ + u64 id; /* if PERF_SAMPLE_ID */ + u64 stream_id; /* if PERF_SAMPLE_STREAM_ID */ + u32 cpu, res; /* if PERF_SAMPLE_CPU */ + u64 period; /* if PERF_SAMPLE_PERIOD */ + struct read_format v; + /* if PERF_SAMPLE_READ */ + u64 nr; /* if PERF_SAMPLE_CALLCHAIN */ + u64 *ips; /* if PERF_SAMPLE_CALLCHAIN */ + u32 raw_size; /* if PERF_SAMPLE_RAW */ + u8 *raw_data; /* if PERF_SAMPLE_RAW */ + u64 bnr; /* if PERF_SAMPLE_BRANCH_STACK */ + struct perf_branch_entry *lbr; /* if PERF_SAMPLE_BRANCH_STACK */ + u64 user_abi; /* if PERF_SAMPLE_REGS_USER */ + u64 reg_mask; + u64 reg_nr; + u64 *user_regs; /* if PERF_SAMPLE_REGS_USER */ + u64 stack_size; /* if PERF_SAMPLE_STACK_USER */ + u8 *stack_data; /* if PERF_SAMPLE_STACK_USER */ + u64 dyn_size; /* if PERF_SAMPLE_STACK_USER && stack_size != 0 */ + u64 weight; /* if PERF_SAMPLE_WEIGHT */ + u64 data_src; /* if PERF_SAMPLE_DATA_SRC */ + u64 transaction; /* if PERF_SAMPLE_TRANSACTION */ + u64 intr_abi; /* if PERF_SAMPLE_REGS_INTR */ + u64 intr_regs[0]; /* if PERF_SAMPLE_REGS_INTR */ + u64 phys_addr; /* if PERF_SAMPLE_PHYS_ADDR */ + u64 cgroup; /* if PERF_SAMPLE_CGROUP */ +}; + +/* + This record indicates a process exit event. +*/ +struct PerfRecordExitData { + u32 pid, ppid; + u32 tid, ptid; + u64 time; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates a throttle/unthrottle event. +*/ +struct PerfRecordThrottleData { + u64 time; + u64 id; + u64 stream_id; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates a fork event. +*/ +struct PerfRecordForkData { + u32 pid, ppid; + u32 tid, ptid; + u64 time; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + When using hardware sampling (such as Intel PEBS) this + record indicates some number of samples that may have + been lost. +*/ +struct PerfRecordLostSamplesData { + u64 lost; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates which process has initiated an + instruction trace event, allowing tools to properly + correlate the instruction addresses in the AUX buffer + with the proper executable. + + pid process ID of the thread starting an + instruction trace. + tid thread ID of the thread starting an instruction + trace. +*/ +struct PerfRecordItraceStartData { + u32 pid; + u32 tid; +}; + +/* + This record reports that new data is available in the + separate AUX buffer region. + + aux_offset + offset in the AUX mmap region where the new + data begins. + aux_size + size of the data made available. + flags describes the AUX update. + PERF_AUX_FLAG_TRUNCATED + if set, then the data returned was + truncated to fit the available buffer + size. + + PERF_AUX_FLAG_OVERWRITE + if set, then the data returned has + overwritten previous data. +*/ +struct PerfRecordAuxData { + u64 aux_offset; + u64 aux_size; + u64 flags; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates a read event. +*/ +struct PerfRecordReadData { + u32 pid, tid; + read_format values; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record indicates a context switch has happened. + The PERF_RECORD_MISC_SWITCH_OUT bit in the misc field + indicates whether it was a context switch into or away + from the current process. +*/ +struct PerfRecordSwitchData { +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + As with PERF_RECORD_SWITCH this record indicates a + context switch has happened, but it only occurs when + sampling in CPU-wide mode and provides additional + information on the process being switched to/from. + The PERF_RECORD_MISC_SWITCH_OUT bit in the misc field + indicates whether it was a context switch into or away + from the current process. + + next_prev_pid + The process ID of the previous (if switching + in) or next (if switching out) process on the + CPU. + + next_prev_tid + The thread ID of the previous (if switching in) + or next (if switching out) thread on the CPU. +*/ +struct PerfRecordSwitchCpuWideData { + u32 next_prev_pid; + u32 next_prev_tid; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; + +/* + This record includes various namespace information of + a process. + + pid is the process ID + tid is the thread ID + + nr_namespace + is the number of namespaces in this record + + Each namespace has dev and inode fields and is + recorded in the fixed position like below: + + NET_NS_INDEX=0 + Network namespace + UTS_NS_INDEX=1 + UTS namespace + IPC_NS_INDEX=2 + IPC namespace + PID_NS_INDEX=3 + PID namespace + USER_NS_INDEX=4 + User namespace + MNT_NS_INDEX=5 + Mount namespace + CGROUP_NS_INDEX=6 + Cgroup namespace +*/ +struct PerfRecordNamespacesData { + u32 pid; + u32 tid; + u64 nr_namespaces; + struct name_space { + u64 dev; + u64 inode; + } namespaces[0]; +#if SAMPLE_ID_ALL + struct sample_id sample_id; +#endif +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_PERF_RECORD_FORMAT_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/register.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/register.h new file mode 100644 index 0000000..116136d --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/register.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 HIPERF_REGISTER_H +#define HIPERF_REGISTER_H + +#include + +#include +#include + +#include "utilities.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +// these define copy from kernel uapi +enum perf_event_x86_regs { + PERF_REG_X86_AX, + PERF_REG_X86_BX, + PERF_REG_X86_CX, + PERF_REG_X86_DX, + PERF_REG_X86_SI, + PERF_REG_X86_DI, + PERF_REG_X86_BP, + PERF_REG_X86_SP, + PERF_REG_X86_IP, + PERF_REG_X86_FLAGS, + PERF_REG_X86_CS, + PERF_REG_X86_SS, + PERF_REG_X86_DS, + PERF_REG_X86_ES, + PERF_REG_X86_FS, + PERF_REG_X86_GS, + PERF_REG_X86_R8, + PERF_REG_X86_R9, + PERF_REG_X86_R10, + PERF_REG_X86_R11, + PERF_REG_X86_R12, + PERF_REG_X86_R13, + PERF_REG_X86_R14, + PERF_REG_X86_R15, + PERF_REG_X86_32_MAX = PERF_REG_X86_GS + 1, + PERF_REG_X86_64_MAX = PERF_REG_X86_R15 + 1, +}; + +enum perf_event_arm64_regs { + PERF_REG_ARM64_X0, + PERF_REG_ARM64_X1, + PERF_REG_ARM64_X2, + PERF_REG_ARM64_X3, + PERF_REG_ARM64_X4, + PERF_REG_ARM64_X5, + PERF_REG_ARM64_X6, + PERF_REG_ARM64_X7, + PERF_REG_ARM64_X8, + PERF_REG_ARM64_X9, + PERF_REG_ARM64_X10, + PERF_REG_ARM64_X11, + PERF_REG_ARM64_X12, + PERF_REG_ARM64_X13, + PERF_REG_ARM64_X14, + PERF_REG_ARM64_X15, + PERF_REG_ARM64_X16, + PERF_REG_ARM64_X17, + PERF_REG_ARM64_X18, + PERF_REG_ARM64_X19, + PERF_REG_ARM64_X20, + PERF_REG_ARM64_X21, + PERF_REG_ARM64_X22, + PERF_REG_ARM64_X23, + PERF_REG_ARM64_X24, + PERF_REG_ARM64_X25, + PERF_REG_ARM64_X26, + PERF_REG_ARM64_X27, + PERF_REG_ARM64_X28, + PERF_REG_ARM64_X29, + PERF_REG_ARM64_LR, + PERF_REG_ARM64_SP, + PERF_REG_ARM64_PC, + PERF_REG_ARM64_MAX, +}; + +enum perf_event_arm_regs { + PERF_REG_ARM_R0, + PERF_REG_ARM_R1, + PERF_REG_ARM_R2, + PERF_REG_ARM_R3, + PERF_REG_ARM_R4, + PERF_REG_ARM_R5, + PERF_REG_ARM_R6, + PERF_REG_ARM_R7, + PERF_REG_ARM_R8, + PERF_REG_ARM_R9, + PERF_REG_ARM_R10, + PERF_REG_ARM_FP = 11, + PERF_REG_ARM_IP = 12, + PERF_REG_ARM_SP = 13, + PERF_REG_ARM_LR = 14, + PERF_REG_ARM_PC = 15, + PERF_REG_ARM_MAX, +}; + +enum ArchType { + X86_32, + X86_64, + ARM, + ARM64, + UNSUPPORT, +}; + +// order is IP , SP for ut +static const std::map PERF_REG_NAME_MAP = { +#if defined(target_cpu_x64) + {PERF_REG_X86_IP, "PERF_REG_X86_IP"}, + {PERF_REG_X86_SP, "PERF_REG_X86_SP"}, +#elif defined(target_cpu_arm) + {PERF_REG_ARM_PC, "PERF_REG_ARM_PC"}, + {PERF_REG_ARM_SP, "PERF_REG_ARM_SP"}, +#elif defined(target_cpu_arm64) + {PERF_REG_ARM64_PC, "PERF_REG_ARM64_PC"}, + {PERF_REG_ARM64_SP, "PERF_REG_ARM64_SP"}, +#endif +}; + +// context name +static const std::map PERF_CONTEXT_NAME = { + {PERF_CONTEXT_HV, "PERF_CONTEXT_HV"}, + {PERF_CONTEXT_KERNEL, "PERF_CONTEXT_KERNEL"}, + {PERF_CONTEXT_USER, "PERF_CONTEXT_USER"}, + {PERF_CONTEXT_GUEST, "PERF_CONTEXT_GUEST"}, + {PERF_CONTEXT_GUEST_KERNEL, "PERF_CONTEXT_GUEST_KERNEL"}, + {PERF_CONTEXT_GUEST_USER, "PERF_CONTEXT_GUEST_USER"}, + {PERF_CONTEXT_MAX, "PERF_CONTEXT_MAX"}, +}; + +constexpr ArchType buildArchType = ArchType::X86_64; +const std::string UpdatePerfContext(uint64_t addr, perf_callchain_context &perfCallchainContext); +const std::string GetArchName(ArchType arch); +uint64_t GetSupportedRegMask(ArchType arch); + +// this is only for debug +const std::string RegisterGetName(size_t registerIndex); + +bool RegisterGetValue(uint64_t &value, const u64 registers[], const size_t registerIndex, + const size_t registerNumber); + +size_t RegisterGetSP(ArchType arch); +size_t RegisterGetIP(ArchType arch); + +inline bool RegisterGetSPValue(uint64_t &value, ArchType arch, const u64 registers[], + const size_t registerNumber) +{ + return RegisterGetValue(value, registers, RegisterGetSP(arch), registerNumber); +} + +inline bool RegisterGetIPValue(uint64_t &value, ArchType arch, const u64 registers[], + const size_t registerNumber) +{ + return RegisterGetValue(value, registers, RegisterGetIP(arch), registerNumber); +} + +int LibunwindRegIdToPerfReg(int regnum); + +ArchType GetDeviceArch(); +ArchType SetDeviceArch(ArchType arch); +ArchType GetArchTypeFromUname(const std::string &machine); +ArchType GetArchTypeFromABI(bool abi32); +void UpdateRegForABI(ArchType arch, u64 registers[]); +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_REGISTER_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/report.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/report.h new file mode 100644 index 0000000..d208130 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/report.h @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 REPORT_H +#define REPORT_H + +#include +#include +#include + +#include "debug_logger.h" +#include "utilities.h" +#include "virtual_runtime.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class ReportItemCallFrame { +public: + std::string_view func_; + uint64_t vaddr_; + std::string_view dso_; + uint64_t eventCount_ = 0; // call chain event + uint64_t selfEventCount_ = 0; // call chain event end in this function + std::vector childs; + ReportItemCallFrame(std::string_view func, uint64_t vaddr, std::string_view dso, + uint64_t eventCount, uint64_t selfEventCount) + : func_(func), + vaddr_(vaddr), + dso_(dso), + eventCount_(eventCount), + selfEventCount_(selfEventCount) + { + } + + bool operator==(const ReportItemCallFrame &b) const + { + return Same(b); + } + + bool operator!=(const ReportItemCallFrame &b) const + { + return !Same(b); + } + + static int CompareSortingEventCount(const ReportItemCallFrame &a, const ReportItemCallFrame &b) + { + return a.eventCount_ > b.eventCount_; + } + + static void OrderCallFrames(std::vector &callframes, int indent = 2) + { + int i = 2; + if (callframes.size() > 0) { + std::sort(callframes.begin(), callframes.end(), + &ReportItemCallFrame::CompareSortingEventCount); + + for (auto &callframe : callframes) { + HLOGDUMMY("%*s%s", indent, "", callframe.ToDebugString().c_str()); + if (callframe.childs.size() > 0) { + OrderCallFrames(callframe.childs, indent + i); + } + } + } + } + + // just a log + static void DumpCallFrames(std::vector &callframes, int indent = 2) + { + int y = 2; + if (callframes.size() > 0) { + for (auto &callframe : callframes) { + HLOGV("%*s%s", indent, "", callframe.ToDebugString().c_str()); + if (callframe.childs.size() > 0) { + DumpCallFrames(callframe.childs, indent + y); + } + } + } + } + + const std::string ToDebugString() const + { + return StringPrintf("%" PRIu64 "(%" PRIu64 ")%s(%s+0x%" PRIx64 ") child %zu", eventCount_, + selfEventCount_, func_.data(), dso_.data(), vaddr_, childs.size()); + } + +private: + bool Same(const ReportItemCallFrame &b) const + { + return (func_ == b.func_) and (vaddr_ == b.vaddr_) and (dso_ == b.dso_); + } +}; + +// one item or one line in report +class ReportItem { +public: + pid_t pid_ = 0; + pid_t tid_ = 0; + std::string_view comm_ = ""; + std::string_view dso_ = ""; + std::string_view fromDso_ = ""; + std::string_view fromFunc_ = ""; + std::string_view func_ = ""; + uint64_t vaddr_ = 0; + uint64_t eventCount_ = 0; // event count + std::vector callStacks_; + float heat = 0.0f; + static unsigned long long allIndex_; // debug only + unsigned long long index_; + + // only for ut test + ReportItem(pid_t pid, pid_t tid, const char *comm, const char *dso, const char *func, + uint64_t vaddr, uint64_t eventCount) + : pid_(pid), + tid_(tid), + comm_(comm), + dso_(dso), + func_(func), + vaddr_(vaddr), + eventCount_(eventCount) + { + HLOG_ASSERT(comm != nullptr); + index_ = allIndex_++; + } + + ReportItem(pid_t pid, pid_t tid, std::string &comm, const std::string_view &dso, + const std::string_view &func, uint64_t vaddr, uint64_t eventCount) + : pid_(pid), + tid_(tid), + comm_(comm), + dso_(dso), + func_(func), + vaddr_(vaddr), + eventCount_(eventCount) + { + HLOG_ASSERT(!comm.empty()); + index_ = allIndex_++; + } + + bool operator==(const ReportItem &b) const + { + return Same(b); + } + + bool operator!=(const ReportItem &b) const + { + return !Same(b); + } + + // debug only + const std::string ToDebugString() const + { + return StringPrintf("%d:%d:%s-%s(%s):%zu i:%llu", pid_, tid_, comm_.data(), func_.data(), + dso_.data(), eventCount_, index_); + } + + // Count + static int CompareEventCount(const ReportItem &a, const ReportItem &b) + { + if (a.eventCount_ != b.eventCount_) { + return (a.eventCount_ > b.eventCount_) ? 1 : -1; + } else { + return 0; + } + } + + static int CompareSortingEventCount(const ReportItem &a, const ReportItem &b) + { + return a.eventCount_ > b.eventCount_; + } + + static const std::string GetEventCount(const ReportItem &a, size_t len, + const std::string &format) + { + return StringPrintf(format.c_str(), len, a.eventCount_); + } + + // Pid + static int ComparePid(const ReportItem &a, const ReportItem &b) + { + if (a.pid_ != b.pid_) { + return (a.pid_ > b.pid_) ? 1 : -1; + } else { + return 0; + } + } + static const std::string GetPid(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.pid_); + } + + // Tid + static int CompareTid(const ReportItem &a, const ReportItem &b) + { + if (a.tid_ != b.tid_) { + return (a.tid_ > b.tid_) ? 1 : -1; + } else { + return 0; + } + } + static const std::string GetTid(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.tid_); + } + + // Comm + static int CompareComm(const ReportItem &a, const ReportItem &b) + { + int result = a.comm_.compare(b.comm_); + return result; + } + static const std::string GetComm(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.comm_.data()); + } + + // Func + static int CompareFunc(const ReportItem &a, const ReportItem &b) + { + return a.func_.compare(b.func_); + } + static const std::string GetFunc(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.func_.data()); + } + + // Dso + static int CompareDso(const ReportItem &a, const ReportItem &b) + { + return a.dso_.compare(b.dso_); + } + static const std::string GetDso(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.dso_.data()); + } + + // fromDso + static int CompareFromDso(const ReportItem &a, const ReportItem &b) + { + return a.fromDso_.compare(b.fromDso_); + } + static const std::string GetFromDso(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.fromDso_.data()); + } + + // fromFunc + static int CompareFromFunc(const ReportItem &a, const ReportItem &b) + { + return a.fromFunc_.compare(b.fromFunc_); + } + static const std::string GetFromFunc(const ReportItem &a, size_t len, const std::string &format) + { + return StringPrintf(format.c_str(), len, a.fromFunc_.data()); + } + +private: + bool Same(const ReportItem &b) const + { + return (comm_ == b.comm_) && (pid_ == b.pid_) && (tid_ == b.tid_) && (func_ == b.func_) && + (dso_ == b.dso_) && (vaddr_ == b.vaddr_); + } +}; + +using ReportKeyCompareFunction = int(const ReportItem &, const ReportItem &); +using ReportKeyGetFunction = const std::string(const ReportItem &, size_t, const std::string &); + +constexpr const int MAX_FILED_LEN = 20; +constexpr const int CALLSTACK_INDENT = 4; +struct ReportKey { + const std::string keyName_; + const std::string valueFormat_; + size_t maxLen_ = 0u; + std::string maxValue_; + ReportKeyCompareFunction &compareFunction_; + ReportKeyGetFunction &GetFunction_; + const std::vector &displayFilter_; + + ReportKey(const std::string keyName, ReportKeyCompareFunction &compareFunction, + ReportKeyGetFunction &GetFunction, const std::string valueFormat, + const std::vector &displayFilter) + : keyName_(keyName), + valueFormat_(valueFormat), + compareFunction_(compareFunction), + GetFunction_(GetFunction), + displayFilter_(displayFilter) + { + maxLen_ = keyName.size(); + } + + void UpdateValueMaxLen(const std::string &value) + { + size_t newMaxLen = std::max(maxLen_, value.size()); + if (maxLen_ < newMaxLen) { + maxValue_ = value; + maxLen_ = newMaxLen; + } + } + + void UpdateValueMaxLen(size_t value) + { + size_t newMaxLen = std::max(maxLen_, std::to_string(value).size()); + if (maxLen_ < newMaxLen) { + maxValue_ = std::to_string(value); + maxLen_ = newMaxLen; + } + } + + std::string GetValue(const ReportItem &i) + { + return GetFunction_(i, maxLen_, valueFormat_); + } + + bool ShouldDisplay(const ReportItem &i) + { + if (displayFilter_.size() == 0) { + return true; + } else { + std::string value = GetFunction_(i, 0, valueFormat_); + auto it = find(displayFilter_.begin(), displayFilter_.end(), value); + if (it == displayFilter_.end()) { + HLOGV(" not found '%s' in %s", value.c_str(), + VectorToString(displayFilter_).c_str()); + } + return (it != displayFilter_.end()); + } + } +}; + +using ReportItems = std::vector; +using ReportItemsIt = ReportItems::iterator; +using ReportItemsConstIt = ReportItems::const_iterator; + +struct ReportOption { + float heatLimit_ = 0.0f; + float callStackHeatLimit_ = 0.0f; + + // display filter + std::vector displayComms_ {}; + std::vector displayPids_ {}; + std::vector displayTids_ {}; + std::vector displayDsos_ {}; + std::vector displayFromDsos_ {}; + std::vector displayFuncs_ {}; + std::vector displayFromFuncs_ {}; + std::vector displayDummy_ {}; + + std::vector sortKeys_ = {"comm", "pid", "tid", "dso", "func"}; + + bool debug_ = false; + bool hideCount_ = false; +}; + +class Report { +public: + Report() : option_(defaultOption_), virtualRuntime_(false) + { + // works for ut test + } + Report(ReportOption &option) : option_(option), virtualRuntime_(false) {} + bool MultiLevelSame(const ReportItem &a, const ReportItem &b); + void AdjustReportItems(); + void AddReportItem(const PerfRecordSample &sample, bool includeCallStack); + void AddReportItemBranch(const PerfRecordSample &sample); + void OutputStd(FILE *output); + void OutputStdDiff(FILE *output, Report &other); + + ReportOption &option_; + + VirtualRuntime virtualRuntime_; + + std::map reportKeyMap_ = { + { + "count", + { + "count", + ReportItem::CompareEventCount, + ReportItem::GetEventCount, + "%*" PRIu64 "", + option_.displayDummy_, + }, + }, + { + "comm", + { + "comm", + ReportItem::CompareComm, + ReportItem::GetComm, + "%-*s", + option_.displayComms_, + }, + }, + { + "pid", + { + "pid", + ReportItem::ComparePid, + ReportItem::GetPid, + "%*d", + option_.displayPids_, + }, + }, + { + "tid", + { + "tid", + ReportItem::CompareTid, + ReportItem::GetTid, + "%*d", + option_.displayTids_, + }, + }, + { + "dso", + { + "dso", + ReportItem::CompareDso, + ReportItem::GetDso, + "%-*s", + option_.displayDsos_, + }, + }, + { + "from_dso", + { + "from_dso", + ReportItem::CompareFromDso, + ReportItem::GetFromDso, + "%-*s", + option_.displayFromDsos_, + }, + }, + { + "func", + { + "func", + ReportItem::CompareFunc, + ReportItem::GetFunc, + "%-*s", + option_.displayFuncs_, + }, + }, + { + "from_func", + { + "from_func", + ReportItem::CompareFromFunc, + ReportItem::GetFromFunc, + "%-*s", + option_.displayFromFuncs_, + }, + }, + }; + struct ReportEventConfigItem { + ReportEventConfigItem(const ReportEventConfigItem &) = delete; + ReportEventConfigItem &operator=(const ReportEventConfigItem &) = delete; + ReportEventConfigItem(ReportEventConfigItem &&) = default; + std::string eventName_; + uint64_t sampleCount_ = 0; + uint64_t eventCount_ = 0; + std::vector reportItems_; + uint32_t type_; + uint64_t config_; + std::vector ids_; + + bool coutMode_ = true; // use cout or time ? + bool operator==(const ReportEventConfigItem &o) const + { + return (type_ == o.type_) && (config_ == o.config_); + } + bool operator!=(const ReportEventConfigItem &o) const + { + return !(operator==(o)); + } + std::string toDebugString() + { + return StringPrintf("%s(%" PRIu32 "-%" PRIu64 "):PRIu64", eventName_.c_str(), type_, + config_, sampleCount_); + } + ReportEventConfigItem(std::string eventName, uint32_t type, uint64_t config, + bool coutMode = true) + : eventName_(eventName), type_(type), config_(config), coutMode_(coutMode) + { + } + }; + std::vector configs_; + virtual ~Report() {} + + std::map configIdIndexMaps_; // index of configNames_ + std::string GetConfigName(uint64_t id) + { + return configs_[GetConfigIndex(id)].eventName_; + } + size_t GetConfigIndex(uint64_t id) + { + HLOG_ASSERT_MESSAGE(configIdIndexMaps_.find(id) != configIdIndexMaps_.end(), + "unable found id %" PRIx64 "", id); + return configIdIndexMaps_.at(id); + } + +private: + FILE *output_ = nullptr; + const std::string TEXT_RED = "\x1b[31m"; + const std::string TEXT_GREEN = "\x1b[32m"; + const std::string TEXT_RESET = "\033[0m"; + const unsigned int ConsoleDefaultWidth = 80; + + // sometime caller don't give the option + ReportOption defaultOption_; + + std::vector displayKeyNames_; + + // use virtual only for gmock test + bool MultiLevelSorting(const ReportItem &a, const ReportItem &b); + bool MultiLevelSameAndUpdateCount(ReportItem &l, ReportItem &r); + void MergeCallFrameCount(ReportItem &l, ReportItem &r); + virtual int MultiLevelCompare(const ReportItem &a, const ReportItem &b); + + void StatisticsRecords(); + void FilterDisplayRecords(); + void UpdateReportItemsAfterAdjust(); + + // std out + unsigned int consoleWidth_ = 0; + void PrepareConsole(); + + void OutputStdStatistics(ReportEventConfigItem &); + bool OutputStdStatistics(ReportEventConfigItem &config, ReportEventConfigItem &otherConfig); + + void OutputStdHead(ReportEventConfigItem &, bool diffMode = false); + + void OutputStdContent(ReportEventConfigItem &); + void OutputStdContentDiff(ReportEventConfigItem &, ReportEventConfigItem &); + + void OutputStdContentItem(const ReportItem &reportItem); + void OutputStdContentDiffOneSide(bool leftOnly, ReportItem &reportItem); + + void OutputStdCallFrames(int indent, const ReportItemCallFrame &callFrames, + uint64_t totalEventCount); + bool OutputStdCallFrame(int indent, const std::string_view &funcName, uint64_t eventCount, + uint64_t totalEventCount); + void OutputStdItemHeating(float heat, float heat2); +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // REPORT_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/ring_buffer.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/ring_buffer.h new file mode 100644 index 0000000..3a83931 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/ring_buffer.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_RING_BUFFER_H +#define HIPERF_RING_BUFFER_H + +// #ifdef target_cpu_x64 +#include +// #endif +#include + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class RingBuffer { +public: + // little endian, perf_event_header.type is less than 0xff, so set it + static constexpr uint8_t MARGIN_BYTE = 0xFF; + + explicit RingBuffer(size_t size); + ~RingBuffer(); + // get size of the writable space + size_t GetFreeSize() const; + + // before writing data to rbuff, alloc space first + uint8_t *AllocForWrite(size_t writeSize); + // after writing data, move head pointer + void EndWrite(); + // get data from buff, return nullptr if no readable data + uint8_t *GetReadData(); + // after reading, move tail pointer + void EndRead(); + +private: + std::unique_ptr buf_ = nullptr; + const size_t size_; + std::atomic head_ {0}; + // std::atomic_size_t head_ = 0; // write after this, always increase + // std::atomic_size_t tail_ = 0; // read from this, always increase + std::atomic tail_ {0}; + size_t writeSize_ = 0; + size_t readSize_ = 0; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_RING_BUFFER_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_dump.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_dump.h new file mode 100644 index 0000000..e2cf826 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_dump.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * 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 SUBCOMMAND_DUMP_H +#define SUBCOMMAND_DUMP_H + +#include "perf_file_reader.h" + +#include + +#if HAVE_PROTOBUF +#include "report_protobuf_file.h" +#endif +#include "subcommand.h" +#include "symbols_file.h" +#include "virtual_runtime.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static const std::string DEFAULT_DUMP_FILENAME = "perf.data"; + +class SubCommandDump : public SubCommand { +public: + SubCommandDump() + // clang-format off + : SubCommand("dump", "Dump content of a perf data file, like perf.data", + + "Usage: hiperf dump [option] \n" + " Dump specific parts of specified file .\n" + " --head\n" + " Dump header and attrs only.\n" + " -d\n" + " Dump data section only.\n" + " -f\n" + " Dump addtional features only.\n" + " --sympath \n" + " use symbols path to find symbols.\n" + " --elf \n" + " dump elf not perf data.\n" +#if HAVE_PROTOBUF + " --proto \n" + " dump perf data from protobuf file.\n" +#endif + " --export \n" + " also export the user stack data to some split file,\n" + " use this command to produce ut data." + " named with sample index(0 base):\n" + " hiperf___user_regs_.dump\n" + " hiperf___user_data_.dump\n" + " \n" + " perf data file to dump, default is perf.data\n\n" + ) + // clang-format on + { + } + ~SubCommandDump() override; + + bool OnSubCommand(std::vector &args) override; + bool ParseOption(std::vector &args) override; + + static bool RegisterSubCommandDump(void); + + static void DumpPrintEventAttr(const perf_event_attr &attr, int indent = 0); + std::unique_ptr reader_; + +private: + static void DumpSampleType(uint64_t sampleType, int indent); + int exportSampleIndex_ = -1; + int currectSampleIndex_ = 0; + std::string dumpFileName_; + std::string elfFileName_; + std::string protobufDumpFileName_; + int indent_ = 0; +#if HAVE_PROTOBUF + std::unique_ptr protobufInputFileReader_ = nullptr; +#endif + + std::vector attrIds_; + + bool dumpHeader_ = false; + bool dumpFeatures_ = false; + bool dumpData_ = false; + bool dumpAll_ = true; + + std::vector dumpSymbolsPaths_; + + bool CheckInputFile(); + bool DumpElfFile(); +#if HAVE_PROTOBUF + bool DumpProtoFile(); +#endif + void DumpPrintFileHeader(int indent = 0); + void DumpAttrPortion(int indent = 0); + void DumpDataPortion(int indent = 0); + void DumpCallChain(int indent, std::unique_ptr &sample); + void DumpFeaturePortion(int indent = 0); + void ExprotUserData(std::unique_ptr &record); + void ExprotUserStack(const PerfRecordSample &recordSample); + void PrintHeaderInfo(const int &indent); + void PrintSymbolFile(const int &indent, const SymbolFileStruct &symbolFileStruct); + void PrintFeatureEventdesc(int indent, const PerfFileSectionEventDesc §ionEventdesc); + VirtualRuntime vr_; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // SUBCOMMAND_DUMP_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_help.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_help.h new file mode 100644 index 0000000..18a6eb2 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/subcommand_help.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * 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 HIPERF_SUBCOMMAND_HELP_H_ +#define HIPERF_SUBCOMMAND_HELP_H_ + +#include "option.h" +#include "subcommand.h" +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class SubCommandHelp : public SubCommand { +public: + SubCommandHelp() + // clang-format off + : SubCommand("help", "Show more help information for hiperf", + "Usage: hiperf help [subcommand]\n" + " By default, all options help information and subcommand brief information are output.\n" + " If you provide a subcommand, only the help information for this command will be output.\n\n" + ) + // clang-format on + { + Option::RegisterMainOption("--help", "show help", OnHelp); + Option::RegisterMainOption("-h", "show help", OnHelp); + } + + bool OnSubCommand(std::vector &args) override; + static void RegisterSubCommandHelp(void); + static bool OnHelp(std::vector &args); +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_SUBCOMMAND_HELP_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/symbols_file.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/symbols_file.h new file mode 100644 index 0000000..f6670c0 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/symbols_file.h @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_SYMBOLS_H +#define HIPERF_SYMBOLS_H + +#include +#include +#include +#include + +#include "perf_file_format.h" +#include "utilities.h" + +#define HIPERF_ELF_READ_USE_MMAP + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +constexpr const char KERNEL_MMAP_NAME[] = "[kernel.kallsyms]"; +constexpr const char KERNEL_MODULES_EXT_NAME[] = ".ko"; +constexpr const char KERNEL_ELF_NAME[] = "vmlinux"; +constexpr const char MMAP_VDSO_NAME[] = "[vdso]"; +constexpr const char MMAP_ANONYMOUS_NAME[] = "[anon]"; +constexpr const char MMAP_ANONYMOUS_OHOS_NAME[] = "//anon"; + +const std::string NOTE_GNU_BUILD_ID = ".note.gnu.build-id"; +const std::string EH_FRAME_HR = ".eh_frame_hdr"; +const std::string EH_FRAME = ".eh_frame"; +const std::string ARM_EXIDX = ".ARM.exidx"; +const std::string SYMTAB = ".symtab"; +const std::string DYNSYM = ".dynsym"; +const std::string GNU_DEBUGDATA = ".gnu_debugdata"; +const std::string PLT = ".plt"; +const std::string LINKER_PREFIX = "__dl_"; +const std::string LINKER_PREFIX_NAME = "[linker]"; + +const int MAX_SYMBOLS_TYPE_NAME_LEN = 10; + +class FileSymbol { + [[maybe_unused]] uint64_t vaddr_ = 0; + [[maybe_unused]] uint64_t len_ = 0; + std::string name_ = ""; + std::string demangle_ = ""; // demangle string + FileSymbol(uint64_t vaddr, uint64_t len, const char *name, const char *demangle) + : vaddr_(vaddr), len_(len), name_(name), demangle_(demangle) + { + } +}; + +struct Symbol { + uint64_t funcVaddr_ = 0; + uint64_t fileVaddr_ = 0; + uint64_t taskVaddr_ = 0; + uint64_t len_ = 0; + int32_t index_ = -1; + std::string_view name_ = ""; + std::string_view demangle_ = ""; // demangle string + std::string_view module_ = ""; // maybe empty + std::string_view comm_ = ""; // we need a comm name like comm@0x1234 + mutable std::string_view unknow_ = ""; + mutable bool matched_ = false; // if some callstack match this + int32_t hit_ = 0; + + // elf use this + Symbol(uint64_t vaddr, uint64_t len, const std::string &name, const std::string &demangle, + const std::string module) + : funcVaddr_(vaddr), + fileVaddr_(vaddr), + len_(len), + name_(MemoryHold::Get().HoldStringView(name)), + demangle_(MemoryHold::Get().HoldStringView(demangle)), + module_(MemoryHold::Get().HoldStringView(module)) {} + Symbol(uint64_t vaddr, uint64_t len, const std::string &name, const std::string &module) + : Symbol(vaddr, len, name, name, module) {} + + // kernel use this + Symbol(uint64_t vaddr, const std::string &name, const std::string &module) + : Symbol(vaddr, 0, name, name, module) {} + + // Symbolic use this + Symbol(uint64_t taskVaddr = 0, const std::string &comm = "") + : taskVaddr_(taskVaddr), comm_(comm) + { + } + + // copy + Symbol(const Symbol &other) = default; + + static bool SameVaddr(const Symbol &a, const Symbol &b) + { + return (a.funcVaddr_ == b.funcVaddr_); + } + bool Same(const Symbol &b) const + { + return (funcVaddr_ == b.funcVaddr_ and demangle_ == b.demangle_); + } + bool operator==(const Symbol &b) const + { + return Same(b); + } + + bool operator!=(const Symbol &b) const + { + return !Same(b); + } + + bool isValid() const + { + return !module_.empty(); + } + + void SetMatchFlag() const + { + matched_ = true; + } + + inline bool HasMatched() const + { + return matched_; + } + + std::string_view Name() const + { + if (!demangle_.empty()) { + return demangle_; + } + if (!name_.empty()) { + return name_; + } + if (unknow_.empty()) { + std::stringstream sstream; + if (!module_.empty()) { + sstream << module_ << "+0x" << std::hex << fileVaddr_; + } else { + sstream << comm_ << "@0x" << std::hex << taskVaddr_; + } + std::string hold = sstream.str(); + unknow_ = MemoryHold::Get().HoldStringView(hold); + } + return unknow_; + } + + std::string ToString() const + { + std::stringstream sstream; + if (fileVaddr_ != 0) { + sstream << "0x" << std::hex << fileVaddr_; + } else { + sstream << "0x" << std::hex << taskVaddr_; + } + sstream << " " << Name(); + return sstream.str(); + }; + + std::string ToDebugString() const + { + std::stringstream sstream; + sstream << "0x" << std::setfill('0') << std::setw(sizeof(funcVaddr_) * BYTE_PRINT_WIDTH) + << std::hex << funcVaddr_; + sstream << "|"; + sstream << std::setfill('0') << std::setw(sizeof(len_)) << len_; + sstream << "|"; + sstream << demangle_ << "|"; + sstream << name_ << "|"; + sstream << (matched_ ? "matched" : ""); + sstream << " unknowname:" << unknow_.size(); + sstream << " task:" << (comm_.size() > 0 ? comm_ : ""); + sstream << "@" << taskVaddr_; + sstream << " file:" << (module_.size() > 0 ? module_ : ""); + sstream << "@" << fileVaddr_; + + return sstream.str(); + }; + + bool Contain(uint64_t addr) const + { + if (len_ == 0) { + return funcVaddr_ <= addr; + } else { + return (funcVaddr_ <= addr) and ((funcVaddr_ + len_) > addr); + } + } + + // The range [first, last) must be partitioned with respect to the expression !(value < element) + // or !comp(value, element) + static bool ValueLessThen(uint64_t vaddr, const Symbol &a) + { + return vaddr < a.funcVaddr_; + } + static bool ValueLessEqual(uint64_t vaddr, const Symbol &a) + { + return vaddr <= a.funcVaddr_; + } + static bool CompareLessThen(const Symbol &a, const Symbol &b) + { + return a.funcVaddr_ < b.funcVaddr_; // we should use vaddr to sort + }; + static bool CompareByPointer(const Symbol *a, const Symbol *b) + { + return a->funcVaddr_ < b->funcVaddr_; // we should use vaddr to sort + }; +}; + +enum SymbolsFileType { + SYMBOL_KERNEL_FILE, + SYMBOL_KERNEL_MODULE_FILE, + SYMBOL_ELF_FILE, + SYMBOL_JAVA_FILE, + SYMBOL_JS_FILE, + SYMBOL_UNKNOW_FILE, +}; + +class SymbolsFile { +public: + SymbolsFileType symbolFileType_; + std::string filePath_ = ""; + + // [14] .text PROGBITS 00000000002c5000 000c5000 + // min exec addr , general it point to .text + // we make a default value for min compare + static const uint64_t maxVaddr = std::numeric_limits::max(); + + uint64_t textExecVaddr_ = maxVaddr; + uint64_t textExecVaddrFileOffset_ = 0; + uint64_t textExecVaddrRange_ = maxVaddr; + + SymbolsFile(SymbolsFileType symbolType, const std::string path) + : symbolFileType_(symbolType), filePath_(path) {}; + virtual ~SymbolsFile(); + + // create the symbols file object + static std::unique_ptr CreateSymbolsFile( + SymbolsFileType = SYMBOL_UNKNOW_FILE, const std::string symbolFilePath = EMPTY_STRING); + static std::unique_ptr CreateSymbolsFile(const std::string &symbolFilePath); + + // set symbols path + bool setSymbolsFilePath(const std::string &symbolsSearchPath) + { + std::vector symbolsSearchPaths = {symbolsSearchPath}; + return setSymbolsFilePath(symbolsSearchPaths); + }; + bool setSymbolsFilePath(const std::vector &); + + // load symbol from file + virtual bool LoadSymbols([[maybe_unused]] const std::string &symbolFilePath = EMPTY_STRING) + { + HLOGV("virtual dummy function called"); + symbolsLoaded_ = true; + return false; + }; + // load debug info for unwind + virtual bool LoadDebugInfo([[maybe_unused]] const std::string &symbolFilePath = EMPTY_STRING) + { + HLOGV("virtual dummy function called"); + debugInfoLoaded_ = true; + return false; + }; + // get the build if from symbols + const std::string GetBuildId() const; + + // get the symbols vector + const std::vector &GetSymbols(); + const std::vector &GetMatchedSymbols(); + + // get vaddr(in symbol) from ip(real addr , after mmap reloc) + virtual uint64_t GetVaddrInSymbols(uint64_t ip, uint64_t mapStart, uint64_t mapOffset) const; + + // get symbols from vaddr + const Symbol GetSymbolWithVaddr(uint64_t vaddr); + + // read the .text section and .eh_frame section (RO) memory from elf mmap + // unwind use this to check the DWARF and so on + virtual size_t ReadRoMemory(uint64_t, uint8_t * const, size_t) const + { + HLOGV("virtual dummy function called"); + return 0; // default not support + } + + // get the section info , like .ARM.exidx + virtual bool GetSectionInfo([[maybe_unused]] const std::string &name, + [[maybe_unused]] uint64_t §ionVaddr, + [[maybe_unused]] uint64_t §ionSize, + [[maybe_unused]] uint64_t §ionFileOffset) const + { + HLOGV("virtual dummy function called"); + return false; + } +#ifndef target_cpu_arm + // get hdr info for unwind , need provide the fde table location and entry count + virtual bool GetHDRSectionInfo([[maybe_unused]] uint64_t &ehFrameHdrElfOffset, + [[maybe_unused]] uint64_t &fdeTableElfOffset, + [[maybe_unused]] uint64_t &fdeTableSize) const + { + HLOGV("virtual dummy function called"); + return false; + } +#endif + // load from symbols from the perf.data format + static std::unique_ptr LoadSymbolsFromSaved(const SymbolFileStruct &); + // save the symbols to perf.data format + void ExportSymbolToFileFormat(SymbolFileStruct &symbolFileStruct); + + bool SymbolsLoaded() + { + return symbolsLoaded_; + } + + // this means we are in recording + // will try read some elf in runtime path + static bool onRecording_; + +protected: + bool symbolsLoaded_ = false; + bool debugInfoLoaded_ = false; + const std::string FindSymbolFile(const std::vector &, + std::string symboleFilePath = EMPTY_STRING) const; + + std::string SearchReadableFile(const std::vector &searchPaths, + const std::string &filePath) const; + bool UpdateBuildIdIfMatch(std::string buildId); + std::string buildId_; + std::vector symbolsFileSearchPaths_; + std::vector symbols_{}; + std::vector matchedSymbols_{}; + std::vector fileSymbols_{}; + + void AdjustSymbols(); + void SortMatchedSymbols(); + bool CheckPathReadable(const std::string& path) const; + + friend class VirtualRuntimeTest; + + friend class ReportProtobufFileTest; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_SYMBOLS_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/tracked_command.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/tracked_command.h new file mode 100644 index 0000000..628128b --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/tracked_command.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_TRACKED_COMMAND_H_ +#define HIPERF_TRACKED_COMMAND_H_ + +#include +#include +#include +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class TrackedCommand : public Noncopyable { +public: + enum class State { + COMMAND_WAITING, // child process blocked to execute command + COMMAND_STARTED, // child process executing command + COMMAND_FAILURE, // command failed to start + COMMAND_STOPPED // no child process or command execution + }; + + static std::unique_ptr CreateInstance(const std::vector &args); + + ~TrackedCommand(); + + bool CreateChildProcess(); + bool StartCommand(); + bool WaitCommand(int &wstatus); + void Stop(); + + inline std::string GetCommandName() + { + if (!command_.empty()) { + return command_[0]; + } + return EMPTY_STRING; + } + + inline State GetState() + { + return state_; + } + + inline pid_t GetChildPid() + { + return childPid_; + } + +private: + explicit TrackedCommand(const std::vector &args); + + bool InitSignalPipes(int &startFd, int &ackFd); + void ExecuteCommand(const int &startFd, const int &ackFd); + void MakeInvalid(); + + std::vector command_ {}; + int startFd_ {-1}; + int ackFd_ {-1}; + pid_t childPid_ {-1}; + State state_ {State::COMMAND_STOPPED}; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_TRACKED_COMMAND_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/utilities.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/utilities.h new file mode 100644 index 0000000..ce40061 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/utilities.h @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_UTILITIES_H_ +#define HIPERF_UTILITIES_H_ + +// for security function +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#if !is_mingw +#include +#endif +#include + +#include "debug_logger.h" +#include "noncopyable.h" +#include "string_help.h" + +#ifndef __ASSEMBLY__ +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ + +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +#ifdef __GNUC__ +__extension__ typedef __signed__ long long __s64; +__extension__ typedef unsigned long long __u64; +#else +typedef __signed__ long long __s64; +typedef unsigned long long __u64; +#endif + +#endif /* __ASSEMBLY__ */ + +// data and value +/* +long long always 64 only in ILP64, int is 64 otherwise int is always 32 +*/ +using s8 = __s8; +using u8 = __u8; +using s16 = __s16; +using u16 = __u16; +using s32 = __s32; +using u32 = __u32; +using s64 = __s64; +using u64 = __u64; + +constexpr const int NUMBER_FORMAT_HEX_BASE = 16; +constexpr const int BYTE_PRINT_WIDTH = 2; +constexpr const int UINT64_PRINT_WIDTH = BYTE_PRINT_WIDTH * 8; +constexpr const int BITS_OF_BYTE = 8; +constexpr const int BITS_OF_TWO_BYTE = 2 * BITS_OF_BYTE; +constexpr const int BITS_OF_FOUR_BYTE = 4 * BITS_OF_BYTE; +constexpr const int FULL_PERCENTAGE = 100; +constexpr const int FULL_PERCENTAGE_NUM_LEN = 5; // 100.00 +constexpr const int FULL_PERCENTAGE_DIFF_NUM_LEN = 6; // +100.00 +constexpr const int FULL_PERCENTAGE_LEN = 6; // 100.00% +constexpr const int FULL_PERCENTAGE_DIFF_LEN = 7; // +100.00% +constexpr const int THOUSANDS = 1000; +constexpr const int HUNDREDS = 100; +constexpr const int DEFAULT_STRING_BUF_SIZE = 4096; +constexpr const int FIVE_THOUSANDS = 5000; +#if !is_mingw +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#endif + +constexpr const double MS_DUARTION = + static_cast(std::chrono::milliseconds::duration::period::den); + +constexpr uint64_t KILO = 1024; + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +std::string CanonicalizeSpecPath(const char* src); +const std::string EMPTY_STRING = ""; +const ssize_t ERRINFOLEN = 512; + +// string function +class MemoryHold { +public: + ~MemoryHold() + { + Clean(); + } + const char *HoldStringView(std::string_view view); + // only use in UT + void Clean() + { + for (auto &p : holder_) { + delete[] p; + } + holder_.clear(); + } + static MemoryHold &Get() + { + static MemoryHold instance; + return instance; + } + +private: + std::vector holder_; +}; + +std::string StringReplace(std::string source, const std::string &from, const std::string &to); + +template +std::string VectorToString(const std::vector &items) +{ + if constexpr (std::is_same>::value) { + std::vector stringItems; + for (auto item : items) { + stringItems.push_back("[" + VectorToString(item) + "]"); + } + return VectorToString(stringItems); + } else { + std::string itemsString; + const std::string split = ","; + for (auto item : items) { + if (!itemsString.empty()) + itemsString.append(split); + if constexpr (std::is_same::value) { + itemsString.append(item); + } else { + itemsString.append(std::to_string(item)); + } + } + if (itemsString.empty()) + itemsString.append(""); + return itemsString; + } +} + +std::string BufferToHexString(const std::vector &vec); +std::string BufferToHexString(const unsigned char buf[], size_t size); +void HexDump(const void *buf, size_t size, size_t max_size = 0); + +std::string &StringTrim(std::string &s); + +std::vector StringSplit(std::string source, std::string split = ","); + +size_t SubStringCount(const std::string &source, const std::string &sub); + +bool StringStartsWith(const std::string &string, const std::string &with); + +bool StringEndsWith(const std::string &string, const std::string &with); + +bool IsSameCommand(const std::string &cmdLine, const std::string &cmdName); + +std::vector GetSubthreadIDs(const pid_t pid); + +bool IsDigits(const std::string &str); + +bool IsHexDigits(const std::string &str); + +constexpr const int COMPRESS_READ_BUF_SIZE = 4096; +// compress specified dataFile into gzip file +bool CompressFile(const std::string &dataFile, const std::string &destFile); +// uncompress specified gzip file into dataFile +bool UncompressFile(const std::string &gzipFile, const std::string &dataFile); + +template +std::string StringPrintf(const char *stringFormat, VA... args) +{ + // check howmany bytes we need + char bytes[DEFAULT_STRING_BUF_SIZE]; + bytes[DEFAULT_STRING_BUF_SIZE - 1] = '\0'; + + if (stringFormat == nullptr) { + return EMPTY_STRING; + } + + // print it to bytes + if (snprintf_s(bytes, sizeof(bytes), sizeof(bytes) - 1, stringFormat, + args...) < 0) { + return EMPTY_STRING; + } + + // make a string return + return std::string(bytes); +} + +// path check +std::vector GetEntriesInDir(const std::string &basePath); + +std::vector GetSubDirs(const std::string &basePath); + +bool IsDir(const std::string &path); + +bool IsPath(const std::string &fileName); + +#if is_mingw +const char PATH_SEPARATOR = '\\'; +#else +const char PATH_SEPARATOR = '/'; +#endif +const std::string PATH_SEPARATOR_STR = std::string(1, PATH_SEPARATOR); + +std::string PlatformPathConvert(const std::string &path); + +// attribute +#define PACKED __attribute__((packed)) + +// data align + +// some time u will meet signal 7 (SIGBUS), code 1 (BUS_ADRALN) in 32 or 64 arch cpu +#define HIPERF_BUF_ALIGN alignas(64) + +#define ALIGN(size, align) (((size) + (align) - 1) & (~((align) - 1))) + +uint32_t RoundUp(uint32_t x, const int align); + +// data convert function +template +std::string ToHex(const T &source, int size = sizeof(T), bool prefix = false) +{ + std::stringstream ss; + if (prefix) { + ss << "0x"; + } + ss << std::hex << std::setw(BYTE_PRINT_WIDTH * size) << std::setfill('0') << (uint64_t)source; + return ss.str(); +} + +// data move and copy +template +size_t inline CopyFromBufferAndMove(S *&buffer, T *dest, size_t size = 0) +{ + if (size == 0) { + size = sizeof(T); + } + if (memcpy_s(dest, size, buffer, size) != EOK) { + return size; + } + buffer = buffer + size; + return size; +} + +// file read write +bool ReadIntFromProcFile(const std::string &path, int &value); +bool WriteIntToProcFile(const std::string &path, int value); +std::string ReadFileToString(const std::string &fileName); +bool ReadFileToString(const std::string &fileName, std::string &content, size_t fileSize = 0); +bool WriteStringToFile(const std::string &fileName, const std::string &value); + +// stdout +class StdoutRecord { +public: + ~StdoutRecord() + { + Stop(); // stdout need restore + } + StdoutRecord(const std::string &tempFile = EMPTY_STRING, + const std::string &mode = EMPTY_STRING); + + bool Start(); + std::string Stop(); + +private: + OHOS::UniqueFd stdoutFile_; // back and restore stdout + std::FILE *recordFile_ = nullptr; // save the output + bool stop_ = true; + std::string content_ = EMPTY_STRING; +}; + +// misc +template +float Percentage(const T &a, const T &b) +{ + return static_cast(a) / static_cast(b) * FULL_PERCENTAGE; +} + +bool IsRoot(); +bool PowerOfTwo(uint64_t n); + +#define INDENT_ONE_LEVEL (indent + 1) +#define INDENT_TWO_LEVEL (indent + 2) + +#define PrintIndent(indent, format, ...) \ + if (indent >= 0) { \ + printf("%*s" format, (indent)*2, "", ##__VA_ARGS__); \ + } else { \ + HLOGV("%s" format, "", ##__VA_ARGS__); \ + } + +#ifndef MMAP_FAILED +#define MMAP_FAILED reinterpret_cast(-1) +#endif +#ifndef MAP_FAILED +#define MAP_FAILED MMAP_FAILED +#endif +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS + +// this will also used for libunwind head (out of namespace) +#if is_mingw +#if !is_double_framework +#define HAVE_MMAP 1 +#define MAP_PRIVATE 0x02 +#define PROT_NONE 0 +#define PROT_READ 1 +#define PROT_WRITE 2 +#define PROT_EXEC 4 +void *mmap(void *addr, size_t length, int prot, int flags, int fd, size_t offset); +int munmap(void *addr, size_t); +#endif +#endif + +#endif // HIPERF_UTILITIES_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_runtime.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_runtime.h new file mode 100644 index 0000000..ff81c99 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_runtime.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_VIRTUAL_RUNTIME_H +#define HIPERF_VIRTUAL_RUNTIME_H + +#include + +#include "callstack.h" +#include "perf_event_record.h" +#include "symbols_file.h" +#include "virtual_thread.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +/* +This Class contains userspace thread objects. and kernel space objects +It represents a virtual operating environment, mainly referring to the relationship between pid, +mmaps, and symbols. + +It mainly receives data is ip pointer (virtual address), pid +According to these data, it will find the corresponding mmap and its corresponding elf (also called +DSO) + +Then find the corresponding symbol in the corresponding elf symbol file according to the offset +recorded in the corresponding mmap. +*/ + +class VirtualRuntime { +public: + VirtualRuntime(bool onDevice = true); + + // thread need hook the record + // from the record , it will call back to write some Simulated Record + // case 1. some mmap will be create when it read mmaps for each new process (from record sample) + + using RecordCallBack = std::function)>; + void SetRecordMode(RecordCallBack recordCallBack); + + // this both used in report and record follow + // it process the record, and rebuild the trhread maps + // It internally determines whether to go to the Record process (which will generate virtual + // events) or the Report process by judging whether SetRecordMode has been passed. + void UpdateFromRecord(PerfEventRecord &reocrd); + + // in reocrd mode + // we make a kernel symbols from some proc file + void UpdateKernelSpaceMaps(); + void UpdateKernelModulesSpaceMaps(); + // load vdso + void LoadVdso(); + + void UpdateKernelSymbols(); + void UpdateKernelModulesSymbols(); + + // set symbols path , it will send to every symobile file for search + bool SetSymbolsPaths(const std::vector &symbolsPaths); + + // any mode + static_assert(sizeof(pid_t) == sizeof(int)); + + const std::vector> &GetSymbolsFiles() const + { + return symbolsFiles_; + } + + void SetCallStackExpend(size_t mergeLevel = 0) + { + callstackMergeLevel_ = mergeLevel; + } + + void SetDisableUnwind(bool disableUnwind) + { + HLOGV("disableUnwind change to %d", disableUnwind); + disableUnwind_ = disableUnwind; + } + + const Symbol GetSymbol(uint64_t ip, pid_t pid, pid_t tid, + const perf_callchain_context &context = PERF_CONTEXT_MAX); + + VirtualThread &GetThread(pid_t pid, pid_t tid); + const std::map &GetThreads() const + { + return userSpaceThreadMap_; + } + void SymbolicRecord(PerfRecordSample &recordSample); + + // report use + void UpdateFromPerfData(const std::vector &); + void UnwindFromRecord(PerfRecordSample &recordSample); + + // debug time +#ifdef HIPERF_DEBUG_TIME + std::chrono::microseconds updateSymbolsTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds unwindFromRecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds unwindCallStackTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds symbolicRecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds updateThreadTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds prcessSampleRecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds prcessMmapRecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds prcessMmap2RecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds prcessCommRecordTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds threadParseMapsTimes_ = std::chrono::microseconds::zero(); + std::chrono::microseconds threadCreateMmapTimes_ = std::chrono::microseconds::zero(); +#endif + const bool loadSymboleWhenNeeded_ = true; // this is a feature config + +private: + bool disableUnwind_ = true; + size_t callstackMergeLevel_ = 1; + CallStack callstack_; + // pid map with user space thread + std::map userSpaceThreadMap_; + // not pid , just memmap + std::vector kernelSpaceMemMaps_; + RecordCallBack recordCallBack_; + std::vector> symbolsFiles_; + enum SymbolCacheLimit : std::size_t { + KERNEL_SYMBOL_CACHE_LIMIT = 4000, + THREAD_SYMBOL_CACHE_LIMIT = 2000, + }; + std::unordered_map> threadSymbolCache_; + HashList kernelSymbolCache_ {KERNEL_SYMBOL_CACHE_LIMIT}; + bool GetSymbolCache(uint64_t ip, pid_t pid, pid_t tid, Symbol &symbol, + const perf_callchain_context &context); + // find synbols function name + void MakeCallFrame(Symbol &symbol, CallFrame &callFrame); + // records + void UpdateSymbols(std::string filename); + void UpdateFromRecord(PerfRecordSample &recordSample); + void UpdateFromRecord(PerfRecordMmap &recordMmap); + void UpdateFromRecord(PerfRecordMmap2 &recordMmap2); + void UpdateFromRecord(PerfRecordComm &recordComm); + + // threads + VirtualThread &UpdateThread(pid_t pid, pid_t tid, const std::string name = ""); + std::string ReadThreadName(pid_t tid); + VirtualThread &CreateThread(pid_t pid, pid_t tid); + + // maps + void UpdateThreadMaps(pid_t pid, pid_t tid, const std::string filename, uint64_t begin, + uint64_t len, uint64_t offset); + void UpdatekernelMap(uint64_t begin, uint64_t end, uint64_t offset, std::string filename); + + const Symbol GetKernelSymbol(uint64_t ip, const std::vector &memMaps, + const VirtualThread &thread); + const Symbol GetUserSymbol(uint64_t ip, const VirtualThread &thread); +#ifdef HIPERF_DEBUG + std::unordered_set missedRuntimeVaddr_; +#endif + void SymbolicCallFrame(PerfRecordSample& recordSample, uint64_t ip, perf_callchain_context context); + std::vector symbolsPaths_; + friend class VirtualRuntimeTest; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_VIRTUAL_RUNTIME_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_thread.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_thread.h new file mode 100644 index 0000000..5c2c85f --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/include/virtual_thread.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * 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 HIPERF_VIRTUAL_THREAD_H +#define HIPERF_VIRTUAL_THREAD_H + +#include +#include + +#include "debug_logger.h" +#include "mem_map_item.h" +#include "perf_event_record.h" +#include "symbols_file.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +/* +03284000-03289000 r--p 00000000 b3:05 289 /system/bin/sh +032b7000-032b9000 rw-p 00000000 00:00 0 +aff60000-aff96000 r--p 00000000 b3:05 923 /system/lib/libc++.so +affeb000-affed000 rw-p 00000000 00:00 0 +b0023000-b0024000 r--p 00000000 b3:05 959 /system/lib/libdl.so +*/ +const std::string MMAP_NAME_HEAP = "[heap]"; +const std::string MMAP_NAME_ANON = "[anon]"; + +class VirtualThread { +public: + VirtualThread(const VirtualThread &) = delete; + VirtualThread &operator=(const VirtualThread &) = delete; + + VirtualThread(pid_t pid, const std::vector> &symbolsFiles) + : pid_(pid), + tid_(pid), + symbolsFiles_(symbolsFiles), + processMemMaps_(), + memMaps_(processMemMaps_), + parent_(*this) {} + + VirtualThread(pid_t pid, pid_t tid, VirtualThread &thread, + const std::vector> &symbolsFiles) + : pid_(pid), + tid_(tid), + symbolsFiles_(symbolsFiles), + processMemMaps_(), + memMaps_(thread.processMemMaps_), + parent_(thread) + { + HLOG_ASSERT(pid != tid); + HLOGV("%d %d map from parent size is %zu", pid, tid, memMaps_.size()); + }; + + pid_t pid_; + pid_t tid_; + std::string name_; + + const std::vector &GetMaps() const + { + return memMaps_; + } + + void ParseMap(); + void CreateMapItem(const std::string filename, uint64_t begin, uint64_t len, uint64_t offset); + const MemMapItem *FindMapByAddr(uint64_t addr) const; + const MemMapItem *FindMapByAddr2(uint64_t addr) const; + const MemMapItem *FindMapByFileInfo(const std::string name, uint64_t offset) const; + SymbolsFile *FindSymbolsFileByMap(const MemMapItem &inMap) const; + bool ReadRoMemory(uint64_t vaddr, uint8_t *data, size_t size) const; +// #ifdef HIPERF_DEBUG + void ReportVaddrMapMiss(uint64_t vaddr) const; +// #endif + // caller want to check if new mmap is legal + static bool IsLegalFileName(const std::string &filename); + +private: + void SortMemMaps(); +#ifdef DEBUG_TIME + bool IsSorted() const; +#endif + const std::vector> &symbolsFiles_; + + // proc/xx/map + // use to put the parent thread's map + // only process have memmap + std::vector processMemMaps_; + // thread must use ref from process + std::vector &memMaps_; + VirtualThread &parent_; +#ifdef HIPERF_DEBUG + mutable std::unordered_set missedRuntimeVaddr_; +#endif +#ifdef DEBUG_MISS_SYMBOL + mutable std::vector missedSymbolFile_; +#endif +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_VIRTUAL_THREAD_H diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/file_ex.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/file_ex.h new file mode 100644 index 0000000..65ae00a --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/file_ex.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 UTILS_BASE_FILE_EX_H +#define UTILS_BASE_FILE_EX_H + +#include +#include + +namespace OHOS { +bool LoadStringFromFile(const std::string& filePath, std::string& content); +bool SaveStringToFile(const std::string& filePath, const std::string& content, bool truncated = true); +bool LoadStringFromFd(int fd, std::string& content); +bool SaveStringToFd(int fd, const std::string& content); +bool LoadBufferFromFile(const std::string& filePath, std::vector& content); +bool SaveBufferToFile(const std::string& filePath, const std::vector& content, bool truncated = true); +bool FileExists(const std::string& fileName); +bool StringExistsInFile(const std::string& fileName, const std::string& subStr, bool caseSensitive = true); +int CountStrInFile(const std::string& fileName, const std::string& subStr, bool caseSensitive = true); +} + +#endif diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securec.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securec.h new file mode 100644 index 0000000..8d83e44 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securec.h @@ -0,0 +1,564 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 __SECUREC_H__5D13A042_DC3F_4ED9_A8D1_882811274C27 +#define __SECUREC_H__5D13A042_DC3F_4ED9_A8D1_882811274C27 + +/* Compile in kernel under macro control */ +#ifndef SECUREC_IN_KERNEL +#ifdef __KERNEL__ +#define SECUREC_IN_KERNEL 1 +#else +#define SECUREC_IN_KERNEL 0 +#endif +#endif + +/* If you need high performance, enable the SECUREC_WITH_PERFORMANCE_ADDONS macro, default is enable . + * The macro is automatically closed on the windows platform in securectyp.h. + */ +#ifndef SECUREC_WITH_PERFORMANCE_ADDONS +#if SECUREC_IN_KERNEL +#define SECUREC_WITH_PERFORMANCE_ADDONS 0 +#else +#define SECUREC_WITH_PERFORMANCE_ADDONS 1 +#endif +#endif + +#include +#include "securectype.h" + +#ifndef SECUREC_HAVE_ERRNO_H +#if SECUREC_IN_KERNEL +#define SECUREC_HAVE_ERRNO_H 0 +#else +#define SECUREC_HAVE_ERRNO_H 1 +#endif +#endif + +/* EINVAL ERANGE may defined in errno.h */ +#if SECUREC_HAVE_ERRNO_H +#include +#endif + +/* If stack size on some embedded platform is limited, you can define the following macro + * which will put some variables on heap instead of stack. + * SECUREC_STACK_SIZE_LESS_THAN_1K + */ + +/* define error code */ +#if !defined(__STDC_WANT_LIB_EXT1__) || (defined(__STDC_WANT_LIB_EXT1__) && (__STDC_WANT_LIB_EXT1__ == 0)) +#ifndef SECUREC_DEFINED_ERRNO_TYPE +#define SECUREC_DEFINED_ERRNO_TYPE +/* just check whether macrodefinition exists. */ +#ifndef errno_t +typedef int errno_t; +#endif +#endif +#endif + +/* success */ +#ifndef EOK +#define EOK (0) +#endif + +#ifndef EINVAL +/* The src buffer is not correct and destination buffer can't not be reset */ +#define EINVAL (22) +#endif + +#ifndef EINVAL_AND_RESET +/* Once the error is detected, the dest buffer must be rest! */ +#define EINVAL_AND_RESET (22 | 128) +#endif + +#ifndef ERANGE +/* The destination buffer is not long enough and destination buffer can not be reset */ +#define ERANGE (34) +#endif + +#ifndef ERANGE_AND_RESET +/* Once the error is detected, the dest buffer must be rest! */ +#define ERANGE_AND_RESET (34 | 128) +#endif + +#ifndef EOVERLAP_AND_RESET +/* Once the buffer overlap is detected, the dest buffer must be rest! */ +#define EOVERLAP_AND_RESET (54 | 128) +#endif + +/* if you need export the function of this library in Win32 dll, use __declspec(dllexport) */ +#ifdef SECUREC_IS_DLL_LIBRARY +#ifdef SECUREC_DLL_EXPORT +#define SECUREC_API __declspec(dllexport) +#else +#define SECUREC_API __declspec(dllimport) +#endif +#else +/* Standardized function declaration . If a security function is declared in the your code, + * it may cause a compilation alarm,Please delete the security function you declared + */ +#define SECUREC_API extern +#endif + +#ifndef SECUREC_SNPRINTF_TRUNCATED +#define SECUREC_SNPRINTF_TRUNCATED 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @Description:The memset_s function copies the value of c (converted to an unsigned char) into each of the first count + * characters of the object pointed to by dest. + * @param dest - destination address + * @param destMax -The maximum length of destination buffer + * @param c - the value to be copied + * @param count -copies first count characters of dest + * @return EOK if there was no runtime-constraint violation + */ + +/* The memset_s security function is not provided in Windows system, but other security functions are provided. In this + * case, can only use the memset_s function */ +#ifndef SECUREC_ONLY_DECLARE_MEMSET + +/** + * @Description:The wmemcpy_s function copies n successive wide characters from the object pointed to by src into the + * object pointed to by dest. + * @param dest - destination address + * @param destMax -The maximum length of destination buffer + * @param src -source address + * @param count -copies count wide characters from the src + * @return EOK if there was no runtime-constraint violation + */ +#if SECUREC_IN_KERNEL == 0 + SECUREC_API errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); +#endif + /** + * @Description:The memmove_s function copies n characters from the object pointed to by src into the object pointed + * to by dest. + * @param dest - destination address + * @param destMax -The maximum length of destination buffer + * @param src -source address + * @param count -copies count wide characters from the src + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count); +#if SECUREC_IN_KERNEL == 0 + /** + * @Description:The wmemmove_s function copies n successive wide characters from the object pointed to by src into + * the object pointed to by dest. + * @param dest - destination address + * @param destMax -The maximum length of destination buffer + * @param src -source address + * @param count -copies count wide characters from the src + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); + + /** + * @Description:The wcscpy_s function copies the wide string pointed to by strSrc (including theterminating null + * wide character) into the array pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer + * @param strSrc -source address + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); + + /** + * @Description:The wcsncpy_s function copies not more than n successive wide characters (not including the + * terminating null wide character) from the array pointed to by strSrc to the array pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating wide character) + * @param strSrc -source address + * @param count -copies count wide characters from the src + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); + + /** + * @Description:The wcscat_s function appends a copy of the wide string pointed to by strSrc (including the + * terminating null wide character) to the end of the wide string pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating wide character) + * @param strSrc -source address + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); + + /** + * @Description:The wcsncat_s function appends not more than n successive wide characters (not including the + * terminating null wide character) from the array pointed to by strSrc to the end of the wide string pointed to by + * strDest. + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating wide character) + * @param strSrc -source address + * @param count -copies count wide characters from the src + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); + + /** + * @Description: The strtok_s function parses a string into a sequence of tokens,On the first call to strtok_s the + * string to be parsed should be specified in strToken. In each subsequent call that should parse the same string, + * strToken should be NULL + * @param strToken - the string to be delimited + * @param strDelimit -specifies a set of characters that delimit the tokens in the parsed string + * @param context -is a pointer to a char * variable that is used internally by strtok_s function + * @return:returns a pointer to the first character of a token, or a null pointer if there is no token or there is a + * runtime-constraint violation. + */ + SECUREC_API char *strtok_s(char *strToken, const char *strDelimit, char **context); + + /** + * @Description: The wcstok_s function is the wide-character equivalent of the strtok_s function + * @param strToken - the string to be delimited + * @param strDelimit -specifies a set of characters that delimit the tokens in the parsed string + * @param context -is a pointer to a char * variable that is used internally by strtok_s function + * @return:returns a pointer to the first character of a token, or a null pointer if there is no token or there is a + * runtime-constraint violation. + */ + SECUREC_API wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context); + + /** + * @Description: The sprintf_s function is equivalent to the sprintf function except for the parameter destMax and + * the explicit runtime-constraints violation + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null byte ('\0')) + * @param format - format string + * @return:success the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1. + */ + + /** + * @Description: The swprintf_s function is the wide-character equivalent of the sprintf_s function + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null ) + * @param format - format string + * @return:success the number of characters printed(not including the terminating null wide characte), If an error + * occurred return -1. + */ + SECUREC_API int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...); + + /** + * @Description: The vsprintf_s function is equivalent to the vsprintf function except for the parameter destMax and + * the explicit runtime-constraints violation + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null wide characte) + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:return the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1. + */ + SECUREC_API int vsprintf_s(char* strDest, size_t destMax, const char* format, va_list arglist) + SECUREC_ATTRIBUTE(3, 0); + + /** + * @Description: The vswprintf_s function is the wide-character equivalent of the vsprintf_s function + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null ) + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:return the number of characters printed(not including the terminating null wide characte), If an error + * occurred return -1. + */ + SECUREC_API int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list arglist); + + /** + * @Description: The vsnprintf_s function is equivalent to the vsnprintf function except for the parameter + * destMax/count and the explicit runtime-constraints violation + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null byte ('\0')) + * @param count - do not write more than count bytes to strDest(not including the terminating null byte ('\0')) + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:return the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1.Pay special attention to returning -1 when truncation occurs + */ + SECUREC_API int vsnprintf_s(char* strDest, size_t destMax, size_t count, const char* format, va_list arglist) + SECUREC_ATTRIBUTE(4, 0); + + /** + * @Description: The snprintf_s function is equivalent to the snprintf function except for the parameter + * destMax/count and the explicit runtime-constraints violation + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null byte ('\0')) + * @param count - do not write more than count bytes to strDest(not including the terminating null byte ('\0')) + * @param format - format string + * @return:return the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1.Pay special attention to returning -1 when truncation occurs + */ + +#if SECUREC_SNPRINTF_TRUNCATED + /** + * @Description: The vsnprintf_truncated_s function is equivalent to the vsnprintf_s function except no count + * parameter and return value + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null byte ('\0')) + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:return the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1.Pay special attention to returning destMax - 1 when truncation occurs + */ + SECUREC_API int vsnprintf_truncated_s(char* strDest, size_t destMax, const char* format, va_list arglist) + SECUREC_ATTRIBUTE(3, 0); + + /** + * @Description: The snprintf_truncated_s function is equivalent to the snprintf_2 function except no count + * parameter and return value + * @param strDest - produce output according to a format ,write to the character string strDest + * @param destMax - The maximum length of destination buffer(including the terminating null byte ('\0')) + * @param format - format string + * @return:return the number of characters printed(not including the terminating null byte ('\0')), If an error + * occurred return -1.Pay special attention to returning destMax - 1 when truncation occurs + */ + SECUREC_API int snprintf_truncated_s(char* strDest, size_t destMax, const char* format, ...) + SECUREC_ATTRIBUTE(3, 4); +#endif + /** + * @Description: The scanf_s function is equivalent to fscanf_s with the argument stdin interposed before the + * arguments to scanf_s + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int scanf_s(const char *format, ...); + + /** + * @Description: The wscanf_s function is the wide-character equivalent of the scanf_s function + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int wscanf_s(const wchar_t *format, ...); + + /** + * @Description: The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by arglist + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vscanf_s(const char *format, va_list arglist); + + /** + * @Description: The vwscanf_s function is the wide-character equivalent of the vscanf_s function + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vwscanf_s(const wchar_t *format, va_list arglist); + + /** + * @Description: The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion specifiers + * apply to a pair of arguments (unless assignment suppression is indicated by a*) + * @param stream - stdio file stream + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int fscanf_s(FILE *stream, const char *format, ...); + + /** + * @Description: The fwscanf_s function is the wide-character equivalent of the fscanf_s function + * @param stream - stdio file stream + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int fwscanf_s(FILE *stream, const wchar_t *format, ...); + + /** + * @Description: The vfscanf_s function is equivalent to fscanf_s, with the variable argument list replaced by + * arglist + * @param stream - stdio file stream + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vfscanf_s(FILE *stream, const char *format, va_list arglist); + + /** + * @Description: The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function + * @param stream - stdio file stream + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vfwscanf_s(FILE *stream, const wchar_t *format, va_list arglist); + + /** + * @Description: The sscanf_s function is equivalent to fscanf_s, except that input is obtained from a string + * (specified by the argument buffer) rather than from a stream + * @param buffer - read character from buffer + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + + /** + * @Description: The swscanf_s function is the wide-character equivalent of the sscanf_s function + * @param buffer - read character from buffer + * @param format - format string + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...); + + /** + * @Description: The vsscanf_s function is equivalent to sscanf_s, with the variable argument list replaced by + * arglist + * @param buffer - read character from buffer + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vsscanf_s(const char *buffer, const char *format, va_list arglist); + + /** + * @Description: The vswscanf_s function is the wide-character equivalent of the vsscanf_s function + * @param buffer - read character from buffer + * @param format - format string + * @param arglist - instead of a variable number of arguments + * @return:returns the number of input items assigned, If an error occurred return -1. + */ + SECUREC_API int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list arglist); + + /** + * @Description:The gets_s function reads at most one less than the number of characters specified by destMax from + * the stream pointed to by stdin, into the array pointed to by buffer + * @param buffer - destination address + * @param destMax -The maximum length of destination buffer(including the terminating null character) + * @return buffer if there was no runtime-constraint violation,If an error occurred return NULL. + */ + SECUREC_API char *gets_s(char *buffer, size_t destMax); +#endif + + /** + * @Description:The memcpy_s function copies n characters from the object pointed to by src into the object pointed + * to by dest. + * @param dest - destination address + * @param destMax -The maximum length of destination buffer + * @param src -source address + * @param count -copies count characters from the src + * @return EOK if there was no runtime-constraint violation + */ + + /** + * @Description:The strcpy_s function copies the string pointed to by strSrc (including the terminating null + * character) into the array pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating null character) + * @param strSrc -source address + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc); + + /** + * @Description:The strncpy_s function copies not more than n successive characters (not including the terminating + * null character) from the array pointed to by strSrc to the array pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating null character) + * @param strSrc -source address + * @param count -copies count characters from the src + * @return EOK if there was no runtime-constraint violation + */ + + /** + * @Description:The strcat_s function appends a copy of the string pointed to by strSrc (including the terminating + * null character) to the end of the string pointed to by strDest + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating null wide character) + * @param strSrc -source address + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc); + + /** + * @Description:The strncat_s function appends not more than n successive characters (not including the terminating + * null character) from the array pointed to by strSrc to the end of the string pointed to by strDest. + * @param strDest - destination address + * @param destMax -The maximum length of destination buffer(including the terminating null character) + * @param strSrc -source address + * @param count -copies count characters from the src + * @return EOK if there was no runtime-constraint violation + */ + SECUREC_API errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count); +#if SECUREC_IN_KERNEL == 0 + /* those functions are used by macro ,must declare hare , also for without function declaration warning */ + extern errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count); + extern errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc); +#endif +#endif + +#if SECUREC_WITH_PERFORMANCE_ADDONS + /* those functions are used by macro */ + extern errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count); + extern errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count); + extern errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count); + extern errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count); + +/* strcpy_sp is a macro, NOT a function in performance optimization mode. */ +#define strcpy_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRCPY_SM((dest), (destMax), (src)) : \ + strcpy_s((dest), (destMax), (src))) + +/* strncpy_sp is a macro, NOT a function in performance optimization mode. */ +#define strncpy_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \ + __builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRNCPY_SM((dest), (destMax), (src), (count)) : \ + strncpy_s((dest), (destMax), (src), (count))) + +/* strcat_sp is a macro, NOT a function in performance optimization mode. */ +#define strcat_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRCAT_SM((dest), (destMax), (src)) : \ + strcat_s((dest), (destMax), (src))) + + /* strncat_sp is a macro, NOT a function in performance optimization mode. */ +#define strncat_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \ + __builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRNCAT_SM((dest), (destMax), (src), (count)) : \ + strncat_s((dest), (destMax), (src), (count))) + +/* memcpy_sp is a macro, NOT a function in performance optimization mode. */ +#define memcpy_sp(dest, destMax, src, count) (__builtin_constant_p((count)) ? \ + (SECUREC_MEMCPY_SM((dest), (destMax), (src), (count))) : \ + (__builtin_constant_p((destMax)) ? \ + (((size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & \ + (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \ + memcpy_sOptTc((dest), (destMax), (src), (count)) : ERANGE ) : \ + memcpy_sOptAsm((dest), (destMax), (src), (count)))) + +/* memset_sp is a macro, NOT a function in performance optimization mode. */ +#define memset_sp(dest, destMax, c, count) (__builtin_constant_p((count)) ? \ + (SECUREC_MEMSET_SM((dest), (destMax), (c), (count))) : \ + (__builtin_constant_p((destMax)) ? \ + (((size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & \ + (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \ + memset_sOptTc((dest), (destMax), (c), (count)) : ERANGE ) : \ + memset_sOptAsm((dest), (destMax), (c), (count)))) +#else +#define strcpy_sp strcpy_s +#define strncpy_sp strncpy_s +#define strcat_sp strcat_s +#define strncat_sp strncat_s +#define memcpy_sp memcpy_s +#define memset_sp memset_s +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __SECUREC_H__5D13A042_DC3F_4ED9_A8D1_882811274C27 */ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securectype.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securectype.h new file mode 100644 index 0000000..df57d99 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/securectype.h @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ +/* [Standardize-exceptions]: Performance-sensitive + * [reason]: Strict parameter verification has been done before use + */ + +#ifndef __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 +#define __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 + +#ifndef SECUREC_ONLY_DECLARE_MEMSET +/* Shielding VC symbol redefinition warning */ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#ifdef __STDC_WANT_SECURE_LIB__ +#undef __STDC_WANT_SECURE_LIB__ +#endif +#define __STDC_WANT_SECURE_LIB__ 0 +#ifdef _CRTIMP_ALTERNATIVE +#undef _CRTIMP_ALTERNATIVE +#endif +#define _CRTIMP_ALTERNATIVE // comment microsoft *_s function +#endif +#endif + +#if SECUREC_IN_KERNEL +#include +#include +#else +#include +#include +#include +#endif + +/* if enable SECUREC_COMPATIBLE_WIN_FORMAT, the output format will be compatible to Windows. */ +#if (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) +#define SECUREC_COMPATIBLE_WIN_FORMAT +#endif + +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) +/* in windows platform, can't use optimized function for there is no __builtin_constant_p like function */ +/* If need optimized macro, can define this: define __builtin_constant_p(x) 0 */ +#ifdef SECUREC_WITH_PERFORMANCE_ADDONS +#undef SECUREC_WITH_PERFORMANCE_ADDONS +#define SECUREC_WITH_PERFORMANCE_ADDONS 0 +#endif +#endif + +#if defined(__VXWORKS__) || defined(__vxworks) || defined(__VXWORKS) || defined(_VXWORKS_PLATFORM_) || \ + defined(SECUREC_VXWORKS_VERSION_5_4) +#if !defined(SECUREC_VXWORKS_PLATFORM) +#define SECUREC_VXWORKS_PLATFORM +#endif +#endif + +/* if enable SECUREC_COMPATIBLE_LINUX_FORMAT, the output format will be compatible to Linux. */ +#if !(defined(SECUREC_COMPATIBLE_WIN_FORMAT) || defined(SECUREC_VXWORKS_PLATFORM)) +#define SECUREC_COMPATIBLE_LINUX_FORMAT +#endif +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT +#include +#endif + +/* add the -DSECUREC_SUPPORT_FORMAT_WARNING compiler option to supoort -Wformat. + * default does not check the format is that the same data type in the actual code + * in the product is different in the original data type definition of VxWorks and Linux. + */ +#ifndef SECUREC_SUPPORT_FORMAT_WARNING +#define SECUREC_SUPPORT_FORMAT_WARNING 0 +#endif + +/* SECUREC_PCLINT for tool do not recognize __attribute__ just for pclint */ +#if SECUREC_SUPPORT_FORMAT_WARNING && !defined(SECUREC_PCLINT) +#define SECUREC_ATTRIBUTE(x, y) __attribute__((format(printf, (x), (y)))) +#else +#define SECUREC_ATTRIBUTE(x, y) +#endif + +/* SECUREC_PCLINT for tool do not recognize __builtin_expect ,just for pclint */ +#if defined(__GNUC__) && \ + ((__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3))) && /* above 3.4 */ \ + !defined(SECUREC_PCLINT) +/* This is a built-in function that can be used without a declaration, if you encounter an undeclared compilation alarm, + * you can add -DSECUREC_NEED_BUILTIN_EXPECT_DECLARE to compiler options + */ +#if defined(SECUREC_NEED_BUILTIN_EXPECT_DECLARE) +long __builtin_expect(long exp, long c); +#endif +#define SECUREC_LIKELY(x) __builtin_expect(!!(x), 1) +#define SECUREC_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define SECUREC_LIKELY(x) (x) +#define SECUREC_UNLIKELY(x) (x) +#endif + +/* define the max length of the string */ +#define SECUREC_STRING_MAX_LEN (0x7fffffffUL) +#define SECUREC_WCHAR_STRING_MAX_LEN (SECUREC_STRING_MAX_LEN / sizeof(wchar_t)) + +/* add SECUREC_MEM_MAX_LEN for memcpy and memmove */ +#define SECUREC_MEM_MAX_LEN (0x7fffffffUL) +#define SECUREC_WCHAR_MEM_MAX_LEN (SECUREC_MEM_MAX_LEN / sizeof(wchar_t)) + +#if SECUREC_STRING_MAX_LEN > 0x7fffffff +#error "max string is 2G" +#endif + +#if (defined(__GNUC__ ) && defined(__SIZEOF_POINTER__ )) +#if (__SIZEOF_POINTER__ != 4) && (__SIZEOF_POINTER__ != 8) +#error "unsupported system" +#endif +#endif + +#ifndef SECUREC_MALLOC +#define SECUREC_MALLOC(x) malloc((size_t)(x)) +#endif + +#ifndef SECUREC_FREE +#define SECUREC_FREE(x) free((void *)(x)) +#endif + +#if defined(_WIN64) || defined(WIN64) || defined(__LP64__) || defined(_LP64) +#define SECUREC_ON_64BITS +#endif + +#if (!defined(SECUREC_ON_64BITS) && defined(__GNUC__ ) && defined(__SIZEOF_POINTER__ )) +#if __SIZEOF_POINTER__ == 8 +#define SECUREC_ON_64BITS +#endif +#endif + +#if defined(__SVR4) || defined(__svr4__) +#define SECUREC_ON_SOLARIS +#endif + +#if (defined(__hpux) || defined(_AIX) || defined(SECUREC_ON_SOLARIS)) +#define SECUREC_ON_UNIX +#endif + +/* codes should run under the macro SECUREC_COMPATIBLE_LINUX_FORMAT in unknown system on default, + * and strtold. The function + * strtold is referenced first at ISO9899:1999(C99), and some old compilers can + * not support these functions. Here provides a macro to open these functions: + * SECUREC_SUPPORT_STRTOLD -- if defined, strtold will be used + */ +#ifndef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 0 +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT)) +#if defined(__USE_ISOC99) || \ + (defined(_AIX) && defined(_ISOC99_SOURCE)) || \ + (defined(__hpux) && defined(__ia64)) || \ + (defined(SECUREC_ON_SOLARIS) && (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ + defined(_STDC_C99) || defined(__EXTENSIONS__)) +#undef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 1 +#endif +#endif +#if ((defined(SECUREC_WRLINUX_BELOW4) || defined(_WRLINUX_BELOW4_))) +#undef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 0 +#endif +#endif + +#if SECUREC_WITH_PERFORMANCE_ADDONS + +#ifndef SECUREC_TWO_MIN +#define SECUREC_TWO_MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +/* for strncpy_s performance optimization */ +#define SECUREC_STRNCPY_SM(dest, destMax, src, count) \ + (((void*)dest != NULL && (void*)src != NULL && (size_t)destMax > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (SECUREC_TWO_MIN(count, strlen(src)) + 1) <= (size_t)destMax) \ + ? ((count < strlen(src)) ? (memcpy(dest, src, count), *((char*)dest + count) = '\0', EOK) \ + : (memcpy(dest, src, strlen(src) + 1), EOK)) \ + : (strncpy_error(dest, destMax, src, count))) + +#define SECUREC_STRCPY_SM(dest, destMax, src) \ + (((void*)dest != NULL && (void*)src != NULL && (size_t)destMax > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (strlen(src) + 1) <= (size_t)destMax) \ + ? (memcpy(dest, src, strlen(src) + 1), EOK) \ + : (strcpy_error(dest, destMax, src))) + +/* for strcat_s performance optimization */ +#if defined(__GNUC__) +#define SECUREC_STRCAT_SM(dest, destMax, src) \ + ({ \ + int catRet = EOK; \ + if ((void*)dest != NULL && (void*)src != NULL && (size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ + char* catTmpDst = (dest); \ + size_t catRestSize = (destMax); \ + while (catRestSize > 0 && *catTmpDst) { \ + ++catTmpDst; \ + --catRestSize; \ + } \ + if (catRestSize == 0) { \ + catRet = EINVAL; \ + } else if ((strlen(src) + 1) <= catRestSize) { \ + memcpy(catTmpDst, (src), strlen(src) + 1); \ + catRet = EOK; \ + } else { \ + catRet = ERANGE; \ + } \ + if (catRet != EOK) { \ + catRet = strcat_s((dest), (destMax), (src)); \ + } \ + } else { \ + catRet = strcat_s((dest), (destMax), (src)); \ + } \ + catRet; \ + }) +#else +#define SECUREC_STRCAT_SM(dest, destMax, src) strcat_s(dest, destMax, src) +#endif + +/* for strncat_s performance optimization */ +#if defined(__GNUC__) +#define SECUREC_STRNCAT_SM(dest, destMax, src, count) \ + ({ \ + int ncatRet = EOK; \ + if ((void*)dest != NULL && (void*)src != NULL && (size_t)destMax > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (((unsigned long long)(count) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ + char* ncatTmpDest = (dest); \ + size_t ncatRestSize = (destMax); \ + while (ncatRestSize > 0 && *ncatTmpDest) { \ + ++ncatTmpDest; \ + --ncatRestSize; \ + } \ + if (ncatRestSize == 0) { \ + ncatRet = EINVAL; \ + } else if ((SECUREC_TWO_MIN((count), strlen(src)) + 1) <= ncatRestSize) { \ + if ((count) < strlen(src)) { \ + memcpy(ncatTmpDest, (src), (count)); \ + *(ncatTmpDest + (count)) = '\0'; \ + } else { \ + memcpy(ncatTmpDest, (src), strlen(src) + 1); \ + } \ + } else { \ + ncatRet = ERANGE; \ + } \ + if (ncatRet != EOK) { \ + ncatRet = strncat_s((dest), (destMax), (src), (count)); \ + } \ + } else { \ + ncatRet = strncat_s((dest), (destMax), (src), (count)); \ + } \ + ncatRet; \ + }) +#else +#define SECUREC_STRNCAT_SM(dest, destMax, src, count) strncat_s(dest, destMax, src, count) +#endif + +/* SECUREC_MEMCPY_SM do NOT check buffer overlap by default */ +#define SECUREC_MEMCPY_SM(dest, destMax, src, count) \ + (!(((size_t)destMax == 0) || (((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ + ((size_t)count > (size_t)destMax) || ((void*)dest) == NULL || ((void*)src == NULL)) \ + ? (memcpy(dest, src, count), EOK) \ + : (memcpy_s(dest, destMax, src, count))) + +#define SECUREC_MEMSET_SM(dest, destMax, c, count) \ + (!(((size_t)destMax == 0) || (((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ + ((void*)dest == NULL) || ((size_t)count > (size_t)destMax)) \ + ? (memset(dest, c, count), EOK) \ + : (memset_s(dest, destMax, c, count))) + +#endif +#endif /* __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 */ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/unique_fd.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/unique_fd.h new file mode 100644 index 0000000..f48a68d --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/linux/unique_fd.h @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 UNIQUE_FD_H +#define UNIQUE_FD_H + +#include + +namespace OHOS { +class DefaultDeleter { +public: + static void Close(int fd) + { + if (fd >= 0) { + close(fd); + } + } +}; + +template +class UniqueFdAddDeletor; +template +bool operator==(const int& lhs, const UniqueFdAddDeletor& rhs); +template +bool operator!=(const int& lhs, const UniqueFdAddDeletor& rhs); +template +bool operator>=(const int& lhs, const UniqueFdAddDeletor& rhs); +template +bool operator>(const int& lhs, const UniqueFdAddDeletor& rhs); +template +bool operator<=(const int& lhs, const UniqueFdAddDeletor& rhs); +template +bool operator<(const int& lhs, const UniqueFdAddDeletor& rhs); + +template +class UniqueFdAddDeletor final { + friend bool operator==(const int& lhs, const UniqueFdAddDeletor& rhs); + + friend bool operator!=(const int& lhs, const UniqueFdAddDeletor& rhs); + + friend bool operator>=(const int& lhs, const UniqueFdAddDeletor& rhs); + + friend bool operator>(const int& lhs, const UniqueFdAddDeletor& rhs); + + friend bool operator<=(const int& lhs, const UniqueFdAddDeletor& rhs); + + friend bool operator< (const int& lhs, const UniqueFdAddDeletor& rhs); + +public: + explicit UniqueFdAddDeletor(const int& value) + : fd_(value) + { + } + UniqueFdAddDeletor() + : fd_(-1) + { + } + ~UniqueFdAddDeletor() + { + Reset(-1); + } + + // get fd out + int Release() + { + int tmp = fd_; + fd_ = -1; + return tmp; + } + + // this is dangerous, when you use it , you should know it, donot operator on the ret + operator int() const + { + return Get(); + } // NOLINT + // this is dangerous, when you use it , you should know it, donot operator on the ret + int Get() const + { + return fd_; + } + + // we need move fd from one to another + UniqueFdAddDeletor(UniqueFdAddDeletor&& rhs) + { + int rhsfd = rhs.Release(); + fd_ = rhsfd; + } + + UniqueFdAddDeletor& operator=(UniqueFdAddDeletor&& rhs) + { + int rhsfd = rhs.Release(); + Reset(rhsfd); + return *this; + } + + bool operator==(const int& rhs) const + { + return fd_ == rhs; + } + + bool operator!=(const int& rhs) const + { + return !(fd_ == rhs); + } + bool operator>=(const int& rhs) const + { + return fd_ >= rhs; + } + + bool operator>(const int& rhs) const + { + return fd_ > rhs; + } + + bool operator<=(const int& rhs) const + { + return fd_ <= rhs; + } + + bool operator<(const int& rhs) const + { + return fd_ < rhs; + } + +private: + int fd_ = -1; + + void Reset(int newValue) + { + if (fd_ >= 0) { + Deleter::Close(fd_); + } + fd_ = newValue; + } + + // disallow copy ctor and copy assign + UniqueFdAddDeletor(const UniqueFdAddDeletor& rhs) = delete; + UniqueFdAddDeletor& operator=(const UniqueFdAddDeletor& rhs) = delete; +}; + +template +bool operator==(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return lhs == uniqueFd.fd_; +} + +template +bool operator!=(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return !(lhs == uniqueFd.fd_); +} + +template +bool operator>=(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return lhs >= uniqueFd.fd_; +} + +template +bool operator>(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return lhs > uniqueFd.fd_; +} + +template +bool operator<=(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return lhs <= uniqueFd.fd_; +} + +template +bool operator<(const int& lhs, const UniqueFdAddDeletor& uniqueFd) +{ + return lhs < uniqueFd.fd_; +} + +using UniqueFd = UniqueFdAddDeletor; +} // namespace OHOS +#endif diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/option.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/option.cpp new file mode 100644 index 0000000..1be4075 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/option.cpp @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "option.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +namespace Option { +static std::map> g_MainOptions; + +bool CheckOptionFormat(const std::string &optionName) +{ + if (optionName.empty()) { + HLOGE("unable to use empty option name!"); + return false; + } + if (optionName.front() != '-') { + HLOGE("must use '-' at the begin of option name!"); + return false; + } + + return true; +} + +const std::map> &GetMainOptions() +{ + return g_MainOptions; +} + +const MainOption *FindMainOption(std::string argName) +{ + HLOGV("%s", argName.c_str()); + auto found = g_MainOptions.find(argName); + if (found != g_MainOptions.end()) { + // remove the subcmd itself + return found->second.get(); + } else { + return nullptr; + } +} + +std::vector::iterator FindOption(std::vector &args, + const std::string &optionName) +{ + HLOGV("try find '%s' in args: %s", optionName.c_str(), VectorToString(args).c_str()); + auto tmpit = args.begin(); + std::string::size_type position; + for (; tmpit != args.end(); tmpit++) { + position = (*tmpit).find("hiperf"); + if (position != (*tmpit).npos && (*tmpit)[(position + strlen("hiperf"))] == '\0') { + break; + } + } + auto it = find(args.begin(), args.end(), optionName); + if (it != args.end()) { + if (tmpit != args.end() && it > tmpit) { + it = args.end(); + } else { + // we found it , we remove it for next process + HLOGD("have found '%s'", optionName.c_str()); + } + } + return it; +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, bool &value) +{ + value = true; + HLOGD("get bool result:'%s':'%d'", optionName.c_str(), value); + return true; +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, int &value) +{ + try { + value = std::stoi(optionValue); + HLOGD("get int result:'%s':'%d'", optionName.c_str(), value); + return true; + } catch (...) { + // what can we do here ? + } + return false; +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, float &value) +{ + try { + value = std::stof(optionValue); + HLOGD("get float result:'%s':'%f'", optionName.c_str(), value); + return true; + } catch (...) { + // what can we do here ? + } + return false; +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::string &value) +{ + value = optionValue; + return true; // every thing done +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::vector &values) +{ + std::vector stringValues = StringSplit(optionValue, ","); + HLOGD("split int result:'%s':'%s'", optionName.c_str(), VectorToString(stringValues).c_str()); + try { + while (!stringValues.empty()) { + values.push_back(std::stoi(stringValues.front())); + stringValues.erase(stringValues.begin()); // remove for next process + } + return values.size() > 0; // convert successed ? + } catch (...) { + // what can we do here ? + HLOGD("stoi failed with %s", stringValues.front().c_str()); + } + return false; +} + +bool GetValueFromString(const std::string &optionValue, const std::string &optionName, + std::vector &values) +{ + values = StringSplit(optionValue, ","); + HLOGD("split string result:'%s':'%s' from '%s'", optionName.c_str(), + VectorToString(values).c_str(), optionValue.c_str()); + return values.size() > 0; // convert successed ? +} + +bool GetOptionTrackedCommand(std::vector &args, + std::vector &trackedCommand) +{ + if (!args.empty()) { + trackedCommand.insert(trackedCommand.begin(), args.begin(), args.end()); + args.clear(); + } + return true; +} + +void ClearMainOptions() +{ + g_MainOptions.clear(); +} + +bool RegisterMainOption(const std::string &optionName, const std::string &help, + std::function &)> callBackFunction) +{ + HLOGV("%s", optionName.c_str()); + if (!CheckOptionFormat(optionName)) { + return false; + } + + if (g_MainOptions.count(optionName) == 0) { + g_MainOptions[optionName] = std::make_unique(); + g_MainOptions[optionName].get()->help = help; + g_MainOptions[optionName].get()->callBackFunction = std::move(callBackFunction); + return true; + } else { + HLOGE("main args %s already registered!", optionName.c_str()); + return false; + } +} +} // namespace Option +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_event_record.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_event_record.cpp new file mode 100644 index 0000000..60d5ba8 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_event_record.cpp @@ -0,0 +1,892 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "PerfRecord" + +#include "perf_event_record.h" +#include +#include "string_help.h" +#include "utilities.h" + + +using namespace std; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +std::unique_ptr GetPerfEventRecord(const int type, uint8_t *p, + const perf_event_attr &attr) +{ + HLOG_ASSERT(p); + uint8_t *data = p; + + // check kernel + switch (type) { + case PERF_RECORD_SAMPLE: + return std::make_unique(data, attr); + case PERF_RECORD_MMAP: + return std::make_unique(data); + case PERF_RECORD_MMAP2: + return std::make_unique(data); + case PERF_RECORD_LOST: + return std::make_unique(data); + case PERF_RECORD_COMM: + return std::make_unique(data); + case PERF_RECORD_EXIT: + return std::make_unique(data); + case PERF_RECORD_THROTTLE: + return std::make_unique(data); + case PERF_RECORD_UNTHROTTLE: + return std::make_unique(data); + case PERF_RECORD_FORK: + return std::make_unique(data); + case PERF_RECORD_READ: + return std::make_unique(data); + case PERF_RECORD_AUX: + return std::make_unique(data); + case PERF_RECORD_ITRACE_START: + return std::make_unique(data); + case PERF_RECORD_LOST_SAMPLES: + return std::make_unique(data); + case PERF_RECORD_SWITCH: + return std::make_unique(data); + case PERF_RECORD_SWITCH_CPU_WIDE: + return std::make_unique(data); + default: + HLOGE("unknown record type %d\n", type); + return nullptr; + } +} + +template +inline void PushToBinary(bool condition, uint8_t *&p, const T &v) +{ + if (condition) { + *(reinterpret_cast(p)) = v; + p += sizeof(T); + } +} + +template +inline void PushToBinary2(bool condition, uint8_t *&p, const T1 &v1, const T2 &v2) +{ + if (condition) { + *(reinterpret_cast(p)) = v1; + p += sizeof(T1); + *(reinterpret_cast(p)) = v2; + p += sizeof(T2); + } +} + +template +inline void PopFromBinary(bool condition, uint8_t *&p, T &v) +{ + if (condition) { + v = *(reinterpret_cast(p)); + p += sizeof(T); + } +} + +template +inline void PopFromBinary2(bool condition, uint8_t *&p, T1 &v1, T2 &v2) +{ + if (condition) { + v1 = *(reinterpret_cast(p)); + p += sizeof(T1); + v2 = *(reinterpret_cast(p)); + p += sizeof(T2); + } +} + +// PerfEventRecord +PerfEventRecord::PerfEventRecord(perf_event_type type, bool in_kernel, const std::string &name) + : name_(name) +{ + header.type = type; + header.misc = in_kernel ? PERF_RECORD_MISC_KERNEL : PERF_RECORD_MISC_USER; + header.size = sizeof(header); +} + +PerfEventRecord::PerfEventRecord(perf_event_hiperf_ext_type type, const std::string &name) + : name_(name) +{ + header.type = type; + header.misc = PERF_RECORD_MISC_USER; + header.size = sizeof(header); +} + +PerfEventRecord::PerfEventRecord(uint8_t *p, const std::string &name) : name_(name) +{ + header = *(reinterpret_cast(p)); +} + +void PerfEventRecord::GetHeaderBinary(std::vector &buf) const +{ + if (buf.size() < GetHeaderSize()) { + buf.resize(GetHeaderSize()); + } + uint8_t *p = buf.data(); + *(reinterpret_cast(p)) = header; +} + +void PerfEventRecord::Dump(int indent) const +{ + PrintIndent(indent, "\n"); + PrintIndent(indent, "record %s: type %u, misc %u, size %zu\n", GetName().c_str(), GetType(), + GetMisc(), GetSize()); + DumpData(indent + 1); +} + +void PerfEventRecord::DumpLog(const std::string &prefix) const +{ + HLOGV("%s: record %s: type %u, misc %u, size %zu\n", prefix.c_str(), GetName().c_str(), + GetType(), GetMisc(), GetSize()); +} + +void PerfRecordSample::DumpLog(const std::string &prefix) const +{ + HLOGV("%s: SAMPLE: id= %llu size %d pid %u tid %u ips %llu regs %llu, stacks %llu time %llu", + prefix.c_str(), data_.sample_id, header.size, data_.pid, data_.tid, data_.nr, + data_.reg_nr, data_.dyn_size, data_.time); +} + +void PerfRecordSample::ReplaceWithCallStack(size_t originalSize) +{ + // first we check if we have some user unwind stack need to merge ? + if (callFrames_.size() != 0) { + // when we have some kernel ips , we cp it first + // new size is user call frames + kernel call frames + // + PERF_CONTEXT_USER(last + 1) + expand mark(also PERF_CONTEXT_USER) + const unsigned int perfContextSize = 2; + ips_.reserve(data_.nr + callFrames_.size() + perfContextSize); + if (data_.nr > 0) { + ips_.assign(data_.ips, data_.ips + data_.nr); + } + // add user context mark + ips_.emplace_back(PERF_CONTEXT_USER); + // we also need make a expand mark just for debug only + const size_t beginIpsSize = ips_.size(); + bool ret = std::all_of(callFrames_.begin(), callFrames_.end(), [&](const CallFrame &frame) { + ips_.emplace_back(frame.ip_); + if (originalSize != 0 and (originalSize != callFrames_.size()) and + ips_.size() == (originalSize + beginIpsSize)) { + // just for debug + // so we can see which frame begin is expand call frames + ips_.emplace_back(PERF_CONTEXT_USER); + } + return true; + }); + if (ret) { + HLOGV("combed %zu", callFrames_.size()); + } else { + HLOGV("failed to combed %zu", callFrames_.size()); + } + + if (sampleType_ & PERF_SAMPLE_REGS_USER) { + data_.reg_nr = 0; + header.size -= data_.reg_nr * sizeof(u64); + } + + if (sampleType_ & PERF_SAMPLE_STACK_USER) { + // 1. remove the user stack + header.size -= data_.stack_size; + + // 2. clean the size + data_.user_abi = 0; + data_.stack_size = 0; + data_.dyn_size = 0; + } + + if (sampleType_ & PERF_SAMPLE_CALLCHAIN) { + HLOGV("ips change from %llu -> %zu", data_.nr, ips_.size()); + + // 3. remove the nr size + header.size -= data_.nr * sizeof(u64); + + // 4. add new nr size + data_.nr = ips_.size(); + header.size += data_.nr * sizeof(u64); + + // 5. change ips potin to our ips array and hold it. + data_.ips = ips_.data(); + } + } else { + // nothing need change + return; + } +} + +PerfRecordSample::PerfRecordSample(uint8_t *p, const perf_event_attr &attr) + : PerfEventRecord(p, "sample") +{ + if (p == nullptr) { + HLOG_ASSERT(p); + return; + } + sampleType_ = attr.sample_type; + + p += sizeof(header); + + // parse record according SAMPLE_TYPE + PopFromBinary(sampleType_ & PERF_SAMPLE_IDENTIFIER, p, data_.sample_id); + PopFromBinary(sampleType_ & PERF_SAMPLE_IP, p, data_.ip); + PopFromBinary2(sampleType_ & PERF_SAMPLE_TID, p, data_.pid, data_.tid); + PopFromBinary(sampleType_ & PERF_SAMPLE_TIME, p, data_.time); + PopFromBinary(sampleType_ & PERF_SAMPLE_ADDR, p, data_.addr); + PopFromBinary(sampleType_ & PERF_SAMPLE_ID, p, data_.id); + PopFromBinary(sampleType_ & PERF_SAMPLE_STREAM_ID, p, data_.stream_id); + PopFromBinary2(sampleType_ & PERF_SAMPLE_CPU, p, data_.cpu, data_.res); + PopFromBinary(sampleType_ & PERF_SAMPLE_PERIOD, p, data_.period); + PopFromBinary(sampleType_ & PERF_SAMPLE_CALLCHAIN, p, data_.nr); + if (data_.nr > 0) { + // the pointer is from input(p), require caller keep input(p) with *this together + // think it in next time + data_.ips = reinterpret_cast(p); + p += data_.nr * sizeof(u64); + } + PopFromBinary(sampleType_ & PERF_SAMPLE_RAW, p, data_.raw_size); + if (data_.raw_size > 0) { + data_.raw_data = p; + p += data_.raw_size * sizeof(u8); + } + PopFromBinary(sampleType_ & PERF_SAMPLE_BRANCH_STACK, p, data_.bnr); + if (data_.bnr > 0) { + data_.lbr = reinterpret_cast(p); + p += data_.bnr * sizeof(perf_branch_entry); + } + PopFromBinary(sampleType_ & PERF_SAMPLE_REGS_USER, p, data_.user_abi); + if (data_.user_abi > 0) { + data_.reg_mask = attr.sample_regs_user; + data_.reg_nr = __builtin_popcountll(data_.reg_mask); + data_.user_regs = reinterpret_cast(p); + p += data_.reg_nr * sizeof(u64); + } + PopFromBinary(sampleType_ & PERF_SAMPLE_STACK_USER, p, data_.stack_size); + if (data_.stack_size > 0) { + data_.stack_data = p; + p += data_.stack_size; + PopFromBinary(true, p, data_.dyn_size); + } +} + +bool PerfRecordSample::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + PushToBinary(sampleType_ & PERF_SAMPLE_IDENTIFIER, p, data_.sample_id); + PushToBinary(sampleType_ & PERF_SAMPLE_IP, p, data_.ip); + PushToBinary2(sampleType_ & PERF_SAMPLE_TID, p, data_.pid, data_.tid); + PushToBinary(sampleType_ & PERF_SAMPLE_TIME, p, data_.time); + PushToBinary(sampleType_ & PERF_SAMPLE_ADDR, p, data_.addr); + PushToBinary(sampleType_ & PERF_SAMPLE_ID, p, data_.id); + PushToBinary(sampleType_ & PERF_SAMPLE_STREAM_ID, p, data_.stream_id); + PushToBinary2(sampleType_ & PERF_SAMPLE_CPU, p, data_.cpu, data_.res); + PushToBinary(sampleType_ & PERF_SAMPLE_PERIOD, p, data_.period); + PushToBinary(sampleType_ & PERF_SAMPLE_CALLCHAIN, p, data_.nr); + if (data_.nr > 0) { + std::copy(data_.ips, data_.ips + data_.nr, reinterpret_cast(p)); + p += data_.nr * sizeof(u64); + } + PushToBinary(sampleType_ & PERF_SAMPLE_RAW, p, data_.raw_size); + if (data_.raw_size > 0) { + std::copy(data_.raw_data, data_.raw_data + data_.raw_size, p); + p += data_.raw_size * sizeof(u8); + } + PushToBinary(sampleType_ & PERF_SAMPLE_BRANCH_STACK, p, data_.bnr); + if (data_.bnr > 0) { + std::copy(data_.lbr, data_.lbr + data_.bnr, reinterpret_cast(p)); + p += data_.bnr * sizeof(perf_branch_entry); + } + PushToBinary(sampleType_ & PERF_SAMPLE_REGS_USER, p, data_.user_abi); + if (data_.user_abi > 0 && data_.reg_nr > 0) { + std::copy(data_.user_regs, data_.user_regs + data_.reg_nr, reinterpret_cast(p)); + p += data_.reg_nr * sizeof(u64); + } + PushToBinary(sampleType_ & PERF_SAMPLE_STACK_USER, p, data_.stack_size); + if (data_.stack_size > 0) { + std::copy(data_.stack_data, data_.stack_data + data_.stack_size, p); + p += data_.stack_size * sizeof(u8); + PushToBinary(true, p, data_.dyn_size); + } + + return true; +} + +void PerfRecordSample::DumpData(int indent) const +{ + PrintIndent(indent, "sample_type: 0x%" PRIx64 "\n", sampleType_); + + // dump record according sampleType + if (sampleType_ & (PERF_SAMPLE_ID | PERF_SAMPLE_IDENTIFIER)) { + PrintIndent(indent, "ID %lld\n", data_.sample_id); + } + if (sampleType_ & PERF_SAMPLE_IP) { + PrintIndent(indent, "ip %llx\n", data_.ip); + } + if (sampleType_ & PERF_SAMPLE_TID) { + PrintIndent(indent, "pid %u, tid %u\n", data_.pid, data_.tid); + } + if (sampleType_ & PERF_SAMPLE_TIME) { + PrintIndent(indent, "time %llu\n", data_.time); + } + if (sampleType_ & PERF_SAMPLE_ADDR) { + PrintIndent(indent, "addr %p\n", reinterpret_cast(data_.addr)); + } + if (sampleType_ & PERF_SAMPLE_STREAM_ID) { + PrintIndent(indent, "stream_id %lld\n", data_.stream_id); + } + if (sampleType_ & PERF_SAMPLE_CPU) { + PrintIndent(indent, "cpu %u, res %u\n", data_.cpu, data_.res); + } + if (sampleType_ & PERF_SAMPLE_PERIOD) { + PrintIndent(indent, "period %lld\n", data_.period); + } + if (sampleType_ & PERF_SAMPLE_CALLCHAIN) { + bool userContext = false; + PrintIndent(indent, "callchain nr=%lld\n", data_.nr); + for (uint64_t i = 0; i < data_.nr; ++i) { + std::string_view supplement = ""; + if ((sampleType_ & PERF_SAMPLE_STACK_USER) == 0 || data_.ips[i] != PERF_CONTEXT_USER) { + PrintIndent(indent + 1, "0x%llx%s\n", data_.ips[i], supplement.data()); + continue; + } + // is PERF_SAMPLE_STACK_USER type and is PERF_CONTEXT_USER + if (!userContext) { + userContext = true; + supplement = " "; + } else { + supplement = " "; + } + PrintIndent(indent + 1, "0x%llx%s\n", data_.ips[i], supplement.data()); + } + } + if (sampleType_ & PERF_SAMPLE_RAW) { + PrintIndent(indent, "raw size=%u\n", data_.raw_size); + const uint32_t *data = reinterpret_cast(data_.raw_data); + size_t size = data_.raw_size / sizeof(uint32_t); + for (size_t i = 0; i < size; ++i) { + PrintIndent(indent + 1, "0x%08x (%x)\n", data[i], data[i]); + } + } + if (sampleType_ & PERF_SAMPLE_BRANCH_STACK) { + PrintIndent(indent, "branch_stack nr=%lld\n", data_.bnr); + for (uint64_t i = 0; i < data_.bnr; ++i) { + auto &item = data_.lbr[i]; + PrintIndent(indent + 1, "from 0x%llx, to 0x%llx %s%s\n", item.from, item.to, + item.mispred ? "mispred" : "", item.predicted ? "predicted" : ""); + } + } + if (sampleType_ & PERF_SAMPLE_REGS_USER) { + PrintIndent(indent, "user regs: abi=%lld, reg_nr=%lld\n", data_.user_abi, data_.reg_nr); + for (uint64_t i = 0; i < data_.reg_nr; ++i) { + PrintIndent(indent + 1, "0x%llx\n", data_.user_regs[i]); + } + } + if (sampleType_ & PERF_SAMPLE_STACK_USER) { + PrintIndent(indent, "user stack: size %llu dyn_size %lld\n", data_.stack_size, + data_.dyn_size); + } +} + +inline pid_t PerfRecordSample::GetPid() const +{ + return data_.pid; +} + +PerfRecordMmap::PerfRecordMmap(uint8_t *p) : PerfEventRecord(p, "mmap") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +PerfRecordMmap::PerfRecordMmap(bool inKernel, u32 pid, u32 tid, u64 addr, u64 len, u64 pgoff, + const std::string &filename) + : PerfEventRecord(PERF_RECORD_MMAP, inKernel, "mmap") +{ + data_.pid = pid; + data_.tid = tid; + data_.addr = addr; + data_.len = len; + data_.pgoff = pgoff; + if (strncpy_s(data_.filename, KILO, filename.c_str(), filename.size()) != 0) { + HLOGE("strncpy_s failed"); + } + + header.size = sizeof(header) + sizeof(data_) - KILO + filename.size() + 1; +} + +bool PerfRecordMmap::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + // data_.filename[] is variable-length + std::copy((uint8_t *)&data_, (uint8_t *)&data_ + GetSize() - GetHeaderSize(), p); + return true; +} + +void PerfRecordMmap::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, tid %u, addr 0x%llx, len 0x%llx\n", data_.pid, data_.tid, + data_.addr, data_.len); + PrintIndent(indent, "pgoff 0x%llx, filename %s\n", data_.pgoff, data_.filename); +} + +void PerfRecordMmap::DumpLog(const std::string &prefix) const +{ + HLOGV("%s: MMAP: size %d pid %u tid %u dso '%s' (0x%llx-0x%llx)@0x%llx", prefix.c_str(), + header.size, data_.pid, data_.tid, data_.filename, data_.addr, data_.addr + data_.len, + data_.pgoff); +} + +PerfRecordMmap2::PerfRecordMmap2(uint8_t *p) : PerfEventRecord(p, "mmap2") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +PerfRecordMmap2::PerfRecordMmap2(bool inKernel, u32 pid, u32 tid, u64 addr, u64 len, u64 pgoff, + u32 maj, u32 min, u64 ino, u32 prot, u32 flags, + const std::string &filename) + : PerfEventRecord(PERF_RECORD_MMAP2, inKernel, "mmap2") +{ + data_.pid = pid; + data_.tid = tid; + data_.addr = addr; + data_.len = len; + data_.pgoff = pgoff; + data_.maj = maj; + data_.min = min; + data_.ino = ino; + data_.ino_generation = 0; + data_.prot = prot; + data_.flags = flags; + if (strncpy_s(data_.filename, KILO, filename.c_str(), filename.size()) != 0) { + HLOGE("strncpy_s failed"); + } + + header.size = sizeof(header) + sizeof(data_) - KILO + filename.size() + 1; +} + +PerfRecordMmap2::PerfRecordMmap2(bool inKernel, u32 pid, u32 tid, const MemMapItem &item) + : PerfEventRecord(PERF_RECORD_MMAP2, inKernel, "mmap2") +{ + data_.pid = pid; + data_.tid = tid; + data_.addr = item.begin_; + data_.len = item.end_ - item.begin_; + data_.pgoff = item.pageoffset_; + data_.maj = item.major_; + data_.min = item.minor_; + data_.ino = item.inode; + data_.ino_generation = 0; + data_.prot = item.type_; + data_.flags = item.flags; + if (strncpy_s(data_.filename, KILO, item.name_.c_str(), item.name_.size()) != 0) { + HLOGE("strncpy_s failed"); + } + + header.size = sizeof(header) + sizeof(data_) - KILO + item.name_.size() + 1; +} + +bool PerfRecordMmap2::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + // data_.filename[] is variable-length + std::copy((uint8_t *)&data_, (uint8_t *)&data_ + GetSize() - GetHeaderSize(), p); + return true; +} + +void PerfRecordMmap2::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, tid %u, addr 0x%llx, len 0x%llx\n", data_.pid, data_.tid, + data_.addr, data_.len); + PrintIndent(indent, "pgoff 0x%llx, maj %u, min %u, ino %llu, ino_generation %llu\n", + data_.pgoff, data_.maj, data_.min, data_.ino, data_.ino_generation); + PrintIndent(indent, "prot %u, flags %u, filename %s\n", data_.prot, data_.flags, + data_.filename); +} +void PerfRecordMmap2::DumpLog(const std::string &prefix) const +{ + HLOGV("%s: MMAP2: size %d pid %u tid %u dso '%s' (0x%llx-0x%llx)@0x%llx", prefix.c_str(), + header.size, data_.pid, data_.tid, data_.filename, data_.addr, data_.addr + data_.len, + data_.pgoff); +} + +PerfRecordLost::PerfRecordLost(uint8_t *p) : PerfEventRecord(p, "lost") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordLost::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + + return true; +} + +void PerfRecordLost::DumpData(int indent) const +{ + PrintIndent(indent, "id %llu, lost %llu\n", data_.id, data_.lost); +} + +PerfRecordComm::PerfRecordComm(uint8_t *p) : PerfEventRecord(p, "comm") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +PerfRecordComm::PerfRecordComm(bool inKernel, u32 pid, u32 tid, const std::string &comm) + : PerfEventRecord(PERF_RECORD_COMM, inKernel, "comm") +{ + data_.pid = pid; + data_.tid = tid; + if (strncpy_s(data_.comm, KILO, comm.c_str(), comm.size()) != 0) { + HLOGE("strncpy_s failed !!!"); + } + + header.size = sizeof(header) + sizeof(data_) - KILO + comm.size() + 1; +} + +bool PerfRecordComm::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + // data_.comm[] is variable-length + std::copy((uint8_t *)&data_, (uint8_t *)&data_ + GetSize() - GetHeaderSize(), p); + + return true; +} + +void PerfRecordComm::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, tid %u, comm %s\n", data_.pid, data_.tid, data_.comm); +} + +void PerfRecordComm::DumpLog(const std::string &prefix) const +{ + HLOGV("pid %u, tid %u, comm %s\n", data_.pid, data_.tid, data_.comm); +} + +PerfRecordExit::PerfRecordExit(uint8_t *p) : PerfEventRecord(p, "exit") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordExit::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordExit::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, ppid %u, tid %u, ptid %u time 0x%llx\n", data_.pid, data_.ppid, + data_.tid, data_.ptid, data_.time); +} + +PerfRecordThrottle::PerfRecordThrottle(uint8_t *p) : PerfEventRecord(p, "throttle") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordThrottle::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordThrottle::DumpData(int indent) const +{ + PrintIndent(indent, "time 0x%llx, id %llx, stream_id %llx\n", data_.time, data_.id, + data_.stream_id); +} + +PerfRecordUnthrottle::PerfRecordUnthrottle(uint8_t *p) : PerfEventRecord(p, "unthrottle") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordUnthrottle::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} +void PerfRecordUnthrottle::DumpData(int indent) const +{ + PrintIndent(indent, "time 0x%llx, id %llx, stream_id %llx\n", data_.time, data_.id, + data_.stream_id); +} + +PerfRecordFork::PerfRecordFork(uint8_t *p) : PerfEventRecord(p, "fork") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordFork::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordFork::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, ppid %u, tid %u, ptid %u\n", data_.pid, data_.ppid, data_.tid, + data_.ptid); +} + +PerfRecordRead::PerfRecordRead(uint8_t *p) : PerfEventRecord(p, "read") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordRead::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordRead::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, tid %u\n", data_.pid, data_.tid); + PrintIndent(indent, "values: value %llx, time_enabled %llx, time_running %llx, id %llx\n", + data_.values.value, data_.values.time_enabled, data_.values.time_running, + data_.values.id); +} + +PerfRecordAux::PerfRecordAux(uint8_t *p) : PerfEventRecord(p, "aux") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((void *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordAux::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordAux::DumpData(int indent) const +{ + PrintIndent(indent, "aux_offset %llx, aux_size %llx, flags %llx\n", data_.aux_offset, + data_.aux_size, data_.flags); +} + +PerfRecordItraceStart::PerfRecordItraceStart(uint8_t *p) : PerfEventRecord(p, "itraceStart") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordItraceStart::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordItraceStart::DumpData(int indent) const +{ + PrintIndent(indent, "pid %u, tid %u\n", data_.pid, data_.tid); +} + +PerfRecordLostSamples::PerfRecordLostSamples(uint8_t *p) : PerfEventRecord(p, "lostSamples") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordLostSamples::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordLostSamples::DumpData(int indent) const +{ + PrintIndent(indent, "lost %llu\n", data_.lost); +} + +PerfRecordSwitch::PerfRecordSwitch(uint8_t *p) : PerfEventRecord(p, "switch") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordSwitch::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +PerfRecordSwitchCpuWide::PerfRecordSwitchCpuWide(uint8_t *p) : PerfEventRecord(p, "switchCpuWide") +{ + size_t copySize = GetSize() - sizeof(header); + if (memcpy_s((uint8_t *)&data_, sizeof(data_), p + sizeof(header), copySize) != 0) { + HLOGE("memcpy_s retren failed !!!"); + } +} + +bool PerfRecordSwitchCpuWide::GetBinary(std::vector &buf) const +{ + if (buf.size() < GetSize()) { + buf.resize(GetSize()); + } + + GetHeaderBinary(buf); + uint8_t *p = buf.data() + GetHeaderSize(); + + auto pDest = reinterpret_cast(p); + *pDest = data_; + return true; +} + +void PerfRecordSwitchCpuWide::DumpData(int indent) const +{ + PrintIndent(indent, "next_prev_pid %u, next_prev_tid %u\n", data_.next_prev_pid, + data_.next_prev_tid); +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_events.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_events.cpp new file mode 100644 index 0000000..d53d2a0 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_events.cpp @@ -0,0 +1,1645 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "perf_events.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(CONFIG_HAS_SYSPARA) +#include +#endif + +#include "debug_logger.h" +#include "register.h" +#include "subcommand_dump.h" +#include "symbols_file.h" +#include "utilities.h" +#include "tracked_command.h" + +using namespace std; +using namespace std::chrono; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static std::atomic_bool g_trackRunning = false; + +OHOS::UniqueFd PerfEvents::Open(perf_event_attr &attr, pid_t pid, int cpu, int group_fd, + unsigned long flags) +{ + if (perfEventParanoid_ >= PerfEventParanoid::USER) { + attr.exclude_kernel = true; // kernel restrict + } + OHOS::UniqueFd fd = UniqueFd(syscall(__NR_perf_event_open, &attr, pid, cpu, group_fd, flags)); + if (fd < 0) { + HLOGEP("syscall perf_event_open failed. "); + // dump when open failed. + SubCommandDump::DumpPrintEventAttr(attr, std::numeric_limits::min()); + } + HLOGV("perf_event_open: got fd %d for pid %d cpu %d group %d flags %lu perfEventParanoid %d", + fd.Get(), pid, cpu, group_fd, flags, perfEventParanoid_); + return fd; +} + +PerfEvents::PerfEvents() : timeOut_(DEFAULT_TIMEOUT * THOUSANDS), timeReport_(0) +{ + pageSize_ = sysconf(_SC_PAGESIZE); + HLOGI("BuildArch %s", GetArchName(buildArchType).c_str()); +} + +PerfEvents::~PerfEvents() +{ + // close mmap + for (auto it = cpuMmap_.begin(); it != cpuMmap_.end();) { + const MmapFd &mmapItem = it->second; + munmap(mmapItem.mmapPage, (1 + mmapPages_) * pageSize_); + it = cpuMmap_.erase(it); + } + + // close file descriptor of perf_event_open() created + for (auto eventGroupItem = eventGroupItem_.begin(); eventGroupItem != eventGroupItem_.end();) { + for (const auto &eventItem : eventGroupItem->eventItems) { + for (const auto &fdItem : eventItem.fdItems) { + close(fdItem.fd); + } + } + eventGroupItem = eventGroupItem_.erase(eventGroupItem); + } + + ExitReadRecordBufThread(); +} + +PerfEventParanoid PerfEvents::perfEventParanoid_ = PerfEventParanoid::UNKNOW; + +bool PerfEvents::CheckOhosPermissions() +{ +#if defined(CONFIG_HAS_SYSPARA) + std::string perfHarden = "0"; + perfHarden = OHOS::system::GetParameter(PERF_DISABLE_PARAM, perfHarden); + HLOGD("%s is %s", PERF_DISABLE_PARAM.c_str(), perfHarden.c_str()); + if (perfHarden == "1") { + printf("param '%s' is disabled, try to enable it\n", PERF_DISABLE_PARAM.c_str()); + // we will try to set it as 0 + perfHarden = OHOS::system::SetParameter(PERF_DISABLE_PARAM, "0"); + // wait init config the param + std::this_thread::sleep_for(1s); + if (OHOS::system::GetParameter(PERF_DISABLE_PARAM, perfHarden) == "1") { + printf("setparam failed. pls try setparam %s 0\n", PERF_DISABLE_PARAM.c_str()); + } + } + return perfHarden == "0"; +#else + return true; // not ohos +#endif +} + +bool PerfEvents::CheckPermissions(PerfEventParanoid request) +{ + // check the ohos param "security.perf_harden" + + if (getuid() == 0) { + // we are root perfEventParanoid as -1 + perfEventParanoid_ = PerfEventParanoid::NOLIMIT; + printf("this is root mode, perfEventParanoid assume as -1\n"); + return true; + } + + std::string perfEventParanoid = ReadFileToString(PERF_EVENT_PARANOID); + if (perfEventParanoid.empty()) { + printf("unable to read %s, assume as 2\n", PERF_EVENT_PARANOID.c_str()); + perfEventParanoid_ = PerfEventParanoid::USER; + } else { + perfEventParanoid_ = static_cast(stoi(perfEventParanoid)); + } + +#if is_ohos + // not root and in ohos + if (!CheckOhosPermissions()) { + return false; + } +#endif + + if (perfEventParanoid_ == PerfEventParanoid::NOLIMIT) { + return true; + } + printf("%s is %d\n", PERF_EVENT_PARANOID.c_str(), perfEventParanoid_); + if (perfEventParanoid_ >= PerfEventParanoid::USER) { + printf("allow only user-space measurements (default since Linux 4.6).\n"); + } else if (perfEventParanoid_ == PerfEventParanoid::KERNEL_USER) { + printf("allow both kernel and user measurements (default before Linux 4.6).\n"); + } else if (perfEventParanoid_ == PerfEventParanoid::KERNEL_USER_CPU) { + printf("allow access to CPU-specific data but not raw tracepoint samples.\n"); + } else if (perfEventParanoid_ <= PerfEventParanoid::NOLIMIT) { + printf("unable to read anything\n"); + } + printf("request level is %d\n", request); + return perfEventParanoid_ <= request; +} + +bool PerfEvents::IsEventSupport(perf_type_id type, __u64 config) +{ + HLOGV("enter"); + unique_ptr attr = PerfEvents::CreateDefaultAttr(type, config); + UniqueFd fd = Open(*attr.get()); + if (fd < 0) { + printf("event not support %s\n", GetStaticConfigName(type, config).c_str()); + return false; + } else { + return true; + } +} +bool PerfEvents::IsEventAttrSupport(perf_event_attr &attr) +{ + HLOGV("enter"); + UniqueFd fd = Open(attr); + if (fd < 0) { + return false; + } else { + return true; + } +} + +bool PerfEvents::SetBranchSampleType(uint64_t value) +{ + if (value != 0) { + // cpu-clcles event must be supported + unique_ptr attr = + PerfEvents::CreateDefaultAttr(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); + attr->sample_type |= PERF_SAMPLE_BRANCH_STACK; + attr->branch_sample_type = value; + if (!IsEventAttrSupport(*attr.get())) { + return false; + } + } + branchSampleType_ = value; + return true; +} + +bool PerfEvents::AddDefaultEvent(perf_type_id type) +{ + HLOGV("enter"); + auto it = DEFAULT_TYPE_CONFIGS.find(type); + if (it != DEFAULT_TYPE_CONFIGS.end()) { + for (auto config : it->second) { + AddEvent(type, config); + } + } + return true; +} + +bool PerfEvents::AddOffCpuEvent() +{ + std::string eventName = "sched:sched_switch"; + if (eventSpaceType_ == EventSpaceType::USER) { + eventName += ":u"; + } else if (eventSpaceType_ == EventSpaceType::KERNEL) { + eventName += ":k"; + } + return AddEvent(eventName); +} + +bool PerfEvents::AddEvents(const std::vector &eventStrings, bool group) +{ + bool followGroup = false; + HLOGV(" %s %s", VectorToString(eventStrings).c_str(), followGroup ? "followGroup" : ""); + + for (std::string eventString : eventStrings) { + if (!AddEvent(eventString, followGroup)) { + return false; + } + // this is group request , Follow-up events need to follow the previous group + if (group) { + followGroup = true; + } + } + return true; +} + +// event name can have :k or :u suffix +// tracepoint event name is like sched:sched_switch +// clang-format off +bool PerfEvents::ParseEventName(const std::string &nameStr, + std::string &name, bool &excludeUser, bool &excludeKernel, bool &isTracePoint) +// clang-format on +{ + name = nameStr; + excludeUser = false; + excludeKernel = false; + isTracePoint = false; + if (nameStr.find(":") != std::string::npos) { + static constexpr size_t maxNumberTokensNoTracePoint = 2; + static constexpr size_t maxNumberTokensTracePoint = 3; + std::vector eventTokens = StringSplit(nameStr, ":"); + if (eventTokens.size() == maxNumberTokensTracePoint) { + // tracepoint event with :u or :k + if (eventTokens.back() == "k") { + excludeUser = true; + HLOGV("kernelOnly event"); + } else if (eventTokens.back() == "u") { + excludeKernel = true; + HLOGV("userOnly event"); + } else { + HLOGV("unknown event name %s", nameStr.c_str()); + return false; + } + name = eventTokens[0] + ":" + eventTokens[1]; + isTracePoint = true; + } else if (eventTokens.size() == maxNumberTokensNoTracePoint) { + name = eventTokens[0]; + if (eventTokens.back() == "k") { + excludeUser = true; + HLOGV("kernelOnly event"); + } else if (eventTokens.back() == "u") { + excludeKernel = true; + HLOGV("userOnly event"); + } else { + name = nameStr; + isTracePoint = true; + HLOGV("tracepoint event is in form of xx:xxx"); + } + } else { + printf("unknown ':' format:'%s'\n", nameStr.c_str()); + return false; + } + if (reportCallBack_) { + if ((eventTokens[0] == "sw-task-clock" || eventTokens[0] == "sw-cpu-clock") && + (excludeUser || excludeKernel)) { + printf( + "event type %s with modifier u and modifier k is not supported by the kernel.", + eventTokens[0].c_str()); + return false; + } + } + } + return true; +} + +bool PerfEvents::AddEvent(const std::string &eventString, bool followGroup) +{ + std::string eventName; + bool excludeUser = false; + bool excludeKernel = false; + bool isTracePointEvent = false; + if (!ParseEventName(eventString, eventName, excludeUser, excludeKernel, isTracePointEvent)) { + return false; + } + if (excludeUser) { + if (requestPermission_ > PerfEventParanoid::KERNEL_USER) { + requestPermission_ = PerfEventParanoid::KERNEL_USER; + } + + eventSpaceType_ |= EventSpaceType::KERNEL; + } else if (excludeKernel) { + eventSpaceType_ |= EventSpaceType::USER; + } else { + eventSpaceType_ |= EventSpaceType::USER_KERNEL; + } + + if (isTracePointEvent) { + if (PERF_TRACEPOINT_CONFIGS.empty()) { + LoadTracepointEventTypesFromSystem(); + } + } + + // find if + if (isTracePointEvent) { + for (auto traceType : traceConfigTable) { + if (traceType.second == eventName) { + return AddEvent(PERF_TYPE_TRACEPOINT, traceType.first, excludeUser, excludeKernel, + followGroup); + } + } + } else { + for (auto type : TYPE_CONFIGS) { + for (auto config : (type.second)) { + if (config.second == eventName) { + return AddEvent(type.first, config.first, excludeUser, excludeKernel, + followGroup); + } + } + } + } + + printf("%s event is not supported by the kernel.\n", eventName.c_str()); + return false; +} + +bool PerfEvents::AddEvent(perf_type_id type, __u64 config, bool excludeUser, bool excludeKernel, + bool followGroup) +{ + HLOG_ASSERT(!excludeUser or !excludeKernel); + if (followGroup && eventGroupItem_.empty()) { + HLOGE("no group leader create before"); + return false; + } + // found the event name + if (!IsEventSupport(type, config)) { + return false; + } + HLOGV("type %d config %llu excludeUser %d excludeKernel %d followGroup %d", type, config, + excludeUser, excludeKernel, followGroup); + + // if use follow ? + EventGroupItem &eventGroupItem = followGroup ? eventGroupItem_.back() + : eventGroupItem_.emplace_back(); + // always new item + EventItem &eventItem = eventGroupItem.eventItems.emplace_back(); + + eventItem.typeName = GetTypeName(type); + if (type == PERF_TYPE_TRACEPOINT) { + eventItem.configName = GetTraceConfigName(config); + } else { + eventItem.configName = GetStaticConfigName(type, config); + } + + // attr + if (memset_s(&eventItem.attr, sizeof(perf_event_attr), 0, sizeof(perf_event_attr)) != EOK) { + HLOGE("memset_s failed in PerfEvents::AddEvent"); + return false; + } + eventItem.attr.size = sizeof(perf_event_attr); + eventItem.attr.type = type; + eventItem.attr.config = config; + eventItem.attr.disabled = 1; + eventItem.attr.read_format = + PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_ID; + + eventItem.attr.inherit = (inherit_ ? 1 : 0); + eventItem.attr.exclude_kernel = excludeKernel; + eventItem.attr.exclude_user = excludeUser; + + // we also need mmap for record + if (recordCallBack_) { + if (samplePeriod_ > 0) { + eventItem.attr.freq = 0; + eventItem.attr.sample_period = samplePeriod_; + } else if (sampleFreq_ > 0) { + eventItem.attr.freq = 1; + eventItem.attr.sample_freq = sampleFreq_; + } else { + if (type == PERF_TYPE_TRACEPOINT) { + eventItem.attr.freq = 0; + eventItem.attr.sample_period = DEFAULT_SAMPLE_PERIOD; + } else { + eventItem.attr.freq = 1; + eventItem.attr.sample_freq = DEFAULT_SAMPLE_FREQUNCY; + } + } + + eventItem.attr.watermark = 1; + if (eventItem.attr.watermark == 1) { + eventItem.attr.wakeup_watermark = (mmapPages_ * pageSize_) >> 1; + static constexpr unsigned int maxWakeupMark = 1024 * 1024; + if (eventItem.attr.wakeup_watermark > maxWakeupMark) { + eventItem.attr.wakeup_watermark = maxWakeupMark; + } + } + + // for a group of events, only enable comm/mmap on the first event + if (!followGroup) { + eventItem.attr.comm = 1; + eventItem.attr.mmap = 1; + eventItem.attr.mmap2 = 1; + eventItem.attr.mmap_data = 1; + } + + if (sampleStackType_ == SampleStackType::DWARF) { + eventItem.attr.sample_type = SAMPLE_TYPE | PERF_SAMPLE_CALLCHAIN | + PERF_SAMPLE_STACK_USER | PERF_SAMPLE_REGS_USER; + eventItem.attr.exclude_callchain_user = 1; + eventItem.attr.sample_regs_user = GetSupportedRegMask(GetDeviceArch()); + eventItem.attr.sample_stack_user = dwarfSampleStackSize_; + } else if (sampleStackType_ == SampleStackType::FP) { + eventItem.attr.sample_type = SAMPLE_TYPE | PERF_SAMPLE_CALLCHAIN; + } else { + eventItem.attr.sample_type = SAMPLE_TYPE; + } + } + + // set clock id + if (clockId_ != -1) { + eventItem.attr.use_clockid = 1; + eventItem.attr.clockid = clockId_; + } + if (branchSampleType_ != 0) { + eventItem.attr.sample_type |= PERF_SAMPLE_BRANCH_STACK; + eventItem.attr.branch_sample_type = branchSampleType_; + } + + HLOGV("Add Event: '%s':'%s' %s %s %s", eventItem.typeName.c_str(), eventItem.configName.c_str(), + excludeUser ? "excludeUser" : "", excludeKernel ? "excludeKernel" : "", + followGroup ? "" : "group leader"); + + return true; +} + +std::unique_ptr PerfEvents::CreateDefaultAttr(perf_type_id type, __u64 config) +{ + unique_ptr attr = make_unique(); + if (memset_s(attr.get(), sizeof(perf_event_attr), 0, sizeof(perf_event_attr)) != EOK) { + HLOGE("memset_s failed in PerfEvents::CreateDefaultAttr"); + return nullptr; + } + attr->size = sizeof(perf_event_attr); + attr->type = type; + attr->config = config; + attr->disabled = 1; + return attr; +} + +// should move to upper caller +static struct sigaction g_oldSig { +}; +static bool CaptureSig() +{ + HLOGD("capture Ctrl + C to end sampling decently"); + struct sigaction sig { + }; + + sig.sa_handler = [](int sig) { + printf("\n Ctrl + C detected.\n"); + g_trackRunning = false; + }; + + sig.sa_flags = 0; + if (sigaction(SIGINT, &sig, &g_oldSig) < 0) { + perror("Fail to call sigaction for SIGINT"); + return false; + } + return true; +} + +static void RecoverCaptureSig() +{ + if (sigaction(SIGINT, &g_oldSig, nullptr) < 0) { + perror("Fail to call sigaction for SIGINT"); + } +} + +// split to two part +// because WriteAttrAndId need fd id before start tracking +bool PerfEvents::PrepareTracking(void) +{ + HLOGV("enter"); + + if (!CheckPermissions(requestPermission_)) { + return false; + } + + // 1. prepare cpu pid + if (!PrepareFdEvents()) { + HLOGE("PrepareFdEvents() failed"); + return false; + } + + // 2. create events + if (!CreateFdEvents()) { + HLOGE("CreateFdEvents() failed"); + return false; + } + + prepared_ = true; + return true; +} + +void PerfEvents::ExitReadRecordBufThread() +{ + if (isLowPriorityThread_) { + if (setpriority(PRIO_PROCESS, gettid(), 0) != 0) { + HLOGW("failed to decrease priority of reading kernel"); + } + } + if (readRecordBufThread_.joinable()) { + readRecordThreadRunning_ = false; + __sync_synchronize(); + cvRecordBuf_.notify_one(); + readRecordBufThread_.join(); + } +} + +bool PerfEvents::PrepareRecordThread() +{ + try { + recordBuf_ = std::make_unique(CalcBufferSize()); + } catch (const std::exception &e) { + printf("create record buffer(size %zu) failed: %s\n", CalcBufferSize(), e.what()); + return false; + } + readRecordThreadRunning_ = true; + readRecordBufThread_ = std::thread(&PerfEvents::ReadRecordFromBuf, this); + + rlimit rlim; + int result = getrlimit(RLIMIT_NICE, &rlim); + const rlim_t lowPriority = 40; + if (result == 0 && rlim.rlim_cur == lowPriority) { + const int highPriority = -20; + result = setpriority(PRIO_PROCESS, gettid(), highPriority); + if (result != 0) { + HLOGW("failed to increase priority of reading kernel"); + } else { + isLowPriorityThread_ = true; + } + } + + return true; +} + +void PerfEvents::WaitRecordThread() +{ + printf("Process and Saving data...\n"); + ExitReadRecordBufThread(); + + const auto usedTimeMsTick = duration_cast(steady_clock::now() - trackingEndTime_); + if (verboseReport_) { + printf("Record Process Completed (wait %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); + } + HLOGV("Record Process Completed (wait %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); +#ifdef HIPERF_DEBUG_TIME + printf("%zu record processed, used %0.3f ms(%4.2f us/record)\n", recordEventCount_, + recordCallBackTime_.count() / MS_DUARTION, + recordCallBackTime_.count() / static_cast(recordEventCount_)); + printf("total wait sleep time %0.3f ms.\n", recordSleepTime_.count() / MS_DUARTION); + printf("read from kernel time %0.3f ms.\n", recordKernelReadTime_.count() / MS_DUARTION); +#endif +} + +bool PerfEvents::StartTracking(bool immediately) +{ + if (!prepared_) { + return false; + } + + HLOGD("step: 1. enable event"); + trackingStartTime_ = steady_clock::now(); + if (immediately) { + if (!EnableTracking()) { + HLOGE("PerfEvents::EnableTracking() failed"); + return false; + } + } + + if (recordCallBack_) { + if (!PrepareRecordThread()) { + return false; + } + } + + if (immediately) { + printf("Profiling duration is %.3f seconds.\n", float(timeOut_.count()) / THOUSANDS); + printf("Start Profiling...\n"); + } + + g_trackRunning = true; + if (!CaptureSig()) { + HLOGE("captureSig() failed"); + g_trackRunning = false; + ExitReadRecordBufThread(); + return false; + } + + HLOGD("step: 2. thread loop"); + if (recordCallBack_) { + RecordLoop(); + } else { + StatLoop(); + } + + HLOGD("step: 3. disable event"); + if (!PerfEventsEnable(false)) { + HLOGE("PerfEvents::PerfEventsEnable() failed"); + } + trackingEndTime_ = steady_clock::now(); + + RecoverCaptureSig(); + + if (recordCallBack_) { + WaitRecordThread(); + } + + HLOGD("step: 4. exit"); + return true; +} + +bool PerfEvents::StopTracking(void) +{ + if (g_trackRunning) { + printf("some one called StopTracking\n"); + g_trackRunning = false; + if (trackedCommand_) { + if (trackedCommand_->GetState() == TrackedCommand::State::COMMAND_STARTED) { + trackedCommand_->Stop(); + } + } + if (!PerfEventsEnable(false)) { + HLOGE("StopTracking : PerfEventsEnable(false) failed"); + return false; + } + } + return true; +} + +bool PerfEvents::PauseTracking(void) +{ + if (!startedTracking_) { + return false; + } + return PerfEventsEnable(false); +} + +bool PerfEvents::ResumeTracking(void) +{ + if (!startedTracking_) { + return false; + } + return PerfEventsEnable(true); +} + +bool PerfEvents::EnableTracking() +{ + if (startedTracking_) { + return true; + } + if (!PerfEventsEnable(true)) { + HLOGE("PerfEvents::PerfEventsEnable() failed"); + return false; + } + + if (trackedCommand_) { + // start tracked Command + if (trackedCommand_->GetState() == TrackedCommand::State::COMMAND_WAITING) { + if (!trackedCommand_->StartCommand()) { + int wstatus; + if (!trackedCommand_->WaitCommand(wstatus)) { + trackedCommand_->Stop(); + } + std::string commandName = trackedCommand_->GetCommandName(); + printf("failed to execute command: %zu: %s\n", commandName.size(), commandName.c_str()); + return false; + } + } else if (trackedCommand_->GetState() != TrackedCommand::State::COMMAND_STARTED) { + return false; + } + } + startedTracking_ = true; + return true; +} + +bool PerfEvents::IsTrackRunning() +{ + return g_trackRunning; +} + +void PerfEvents::SetSystemTarget(bool systemTarget) +{ + systemTarget_ = systemTarget; +} + +void PerfEvents::SetCpu(std::vector cpus) +{ + cpus_ = cpus; + + if (!cpus_.empty()) { + if (requestPermission_ > PerfEventParanoid::KERNEL_USER_CPU) { + requestPermission_ = PerfEventParanoid::KERNEL_USER_CPU; + } + } +} + +void PerfEvents::SetPid(std::vector pids) +{ + pids_ = pids; +} + +void PerfEvents::SetTimeOut(float timeOut) +{ + if (timeOut > 0) { + timeOut_ = milliseconds(static_cast(timeOut * THOUSANDS)); + } +} + +void PerfEvents::SetTimeReport(int timeReport) +{ + static constexpr int minMsReportInterval = 100; + if (timeReport < minMsReportInterval && timeReport != 0) { + timeReport = minMsReportInterval; + printf("time report min value is %d.\n", timeReport); + } + + timeReport_ = milliseconds(timeReport); +} + +std::map<__u64, std::string> PerfEvents::GetSupportEvents(perf_type_id type) +{ + if (type == PERF_TYPE_TRACEPOINT) { + LoadTracepointEventTypesFromSystem(); + } + + std::map<__u64, std::string> eventConfigs; + auto configTable = TYPE_CONFIGS.find(type); + if (configTable != TYPE_CONFIGS.end()) { + auto configs = configTable->second; + for (auto config : configs) { + if (type == PERF_TYPE_TRACEPOINT || IsEventSupport(type, (__u64)config.first)) { + eventConfigs.insert(config); + } else { + HLOGD("'%s' not support", config.second.c_str()); + } + } + } + return eventConfigs; +} + +void PerfEvents::LoadTracepointEventTypesFromSystem() +{ + if (PERF_TRACEPOINT_CONFIGS.empty()) { + std::string basePath {"/sys/kernel/tracing/events"}; + if (access(basePath.c_str(), R_OK) != 0) { + basePath = "/sys/kernel/debug/tracing/events"; + } + for (const auto &eventName : GetSubDirs(basePath)) { + std::string eventPath = basePath + "/" + eventName; + for (const auto &concreteEvent : GetSubDirs(eventPath)) { + std::string idPath = eventPath + "/" + concreteEvent + "/id"; + { + std::ifstream ifs {idPath}; + // clang-format off + const std::string idStr = { + std::istreambuf_iterator(ifs), + std::istreambuf_iterator() + }; + // clang-format on + __u64 id {0}; + try { + id = std::stoul(idStr, nullptr); + } catch (...) { + continue; + } + auto typeConfigs = TYPE_CONFIGS.find(PERF_TYPE_TRACEPOINT); + HLOG_ASSERT(typeConfigs != TYPE_CONFIGS.end()); + auto configPair = typeConfigs->second.insert( + std::make_pair(id, eventName + ":" + concreteEvent)); + traceConfigTable.insert(std::make_pair(id, eventName + ":" + concreteEvent)); + ConfigTable::iterator it = configPair.first; + HLOGV("TYPE_CONFIGS add %llu:%s in %zu", it->first, it->second.c_str(), + typeConfigs->second.size()); + } + } + } + } +} + +void PerfEvents::SetVerboseReport(bool verboseReport) +{ + verboseReport_ = verboseReport; +} + +void PerfEvents::SetSampleFrequency(unsigned int frequency) +{ + if (frequency > 0) { + sampleFreq_ = frequency; + } +} + +void PerfEvents::SetSamplePeriod(unsigned int period) +{ + if (period > 0) { + samplePeriod_ = period; + } +} + +void PerfEvents::SetMmapPages(size_t mmapPages) +{ + mmapPages_ = mmapPages; +} + +void PerfEvents::SetSampleStackType(SampleStackType type) +{ + sampleStackType_ = type; +} + +void PerfEvents::SetDwarfSampleStackSize(uint32_t stackSize) +{ + HLOGD("request stack size is %u", stackSize); + dwarfSampleStackSize_ = stackSize; +} + +bool PerfEvents::PerfEventsEnable(bool enable) +{ + HLOGV("%s", std::to_string(enable).c_str()); + for (const auto &eventGroupItem : eventGroupItem_) { + for (const auto &eventItem : eventGroupItem.eventItems) { + for (const auto &fdItem : eventItem.fdItems) { + int result = + ioctl(fdItem.fd, enable ? PERF_EVENT_IOC_ENABLE : PERF_EVENT_IOC_DISABLE, 0); + if (result < 0) { + printf("Cannot '%s' perf fd! type config name: '%s:%s'\n", + enable ? "enable" : "disable", eventItem.typeName.c_str(), + eventItem.configName.c_str()); + return false; + } + } + } + } + return true; +} + +void PerfEvents::SetStatCallBack(StatCallBack reportCallBack) +{ + reportCallBack_ = reportCallBack; +} +void PerfEvents::SetRecordCallBack(RecordCallBack recordCallBack) +{ + recordCallBack_ = recordCallBack; +} + +inline void PerfEvents::PutAllCpus() +{ + int cpuConfigs = sysconf(_SC_NPROCESSORS_CONF); + for (int i = 0; i < cpuConfigs; i++) { + cpus_.push_back(i); // put all cpu + } +} + +bool PerfEvents::PrepareFdEvents(void) +{ + HLOGV("enter"); + /* + https://man7.org/linux/man-pages/man2/perf_event_open.2.html + pid == 0 and cpu == -1 + This measures the calling process/thread on any CPU. + + pid == 0 and cpu >= 0 + This measures the calling process/thread only when running + on the specified CPU. + + pid > 0 and cpu == -1 + This measures the specified process/thread on any CPU. + + pid > 0 and cpu >= 0 + This measures the specified process/thread only when + running on the specified CPU. + + pid == -1 and cpu >= 0 + This measures all processes/threads on the specified CPU. + This requires CAP_PERFMON (since Linux 5.8) or + CAP_SYS_ADMIN capability or a + /proc/sys/kernel/perf_event_paranoid value of less than 1. + + pid == -1 and cpu == -1 + This setting is invalid and will return an error. + */ + if (systemTarget_) { + pids_.clear(); + pids_.push_back(-1); + + if (cpus_.empty()) { + PutAllCpus(); + } + } else { + if (trackedCommand_) { + pids_.push_back(trackedCommand_->GetChildPid()); + } + if (pids_.empty()) { + pids_.push_back(0); // no pid means use 0 as self pid + } + if (cpus_.empty()) { + // new review . if perfEventParanoid_ < CPU, how should be CreateMmap work? + if (perfEventParanoid_ <= PerfEventParanoid::KERNEL_USER_CPU) { + // PERF_EVENT_IOC_SET_OUTPUT doesn't support using -1 as all cpu + PutAllCpus(); + } else { + cpus_.push_back(-1); // no cpu as all cpu + } + } + } + + // print info tell user which cpu and process we will select. + if (pids_.size() == 1 && pids_[0] == -1) { + HLOGI("target process: system scope \n"); + } else { + HLOGI("target process: %zu (%s)\n", pids_.size(), + (pids_[0] == 0) ? std::to_string(gettid()).c_str() : VectorToString(pids_).c_str()); + } + if (cpus_.size() == 1 && cpus_[0] == -1) { + HLOGI("target cpus: %ld \n", sysconf(_SC_NPROCESSORS_CONF)); + } else { + HLOGI("target cpus: %zu / %ld (%s)\n", cpus_.size(), sysconf(_SC_NPROCESSORS_CONF), + VectorToString(cpus_).c_str()); + } + + return true; +} + +bool PerfEvents::CreateFdEvents(void) +{ + HLOGV("enter"); + + // must be some events , or will failed + if (eventGroupItem_.empty()) { + printf("no event select.\n"); + return false; + } + + // create each fd by cpu and process user select + /* + https://man7.org/linux/man-pages/man2/perf_event_open.2.html + + (A single event on its own is created with group_fd = -1 and is + considered to be a group with only 1 member.) + */ + // Even if there is only one event, it is counted as a group. + + uint fdNumber = 0; + uint eventNumber = 0; + uint groupNumber = 0; + for (auto &eventGroupItem : eventGroupItem_) { + /* + Explain what is the configuration of the group: + Suppose we have 2 Event, 2 PID, and 3 CPU settings + According to verification, + Group's fd requires the pid to be the same as the cpu, the only difference is event + In other words, if you want to bind E1 and E2 to the same group + That can only be like this: + + event E1 pid P1 cpu C1 [Group 1] + event E1 pid P1 cpu C2 [Group 2] + event E1 pid P1 cpu C3 [Group 3] + + event E1 pid P2 cpu C1 [Group 4] + event E1 pid P2 cpu C2 [Group 5] + event E1 pid P2 cpu C3 [Group 6] + + event E2 pid P1 cpu C1 [Group 1] + event E2 pid P1 cpu C2 [Group 2] + event E2 pid P1 cpu C3 [Group 3] + + event E2 pid P2 cpu C1 [Group 4] + event E2 pid P2 cpu C2 [Group 5] + event E2 pid P2 cpu C3 [Group 6] + */ + HLOGV("group %2u. eventGroupItem leader: '%s':", groupNumber++, + eventGroupItem.eventItems[0].configName.c_str()); + + int groupFdCache[cpus_.size()][pids_.size()]; + for (size_t i = 0; i < cpus_.size(); i++) { // each cpu + for (size_t j = 0; j < pids_.size(); j++) { // each pid + // The leader is created first, with group_fd = -1. + groupFdCache[i][j] = -1; + } + } + + uint eventIndex = 0; + for (auto &eventItem : eventGroupItem.eventItems) { + HLOGV(" - event %2u. eventName: '%s:%s'", eventIndex++, eventItem.typeName.c_str(), + eventItem.configName.c_str()); + + for (size_t icpu = 0; icpu < cpus_.size(); icpu++) { // each cpu + for (size_t ipid = 0; ipid < pids_.size(); ipid++) { // each pid + // one fd event group must match same cpu and same pid config (event can be + // different) + // clang-format off + UniqueFd fd = Open(eventItem.attr, pids_[ipid], cpus_[icpu], + groupFdCache[icpu][ipid], 0); + // clang-format on + if (fd < 0) { + if (errno == ESRCH) { + if (verboseReport_) { + printf("pid %d does not exist.\n", pids_[ipid]); + } + HLOGE("pid %d does not exist.\n", pids_[ipid]); + continue; + } else { + // clang-format off + if (verboseReport_) { + char errInfo[ERRINFOLEN] = { 0 }; + strerror_r(errno, errInfo, ERRINFOLEN); + printf("%s event is not supported by the kernel on cpu %d. reason: %d:%s\n", + eventItem.configName.c_str(), cpus_[icpu], errno, errInfo); + } + char errInfo[ERRINFOLEN] = { 0 }; + strerror_r(errno, errInfo, ERRINFOLEN); + HLOGE("%s event is not supported by the kernel on cpu %d. reason: %d:%s\n", + eventItem.configName.c_str(), cpus_[icpu], errno, errInfo); + // clang-format on + break; // jump to next cpu + } + } + // after open successed , fill the result + // make a new FdItem + FdItem &fdItem = eventItem.fdItems.emplace_back(); + fdItem.fd = move(fd); + fdItem.cpu = cpus_[icpu]; + fdItem.pid = pids_[ipid]; + fdNumber++; + + // if sampling, mmap ring buffer + if (recordCallBack_) { + CreateMmap(fdItem, eventItem.attr); + } + // update group leader + if (groupFdCache[icpu][ipid] == -1) { + groupFdCache[icpu][ipid] = fd.Get(); + } + } + } + eventNumber++; + } + } + + if (fdNumber == 0) { + HLOGE("open %d fd for %d events", fdNumber, eventNumber); + return false; + } + + HLOGD("will try read %u events from %u fd (%zu groups):", eventNumber, fdNumber, + eventGroupItem_.size()); + + return true; +} + +bool PerfEvents::StatReport(const __u64 &durationInSec) +{ + read_format_no_group readNoGroupValue; + + // only need read when need report + HLOGM("eventGroupItem_:%zu", eventGroupItem_.size()); + __u64 groupId = 0; + // clear countEvents data + countEvents_.clear(); + for (const auto &eventGroupItem : eventGroupItem_) { + HLOGM("eventItems:%zu", eventGroupItem.eventItems.size()); + groupId++; + for (const auto &eventItem : eventGroupItem.eventItems) { + // count event info together (every cpu , every pid) + std::string configName = ""; + if (eventItem.attr.exclude_kernel) { + configName = eventItem.configName + ":u"; + } else if (eventItem.attr.exclude_user) { + configName = eventItem.configName + ":k"; + } else { + configName = eventItem.configName; + } + if (countEvents_.count(configName) == 0) { + auto countEvent = make_unique(CountEvent {}); + countEvents_[configName] = std::move(countEvent); + countEvents_[configName]->userOnly = eventItem.attr.exclude_kernel; + countEvents_[configName]->kernelOnly = eventItem.attr.exclude_user; + } + std::unique_ptr &countEvent = countEvents_[configName]; + HLOGM("eventItem.fdItems:%zu", eventItem.fdItems.size()); + for (const auto &fditem : eventItem.fdItems) { + if (read(fditem.fd, &readNoGroupValue, sizeof(readNoGroupValue)) > 0) { + countEvent->eventCount += readNoGroupValue.value; + countEvent->time_enabled += readNoGroupValue.time_enabled; + countEvent->time_running += readNoGroupValue.time_running; + countEvent->id = groupId; + if (durationInSec != 0) { + countEvent->used_cpus = + (countEvent->eventCount / 1e9) / (durationInSec / THOUSANDS); + } + if (verboseReport_) { + printf("%s id:%llu(c%d:p%d) time_enabled:%llu time_running:%llu " + "value:%llu\n", + eventItem.configName.c_str(), readNoGroupValue.id, fditem.cpu, + fditem.pid, readNoGroupValue.time_enabled, + readNoGroupValue.time_running, readNoGroupValue.value); + } + } else { + printf("read failed from event '%s'\n", eventItem.configName.c_str()); + } + } + } + } + + reportCallBack_(countEvents_); + + return true; +} + +bool PerfEvents::CreateMmap(const FdItem &item, const perf_event_attr &attr) +{ + auto it = cpuMmap_.find(item.cpu); + if (it == cpuMmap_.end()) { + void *rbuf = mmap(nullptr, (1 + mmapPages_) * pageSize_, PROT_READ | PROT_WRITE, MAP_SHARED, + item.fd.Get(), 0); + if (rbuf == MMAP_FAILED) { + perror("Fail to call mmap \n"); + return false; + } + MmapFd mmapItem; + mmapItem.fd = item.fd.Get(); + mmapItem.mmapPage = reinterpret_cast(rbuf); + mmapItem.buf = reinterpret_cast(rbuf) + pageSize_; + mmapItem.bufSize = mmapPages_ * pageSize_; + mmapItem.attr = &attr; + mmapItem.posCallChain = GetCallChainPosInSampleRecord(attr); + + cpuMmap_[item.cpu] = mmapItem; + pollFds_.emplace_back(pollfd {mmapItem.fd, POLLIN, 0}); + HLOGD("CreateMmap success cpu %d fd %d", item.cpu, mmapItem.fd); + } else { + const MmapFd &mmapItem = it->second; + int rc = ioctl(item.fd.Get(), PERF_EVENT_IOC_SET_OUTPUT, mmapItem.fd); + if (rc != 0) { + HLOGEP("ioctl PERF_EVENT_IOC_SET_OUTPUT (%d -> %d) ", item.fd.Get(), mmapItem.fd); + perror("failed to share mapped buffer\n"); + return false; + } + } + return true; +} + +std::vector PerfEvents::GetAttrWithId() const +{ + std::vector result; + HLOGV("eventGroupItem_ %zu :", eventGroupItem_.size()); + + for (const auto &eventGroupItem : eventGroupItem_) { + HLOGV(" eventItems %zu eventItems:", eventGroupItem.eventItems.size()); + for (const auto &eventItem : eventGroupItem.eventItems) { + AttrWithId attrId; + attrId.attr = eventItem.attr; + attrId.name = eventItem.configName; + HLOGV(" fdItems %zu fdItems:", eventItem.fdItems.size()); + for (const auto &fdItem : eventItem.fdItems) { + auto &id = attrId.ids.emplace_back(fdItem.GetPrefId()); + HLOGV(" eventItem.fdItems GetPrefId %" PRIu64 "", id); + } + result.emplace_back(attrId); + } + } + return result; +} + +size_t PerfEvents::CalcBufferSize() +{ + size_t bufferSize = MAX_BUFFER_SIZE; + if (!systemTarget_) { + // suppose ring buffer is 4 times as much as mmap + static constexpr int TIMES = 4; + bufferSize = cpuMmap_.size() * mmapPages_ * pageSize_ * TIMES; + if (bufferSize < MIN_BUFFER_SIZE) { + bufferSize = MIN_BUFFER_SIZE; + } else if (bufferSize > MAX_BUFFER_SIZE) { + bufferSize = MAX_BUFFER_SIZE; + } + } + HLOGD("CalcBufferSize return %zu", bufferSize); + return bufferSize; +} + +inline bool PerfEvents::IsRecordInMmap() +{ + if (pollFds_.size() > 0) { + if (poll((struct pollfd *)pollFds_.data(), pollFds_.size(), pollTimeOut_) <= 0) { + // time out try again + return false; + } + } + return true; +} + +static bool CompareRecordTime(const PerfEvents::MmapFd *left, const PerfEvents::MmapFd *right) +{ + return left->timestamp > right->timestamp; +} + +void PerfEvents::ReadRecordsFromMmaps() +{ +#ifdef HIPERF_DEBUG_TIME + const auto readKenelStartTime = steady_clock::now(); +#endif + // get readable mmap at this time + for (auto &it : cpuMmap_) { + ssize_t dataSize = it.second.mmapPage->data_head - it.second.mmapPage->data_tail; + __sync_synchronize(); // this same as rmb in gcc, after reading mmapPage->data_head + if (dataSize <= 0) { + continue; + } + it.second.dataSize = dataSize; + MmapRecordHeap_.push_back(&(it.second)); + } + if (MmapRecordHeap_.empty()) { + return; + } + + if (MmapRecordHeap_.size() > 1) { + for (auto &it : MmapRecordHeap_) { + GetRecordFromMmap(*it); + } + std::make_heap(MmapRecordHeap_.begin(), MmapRecordHeap_.end(), CompareRecordTime); + + size_t heapSize = MmapRecordHeap_.size(); + while (heapSize > 1) { + std::pop_heap(MmapRecordHeap_.begin(), MmapRecordHeap_.begin() + heapSize, + CompareRecordTime); + MoveRecordToBuf(*MmapRecordHeap_[heapSize - 1]); + if (GetRecordFromMmap(*MmapRecordHeap_[heapSize - 1])) { + std::push_heap(MmapRecordHeap_.begin(), MmapRecordHeap_.begin() + heapSize, + CompareRecordTime); + } else { + heapSize--; + } + } + } + + while (GetRecordFromMmap(*MmapRecordHeap_.front())) { + MoveRecordToBuf(*MmapRecordHeap_.front()); + } + MmapRecordHeap_.clear(); + cvRecordBuf_.notify_one(); + +#ifdef HIPERF_DEBUG_TIME + recordKernelReadTime_ += duration_cast(steady_clock::now() - readKenelStartTime); +#endif +} + +bool PerfEvents::GetRecordFromMmap(MmapFd &mmap) +{ + if (mmap.dataSize <= 0) { + return false; + } + + GetRecordFieldFromMmap(mmap, &(mmap.header), mmap.mmapPage->data_tail, sizeof(mmap.header)); + if (mmap.header.type != PERF_RECORD_SAMPLE) { + mmap.timestamp = 0; + return true; + } + // in PERF_RECORD_SAMPLE : header + u64 sample_id + u64 ip + u32 pid + u32 tid + u64 time + constexpr size_t timePos = sizeof(perf_event_header) + sizeof(uint64_t) + sizeof(uint64_t) + + sizeof(uint32_t) + sizeof(uint32_t); + GetRecordFieldFromMmap(mmap, &(mmap.timestamp), mmap.mmapPage->data_tail + timePos, + sizeof(mmap.timestamp)); + return true; +} + +void PerfEvents::GetRecordFieldFromMmap(MmapFd &mmap, void *dest, size_t pos, size_t size) +{ + pos = pos % mmap.bufSize; + size_t tailSize = mmap.bufSize - pos; + size_t copySize = std::min(size, tailSize); + if (memcpy_s(dest, copySize, mmap.buf + pos, copySize) != 0) { + HLOGEP("memcpy_s %p to %p failed. size %zd", mmap.buf + pos, dest, copySize); + } + if (copySize < size) { + size -= copySize; + if (memcpy_s(static_cast(dest) + copySize, size, mmap.buf, size) != 0) { + HLOGEP("memcpy_s %p to %p failed. size %zd", mmap.buf, + static_cast(dest) + copySize, size); + } + } +} + +size_t PerfEvents::GetCallChainPosInSampleRecord(const perf_event_attr &attr) +{ + // reference struct PerfRecordSampleData + int fixedFieldNumber = __builtin_popcountll( + attr.sample_type & (PERF_SAMPLE_IDENTIFIER | PERF_SAMPLE_IP | PERF_SAMPLE_TID | + PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | PERF_SAMPLE_ID | + PERF_SAMPLE_STREAM_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)); + size_t pos = sizeof(perf_event_header) + sizeof(uint64_t) * fixedFieldNumber; + if (attr.sample_type & PERF_SAMPLE_READ) { + pos += sizeof(read_format); + } + return pos; +} + +size_t PerfEvents::GetStackSizePosInSampleRecord(MmapFd &mmap) +{ + size_t pos = mmap.posCallChain; + if (mmap.attr->sample_type & PERF_SAMPLE_CALLCHAIN) { + uint64_t nr = 0; + GetRecordFieldFromMmap(mmap, &nr, mmap.mmapPage->data_tail + pos, sizeof(nr)); + pos += (sizeof(nr) + nr * sizeof(uint64_t)); + } + if (mmap.attr->sample_type & PERF_SAMPLE_RAW) { + uint32_t raw_size = 0; + GetRecordFieldFromMmap(mmap, &raw_size, mmap.mmapPage->data_tail + pos, sizeof(raw_size)); + pos += (sizeof(raw_size) + raw_size); + } + if (mmap.attr->sample_type & PERF_SAMPLE_BRANCH_STACK) { + uint64_t bnr = 0; + GetRecordFieldFromMmap(mmap, &bnr, mmap.mmapPage->data_tail + pos, sizeof(bnr)); + pos += (sizeof(bnr) + bnr * sizeof(perf_branch_entry)); + } + if (mmap.attr->sample_type & PERF_SAMPLE_REGS_USER) { + uint64_t user_abi = 0; + GetRecordFieldFromMmap(mmap, &user_abi, mmap.mmapPage->data_tail + pos, sizeof(user_abi)); + pos += sizeof(user_abi); + if (user_abi > 0) { + uint64_t reg_nr = __builtin_popcountll(mmap.attr->sample_regs_user); + pos += reg_nr * sizeof(uint64_t); + } + } + return pos; +} + +bool PerfEvents::CutStackAndMove(MmapFd &mmap) +{ + constexpr uint32_t alignSize = 64; + if (!(mmap.attr->sample_type & PERF_SAMPLE_STACK_USER)) { + return false; + } + size_t stackSizePos = GetStackSizePosInSampleRecord(mmap); + uint64_t stackSize = 0; + GetRecordFieldFromMmap(mmap, &stackSize, mmap.mmapPage->data_tail + stackSizePos, + sizeof(stackSize)); + if (stackSize == 0) { + return false; + } + size_t dynSizePos = stackSizePos + sizeof(uint64_t) + stackSize; + uint64_t dynSize = 0; + GetRecordFieldFromMmap(mmap, &dynSize, mmap.mmapPage->data_tail + dynSizePos, sizeof(dynSize)); + uint64_t newStackSize = std::min(ALIGN(dynSize, alignSize), stackSize); + if (newStackSize >= stackSize) { + return false; + } + HLOGM("stackSize %" PRIx64 " dynSize %" PRIx64 " newStackSize %" PRIx64 "\n", stackSize, dynSize, newStackSize); + // move and cut stack_data + // mmap: |<+++copy1+++>|<++++++copy2++++++>|<---------------cut--------------->|<+++copy3+++>| + // ^ ^ ^ ^ + // new_header stackSizePos dynSizePos + uint16_t recordSize = mmap.header.size; + mmap.header.size -= stackSize - newStackSize; // reduce the stack size + uint8_t *buf = recordBuf_->AllocForWrite(mmap.header.size); + // copy1: new_header + if (memcpy_s(buf, sizeof(perf_event_header), &(mmap.header), sizeof(perf_event_header)) != 0) { + HLOGEP("memcpy_s %p to %p failed. size %zd", &(mmap.header), buf, + sizeof(perf_event_header)); + } + size_t copyPos = sizeof(perf_event_header); + size_t copySize = stackSizePos - sizeof(perf_event_header) + sizeof(stackSize) + newStackSize; + // copy2: copy stack_size, data[stack_size], + GetRecordFieldFromMmap(mmap, buf + copyPos, mmap.mmapPage->data_tail + copyPos, copySize); + copyPos += copySize; + // copy3: copy dyn_size + GetRecordFieldFromMmap(mmap, buf + copyPos, mmap.mmapPage->data_tail + dynSizePos, + recordSize - dynSizePos); + // update stack_size + if (memcpy_s(buf + stackSizePos, sizeof(stackSize), &(newStackSize), sizeof(newStackSize)) != 0) { + HLOGEP("memcpy_s %p to %p failed. size %zd", &(newStackSize), buf + stackSizePos, sizeof(newStackSize)); + } + recordBuf_->EndWrite(); + __sync_synchronize(); + mmap.mmapPage->data_tail += recordSize; + mmap.dataSize -= recordSize; + return true; +} + +void PerfEvents::MoveRecordToBuf(MmapFd &mmap) +{ + uint8_t *buf = nullptr; + if (mmap.header.type == PERF_RECORD_SAMPLE) { + if (recordBuf_->GetFreeSize() <= BUFFER_CRITICAL_LEVEL) { + lostSamples_++; + HLOGD("BUFFER_CRITICAL_LEVEL: lost sample record"); + goto RETURN; + } + if (CutStackAndMove(mmap)) { + return; + } + } else if (mmap.header.type == PERF_RECORD_LOST) { + // in PERF_RECORD_LOST : header + u64 id + u64 lost + constexpr size_t lostPos = sizeof(perf_event_header) + sizeof(uint64_t); + uint64_t lost = 0; + GetRecordFieldFromMmap(mmap, &lost, mmap.mmapPage->data_tail + lostPos, sizeof(lost)); + lostSamples_ += lost; + HLOGD("PERF_RECORD_LOST: lost sample record"); + goto RETURN; + } + + if ((buf = recordBuf_->AllocForWrite(mmap.header.size)) == nullptr) { + // this record type must be Non-Sample + lostNonSamples_++; + HLOGD("alloc buffer failed: lost non-sample record"); + goto RETURN; + } + + GetRecordFieldFromMmap(mmap, buf, mmap.mmapPage->data_tail, mmap.header.size); + recordBuf_->EndWrite(); +RETURN: + __sync_synchronize(); + mmap.mmapPage->data_tail += mmap.header.size; + mmap.dataSize -= mmap.header.size; +} + +void PerfEvents::ReadRecordFromBuf() +{ + HLOGV("enter"); + + const perf_event_attr *attr = GetDefaultAttr(); + uint8_t *p = nullptr; + + while (readRecordThreadRunning_) { + { + std::unique_lock lk(mtxRrecordBuf_); + cvRecordBuf_.wait(lk); + } + while ((p = recordBuf_->GetReadData()) != nullptr) { + uint32_t *type = reinterpret_cast(p); +#ifdef HIPERF_DEBUG_TIME + const auto readingStartTime_ = steady_clock::now(); +#endif +#if !HIDEBUG_SKIP_CALLBACK + recordCallBack_(GetPerfEventRecord(*type, p, *attr)); +#endif + recordEventCount_++; +#ifdef HIPERF_DEBUG_TIME + recordCallBackTime_ += + duration_cast(steady_clock::now() - readingStartTime_); +#endif + recordBuf_->EndRead(); + } + } + HLOGD("exit because trackStoped"); + + // read the data left over in buffer + while ((p = recordBuf_->GetReadData()) != nullptr) { + uint32_t *type = reinterpret_cast(p); +#ifdef HIPERF_DEBUG_TIME + const auto readingStartTime_ = steady_clock::now(); +#endif +#if !HIDEBUG_SKIP_CALLBACK + recordCallBack_(GetPerfEventRecord(*type, p, *attr)); +#endif + recordEventCount_++; +#ifdef HIPERF_DEBUG_TIME + recordCallBackTime_ += duration_cast(steady_clock::now() - readingStartTime_); +#endif + recordBuf_->EndRead(); + } + HLOGD("read all records from buffer"); +} + +bool PerfEvents::HaveTargetsExit(const std::chrono::steady_clock::time_point &startTime) +{ + if (systemTarget_) { + return false; + } + if (trackedCommand_) { + if (trackedCommand_->GetState() < TrackedCommand::State::COMMAND_STARTED) { + return false; // not start yet + } + int wstatus; + if (trackedCommand_->WaitCommand(wstatus)) { + milliseconds usedMsTick = duration_cast(steady_clock::now() - startTime); + printf("tracked command(%s) has exited (total %" PRId64 " ms)\n", + trackedCommand_->GetCommandName().c_str(), (uint64_t)usedMsTick.count()); + return true; + } + return false; + } + + for (auto it = pids_.begin(); it != pids_.end();) { + int rc = kill(*it, 0); + if (rc == -1 or rc == ESRCH) { + it = pids_.erase(it); + } else { + ++it; + } + } + if (pids_.empty()) { + milliseconds usedMsTick = duration_cast(steady_clock::now() - startTime); + printf("tracked processes have exited (total %" PRId64 " ms)\n", (uint64_t)usedMsTick.count()); + return true; + } + return false; +} + +void PerfEvents::RecordLoop() +{ + HLOGV("enter"); + + // calc the time + const auto startTime = steady_clock::now(); + const auto endTime = startTime + timeOut_; + milliseconds usedTimeMsTick {}; + + while (g_trackRunning) { + // time check point + const auto thisTime = steady_clock::now(); + + if (IsRecordInMmap()) { + ReadRecordsFromMmaps(); + } + + if (HaveTargetsExit(startTime)) { + break; + } + + if (thisTime >= endTime) { + usedTimeMsTick = duration_cast(thisTime - startTime); + printf("Timeout exit (total %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); + if (trackedCommand_) { + trackedCommand_->Stop(); + } + break; + } + } + ReadRecordsFromMmaps(); + + if (!g_trackRunning) { + // for user interrupt situation, print time statistic + usedTimeMsTick = duration_cast(steady_clock::now() - startTime); + printf("User interrupt exit (total %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); + } +} + +void PerfEvents::StatLoop() +{ + HLOGV("enter"); + + // calc the time + const auto startTime = steady_clock::now(); + const auto endTime = startTime + timeOut_; + auto nextReportTime = startTime + timeReport_; + milliseconds usedTimeMsTick {}; + __u64 durationInSec = 0; + int64_t thesholdTimeInMs = 2 * HUNDREDS; + + while (g_trackRunning) { + // time check point + const auto thisTime = steady_clock::now(); + if (timeReport_ != milliseconds::zero()) { + // stat cmd + if (thisTime >= nextReportTime) { + // only for log or debug? + usedTimeMsTick = duration_cast(thisTime - startTime); + durationInSec = usedTimeMsTick.count(); + auto lefTimeMsTick = duration_cast(endTime - thisTime); + printf("\nReport at %" PRId64 " ms (%" PRId64 " ms left):\n", + (uint64_t)usedTimeMsTick.count(), (uint64_t)lefTimeMsTick.count()); + // end of comments + nextReportTime += timeReport_; + StatReport(durationInSec); + } + } + + if (HaveTargetsExit(startTime)) { + break; + } + + if (thisTime >= endTime) { + usedTimeMsTick = duration_cast(thisTime - startTime); + durationInSec = usedTimeMsTick.count(); + printf("Timeout exit (total %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); + if (trackedCommand_) { + trackedCommand_->Stop(); + } + break; + } + + // lefttime > 200ms sleep 100ms, else sleep 200us + uint64_t defaultSleepUs = 2 * HUNDREDS; // 200us + if (timeReport_ == milliseconds::zero() + && (timeOut_.count() * THOUSANDS) > thesholdTimeInMs) { + milliseconds leftTimeMsTmp = duration_cast(endTime - thisTime); + if (leftTimeMsTmp.count() > thesholdTimeInMs) { + defaultSleepUs = HUNDREDS * THOUSANDS; // 100ms + } + } + std::this_thread::sleep_for(microseconds(defaultSleepUs)); + } + + if (!g_trackRunning) { + // for user interrupt situation, print time statistic + usedTimeMsTick = duration_cast(steady_clock::now() - startTime); + printf("User interrupt exit (total %" PRId64 " ms)\n", (uint64_t)usedTimeMsTick.count()); + } + + if (timeReport_ == milliseconds::zero()) { + StatReport(durationInSec); + } +} + +const std::string PerfEvents::GetTypeName(perf_type_id type_id) +{ + auto it = PERF_TYPES.find(type_id); + if (it != PERF_TYPES.end()) { + return it->second; + } else { + return ""; + } +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_format.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_format.cpp new file mode 100644 index 0000000..a860dbd --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_format.cpp @@ -0,0 +1,488 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "perf_file_format.h" + +#include "debug_logger.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +std::string PerfFileSection::GetFeatureName(FEATURE featureId) +{ + unsigned int index = static_cast(featureId); + if (featureId >= FEATURE::HIPERF_FIRST_FEATURE) { + index -= static_cast(FEATURE::HIPERF_FIRST_FEATURE); + if (index >= extFeatureNames.size()) { + return featureNames[0]; + } + return extFeatureNames[index]; + } else { + if (index >= featureNames.size()) { + return featureNames[0]; + } + return featureNames[index]; + } +} + +// for read +void PerfFileSection::Init(const char *buffer, size_t maxSize) +{ + rBuffer_ = buffer; + maxSize_ = maxSize; + offset_ = 0; +} + +// for write +void PerfFileSection::Init(char *buffer, size_t maxSize) +{ + wBuffer_ = buffer; + maxSize_ = maxSize; + offset_ = 0; +} + +bool PerfFileSection::Write(uint32_t u32) +{ + uint32_t value = u32; + return Write((char *)&value, sizeof(uint32_t)); +} + +bool PerfFileSection::Write(uint64_t u64) +{ + uint64_t value = u64; + return Write((char *)&value, sizeof(uint64_t)); +} + +bool PerfFileSection::Write(const std::string &str) +{ + if (Write((uint32_t)str.size() + 1)) { // include the ending \0 + return Write(str.c_str(), str.size(), str.size() + 1); + } else { + return false; + } +} + +bool PerfFileSection::Write(const char *buf, size_t size) +{ + return Write(buf, size, size); +} + +bool PerfFileSection::Write(const char *buf, size_t size, size_t max) +{ + if (offset_ + size > maxSize_) { + HLOGE("write out of size!!! offset_ %zu size %zu max %zu", offset_, size, maxSize_); + return false; + } + if (offset_ + max > maxSize_) { + HLOGE("write out of size!!! offset_ %zu size %zu max %zu", offset_, size, maxSize_); + return false; + } + std::copy(buf, buf + size, wBuffer_ + offset_); + if (size >= max) { + offset_ += size; + } else { + offset_ += max; + } + return true; +} + +bool PerfFileSection::Read(uint32_t &value) +{ + static_assert(sizeof(uint32_t) == 4); + return Read((char *)&value, sizeof(uint32_t)); +} + +bool PerfFileSection::Read(uint64_t &value) +{ + static_assert(sizeof(uint64_t) == 8); + + return Read((char *)&value, sizeof(uint64_t)); +} + +bool PerfFileSection::Read(std::string &value) +{ + uint32_t size = 0; + if (!Read(size)) { + return false; + } + // if size large than buf size or 0 size ? + // don't assert for fuzz test + if (size == 0 or size > maxSize_) { + return false; + } + char buf[size]; + if (!Read(buf, size)) { + return false; + } + if (buf[size - 1] != 0) { + return false; + } + value = buf; + HLOGDUMMY("Read String size %u buf : %s", size, value.c_str()); + return true; +} +void PerfFileSection::Skip(size_t size) +{ + offset_ += size; +} + +bool PerfFileSection::Read(char *buf, size_t size) +{ + HLOG_ASSERT(buf != nullptr); + if (size == 0) { + HLOGE("read zero size!!! offset_ %zu size %zu max %zu", offset_, size, maxSize_); + return false; + } else if (offset_ + size > maxSize_) { + HLOGE("read out of size!!! offset_ %zu size %zu max %zu", offset_, size, maxSize_); + if (memset_s(buf, size, 0, size) != EOK) { // make sure the content return is 0 when failed + HLOGE("memset_s failed in PerfFileSection::Read"); + return false; + } + return false; + } + HLOGD("PerfFileSection::Read offset_ %zu size %zu maxSize_ %zu", offset_, size, maxSize_); + std::copy((rBuffer_ + offset_), (rBuffer_ + offset_ + size), buf); + offset_ += size; + HLOGDUMMY("after read offset_ %zx size %zu buf %x", offset_, size, buf[0]); + return true; +} + +uint32_t PerfFileSection::SizeOf(std::string &string) +{ + return sizeof(uint32_t) + string.size() + 1; /* '\0' */ +} + +PerfFileSectionString::PerfFileSectionString(FEATURE id, const char *buf, size_t size) + : PerfFileSection(id) +{ + Init(buf, size); + if (!Read(stdString_)) { + return; // or throw ... + } +} + +PerfFileSectionString::PerfFileSectionString(FEATURE id, const std::string &charString) + : PerfFileSection(id) +{ + stdString_ = charString; +} + +bool PerfFileSectionString::GetBinary(char *buf, size_t size) +{ + if (size < GetSize()) { + return false; + } + + Init(buf, size); + Write(stdString_); + return true; +} + +size_t PerfFileSectionString::GetSize() +{ + return SizeOf(stdString_); +} + +const std::string PerfFileSectionString::toString() const +{ + return stdString_; +} + +size_t PerfFileSectionSymbolsFiles::GetSize() +{ + size_t size = 0; + + size += sizeof(uint32_t); // how many SymbolFileStruct + for (auto &symbolFileStruct : symbolFileStructs_) { + size += SizeOf(symbolFileStruct.filePath_); + size += sizeof(symbolFileStruct.symbolType_); + size += sizeof(symbolFileStruct.textExecVaddr_); + size += sizeof(symbolFileStruct.textExecVaddrFileOffset_); + size += SizeOf(symbolFileStruct.buildId_); + + size += sizeof(uint32_t); // how many SymbolStruct + for (auto &symbolStruct : symbolFileStruct.symbolStructs_) { + size += sizeof(symbolStruct.vaddr_); + size += sizeof(symbolStruct.len_); + size += SizeOf(symbolStruct.symbolName_); + } + } + return size; +} + +PerfFileSectionSymbolsFiles::PerfFileSectionSymbolsFiles(FEATURE id, const char *buf, size_t size) + : PerfFileSection(id) +{ + Init(buf, size); + uint32_t symbolFileNumber = 0; + if (!Read(symbolFileNumber)) { + HLOGE(" symbolFileNumber read failed"); + return; + } else if (symbolFileNumber > MAX_SYMBOLS_FILE_NUMBER) { + HLOGE(" symbolFileNumber %u too large", symbolFileNumber); + return; + } else { + HLOGV(" symbolFileNumber %u", symbolFileNumber); + } + + for (uint32_t i = symbolFileNumber; i > 0; i--) { + auto &symbolFileStruct = symbolFileStructs_.emplace_back(); + + Read(symbolFileStruct.filePath_); + HLOGV(" symbolFileStruct.filePath_ %s", symbolFileStruct.filePath_.c_str()); + + Read(symbolFileStruct.symbolType_); + Read(symbolFileStruct.textExecVaddr_); + Read(symbolFileStruct.textExecVaddrFileOffset_); + Read(symbolFileStruct.buildId_); + + uint32_t symbolsNumber = 0; + if (!Read(symbolsNumber)) { + HLOGE(" symbols read failed"); + return; + } else if (symbolsNumber > MAX_SYMBOLS_NUMBER) { + HLOGE(" symbols %u too large", symbolsNumber); + return; + } else { + HLOGV(" symbols %u", symbolsNumber); + } + for (; symbolsNumber > 0; symbolsNumber--) { + auto &symbolStruct = symbolFileStruct.symbolStructs_.emplace_back(); + Read(symbolStruct.vaddr_); + Read(symbolStruct.len_); + Read(symbolStruct.symbolName_); + } + HLOGV(" %zu SymbolStruct read.", symbolFileStruct.symbolStructs_.size()); + } + HLOGV(" %zu SymbolFileStruct read.", symbolFileStructs_.size()); +} + +bool PerfFileSectionSymbolsFiles::GetBinary(char *buf, size_t size) +{ + HLOGV("PerfFileSectionSymbolsFiles get buffer size %zu.", size); + HLOG_ASSERT(size >= GetSize()); + + Init(buf, size); + if (!Write((uint32_t)symbolFileStructs_.size())) { + HLOGE("PerfFileSectionSymbolsFiles write failed with %zu.", symbolFileStructs_.size()); + return false; + } + for (auto &symbolFileStruct : symbolFileStructs_) { + Write(symbolFileStruct.filePath_); + Write(symbolFileStruct.symbolType_); + Write(symbolFileStruct.textExecVaddr_); + Write(symbolFileStruct.textExecVaddrFileOffset_); + Write(symbolFileStruct.buildId_); + + Write((uint32_t)symbolFileStruct.symbolStructs_.size()); + for (auto &symbolStruct : symbolFileStruct.symbolStructs_) { + Write(symbolStruct.vaddr_); + Write(symbolStruct.len_); + Write(symbolStruct.symbolName_); + } + HLOGV(" %zu SymbolStruct writed. for %s at 0x%016" PRIx64 "@0x%08" PRIx64 ": %s", + symbolFileStruct.symbolStructs_.size(), symbolFileStruct.filePath_.c_str(), + symbolFileStruct.textExecVaddr_, symbolFileStruct.textExecVaddrFileOffset_, + symbolFileStruct.buildId_.c_str()); + } + HLOGV("%zu SymbolFileStruct writed.", symbolFileStructs_.size()); + + return true; +} + +PerfFileSectionNrCpus::PerfFileSectionNrCpus(FEATURE id, const char *buf, size_t size) + : PerfFileSection(id) +{ + Init(buf, size); + if (!Read(nrCpusAvailable_) || !Read(nrCpusOnline_)) { + return; + } +} + +PerfFileSectionNrCpus::PerfFileSectionNrCpus(FEATURE id, uint32_t nrCpusAvailable, + uint32_t nrCpusOnline) + : PerfFileSection(id), nrCpusAvailable_(nrCpusAvailable), nrCpusOnline_(nrCpusOnline) +{ +} + +bool PerfFileSectionNrCpus::GetBinary(char *buf, size_t size) +{ + if (size < GetSize()) { + return false; + } + + Init(buf, size); + Write(nrCpusAvailable_); + Write(nrCpusOnline_); + return true; +} + +size_t PerfFileSectionNrCpus::GetSize() +{ + return (sizeof(nrCpusAvailable_) + sizeof(nrCpusOnline_)); +} + +void PerfFileSectionNrCpus::GetValue(uint32_t &nrCpusAvailable, uint32_t &nrCpusOnline) const +{ + nrCpusAvailable = nrCpusAvailable_; + nrCpusOnline = nrCpusOnline_; +} + +PerfFileSectionU64::PerfFileSectionU64(FEATURE id, const char *buf, size_t size) + : PerfFileSection(id) +{ + Init(buf, size); + if (!Read(value_)) { + return; + } +} + +PerfFileSectionU64::PerfFileSectionU64(FEATURE id, uint64_t v) : PerfFileSection(id) +{ + value_ = v; +} + +bool PerfFileSectionU64::GetBinary(char *buf, size_t size) +{ + if (size < GetSize()) { + return false; + } + + Init(buf, size); + Write(value_); + return true; +} + +size_t PerfFileSectionU64::GetSize() +{ + return sizeof(value_); +} + +void PerfFileSectionU64::GetValue(uint64_t &v) const +{ + v = value_; +} + +PerfFileSectionEventDesc::PerfFileSectionEventDesc(FEATURE id, + const std::vector &eventDesces) + : PerfFileSection(id) +{ + eventDesces_ = eventDesces; +} + +PerfFileSectionEventDesc::PerfFileSectionEventDesc(FEATURE id, const char *buf, size_t size) + : PerfFileSection(id) +{ + constexpr uint32_t maxIds = 500; + Init(buf, size); + uint32_t nr = 0; + if (!Read(nr)) { + return; + } + uint32_t attrSize = 0; + if (!Read(attrSize)) { + return; + } + if (attrSize != sizeof(perf_event_attr)) { // only for log or debug + HLOGW("perf_event_attr version is different, attrSize %d vs %zu", attrSize, + sizeof(perf_event_attr)); + } + + for (; nr > 0; nr--) { + AttrWithId eventDesc; + // compatible with the different version of 'perf_event_attr' + if (attrSize > sizeof(perf_event_attr)) { + if (!Read((char *)&(eventDesc.attr), sizeof(perf_event_attr))) { + return; + } + // skip tail bytes + HLOGW("skip %zu byte for diff attr size", attrSize - sizeof(perf_event_attr)); + Skip(attrSize - sizeof(perf_event_attr)); + } else if (!Read((char *)&(eventDesc.attr), attrSize)) { + return; + } + + uint32_t nrIds = 0; + if (!Read(nrIds)) { + return; + } else if (nrIds == 0 or nrIds > maxIds) { + HLOGW("nrIds is not correct ! %u", nrIds); + return; + } + if (!Read(eventDesc.name)) { + return; + } + eventDesc.ids.resize(nrIds, 0); + if (!Read((char *)eventDesc.ids.data(), sizeof(uint64_t) * nrIds)) { + return; + } + eventDesces_.emplace_back(std::move(eventDesc)); + } + HLOGV("read complete. %zu events", eventDesces_.size()); +} + +bool PerfFileSectionEventDesc::GetBinary(char *buf, size_t size) +{ + if (size < GetSize()) { + return false; + } + Init(buf, size); + + if (!Write((uint32_t)eventDesces_.size())) { + return false; + } + if (!Write((uint32_t)sizeof(perf_event_attr))) { + return false; + } + for (auto &eventDesc : eventDesces_) { + if (!Write((char *)&(eventDesc.attr), sizeof(perf_event_attr))) { + return false; + } + if (!Write((uint32_t)eventDesc.ids.size())) { + return false; + } + if (!Write(eventDesc.name)) { + return false; + } + // clang-format off + if (!Write((char *)eventDesc.ids.data(), + sizeof(uint64_t) * eventDesc.ids.size())) { + // clang-format on + return false; + } + } + return true; +} + +size_t PerfFileSectionEventDesc::GetSize() +{ + size_t size = sizeof(uint32_t); // nr + size += sizeof(uint32_t); // attr_size + + size += (eventDesces_.size() * sizeof(perf_event_attr)); + size += (eventDesces_.size() * sizeof(uint32_t)); // nr_ids + for (auto &eventDesc : eventDesces_) { + size += SizeOf(eventDesc.name); + size += (sizeof(uint64_t) * eventDesc.ids.size()); + } + return size; +} + +void PerfFileSectionEventDesc::GetValue(std::vector &eventDesces) const +{ + eventDesces = eventDesces_; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_reader.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_reader.cpp new file mode 100644 index 0000000..d60700f --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/perf_file_reader.cpp @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "perf_file_reader.h" + +#include +#include +#include +#include + +#include +#include + +#include "utilities.h" + +using namespace std::chrono; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +const int FETURE_MAX = 256; +const int SIZE_FETURE_COUNT = 8; + +std::unique_ptr PerfFileReader::Instance(const std::string &fileName, size_t begin) +{ + std::string resolvedPath = CanonicalizeSpecPath(fileName.c_str()); + FILE *fp = fopen(resolvedPath.c_str(), "rb"); + if (fp == nullptr) { + HLOGE("fail to open file %s", fileName.c_str()); + return nullptr; + } + + std::unique_ptr reader = std::make_unique(fileName, fp, begin); + if (!reader->ReadFileHeader()) { + // Fail to read header, maybe its compressed + if (reader->IsGzipFile()) { + fclose(fp); + reader->fp_ = nullptr; + + if (!UncompressFile(fileName, ".perf.data")) { + HLOGE("Fail to UncompressFile(%s)", fileName.c_str()); + return nullptr; + } + + // open the uncompressed hidden file .perf.data + FILE *fp2 = fopen(".perf.data", "rb"); + if (fp2 == nullptr) { + HLOGE("fail to open uncompressed file .perf.data"); + return nullptr; + } + + reader->fp_ = fp2; + reader->compressData_ = true; + + if (!reader->ReadFileHeader()) { + HLOGE("fail to read header of file .perf.data"); + return nullptr; + } + goto end; + } + return nullptr; + } +end: + if (!reader->ReadAttrSection()) { + return nullptr; + } + return reader; +} + +std::unique_ptr PerfFileReader::Instance(const uint8_t *buff, size_t size) +{ + std::unique_ptr reader = std::make_unique(buff, size); + if (!reader->ReadFileHeader()) { + return nullptr; + } + if (!reader->ReadAttrSection()) { + return nullptr; + } + return reader; +} + +PerfFileReader::PerfFileReader(const std::string &fileName, FILE *fp, size_t begin) + : fp_(fp), fileName_(fileName), fileBegin_(begin) +{ + isMemory_ = false; + featureSectionOffset_ = 0; + struct stat fileStat; + if (fp != nullptr) { + if (fstat(fileno(fp), &fileStat) != -1 and fileStat.st_size > 0) { + fileSize_ = fileStat.st_size - fileBegin_; + } + } + + if (fseek(fp_, fileBegin_, SEEK_SET) != 0) { + HLOGE("fseek() failed"); + } +} + +PerfFileReader::PerfFileReader(const uint8_t *buff, size_t size) : buff_(buff), buffSize_(size) +{ + isMemory_ = true; + buffCurrent_ = 0; +} + +PerfFileReader::~PerfFileReader() +{ + if (isMemory_) { + return; + } + // if file was not closed properly + if (fp_ != nullptr) { + fclose(fp_); + fp_ = nullptr; + } + + // remove the uncompressed .perf.data + if (compressData_) { + if (remove(".perf.data") != 0) { + HLOGE("Fail to remove uncompressed file .perf.data"); + perror("Fail to remove temp file"); + } + } +} + +bool PerfFileReader::IsValidDataFile() +{ + return (memcmp(header_.magic, PERF_MAGIC, sizeof(header_.magic)) == 0); +} + +bool PerfFileReader::IsGzipFile() +{ + return header_.magic[0] == '\x1f' and header_.magic[1] == '\x8b'; +} + +bool PerfFileReader::ReadFileHeader() +{ + if (Read(&header_, sizeof(header_))) { + dataSectionSize_ = header_.data.size; + if (IsValidDataFile()) { + featureSectionOffset_ = header_.data.offset + header_.data.size; + for (int i = 0; i < FETURE_MAX / SIZE_FETURE_COUNT; i++) { + std::bitset features(header_.features[i]); + for (int j = 0; j < SIZE_FETURE_COUNT; j++) { + if (features.test(j)) { + features_.emplace_back((FEATURE)(((uint64_t)i) * SIZE_FETURE_COUNT + j)); + } + } + } + return true; + } + } + return false; +} + +bool PerfFileReader::ReadAttrSection() +{ + if (header_.attrSize != sizeof(perf_file_attr)) { + // 4.19 and 5.1 use diff size , 128 vs 136 + HLOGW("attr size %" PRId64 " doesn't match expected size %zu", header_.attrSize, + sizeof(perf_file_attr)); + } + + int attrCount = header_.attrs.size / header_.attrSize; + if (attrCount == 0) { + HLOGE("no attr in file"); + return false; + } + if (!SeekFromBegin(header_.attrs.offset)) { + return false; + } + for (int i = 0; i < attrCount; ++i) { + std::vector buf(header_.attrSize); + if (!Read(buf.data(), buf.size())) { + return false; + } + // size of perf_event_attr change between different linux kernel versions. + // can not memcpy to perf_file_attr as a whole + perf_file_attr attr {}; + size_t attr_size = header_.attrSize - sizeof(attr.ids); + + // If the size is smaller, you can use a pointer to point directly. + // Our UAPI is 4.19. is less than 5.1 + if (sizeof(perf_event_attr) > header_.attrSize) { + HLOGE("size not match, ptr of perf_event_attr maybe overfollow %zu vs %zu", + sizeof(perf_event_attr), attr_size); + } + + attr.attr = *(reinterpret_cast(&buf[0])); + attr.ids = *(reinterpret_cast(&buf[attr_size])); + vecAttr_.push_back(attr); + } + + // read ids for attr + for (size_t i = 0; i < vecAttr_.size(); ++i) { + std::vector ids; + if (!ReadIdsForAttr(vecAttr_[i], &ids)) { + return false; + } + vecAttrIds_.push_back(ids); + + // map ids to attr index + for (auto id : ids) { + mapId2Attr_[id] = i; + } + } + + return true; +} + +bool PerfFileReader::ReadIdsForAttr(const perf_file_attr &attr, std::vector *ids) +{ + if (attr.ids.size > 0) { + size_t count = attr.ids.size / sizeof(uint64_t); + if (!SeekFromBegin(attr.ids.offset)) { + return false; + } + + ids->resize(count); + if (!Read(ids->data(), attr.ids.size)) { + return false; + } + } + return true; +} + +std::vector PerfFileReader::GetAttrSection() const +{ + std::vector result(vecAttr_.size()); + + for (size_t i = 0; i < vecAttr_.size(); ++i) { + result[i].attr = vecAttr_[i].attr; + result[i].ids = vecAttrIds_[i]; + } + return result; +} + +bool PerfFileReader::ReadDataSection(ProcessRecordCB &callback) +{ + if (!SeekFromBegin(header_.data.offset)) { + return false; + } + + HLOGD("dataSection_ at offset %" PRId64 " + %" PRId64 "", header_.data.offset, + header_.data.size); + + if (!ReadRecord(callback)) { + printf("some record format is error!\n"); + return false; + }; + +#ifdef HIPERF_DEBUG_TIME + printf("readRecordTime: %" PRId64 " ms\n", + duration_cast(readRecordTime_).count()); + printf("readCallbackTime: %" PRId64 " ms\n", + duration_cast(readCallbackTime_).count()); +#endif + return dataSectionSize_ == 0; +} + +const perf_event_attr *PerfFileReader::GetDefaultAttr() +{ + if (vecAttr_.empty()) + return nullptr; + + return &(vecAttr_[0].attr); +} + +bool PerfFileReader::ReadRecord(ProcessRecordCB &callback) +{ +#ifdef HIPERF_DEBUG_TIME + const auto startReadTime = steady_clock::now(); +#endif + // record size can not exceed 64K + HIPERF_BUF_ALIGN uint8_t buf[RECORD_SIZE_LIMIT]; + // diff with reader + uint64_t remainingSize = header_.data.size; + size_t recordNumber = 0; + while (remainingSize > 0) { + if (remainingSize < sizeof(perf_event_header)) { + HLOGW("not enough sizeof perf_event_header"); + return false; + } else if (!Read(buf, sizeof(perf_event_header))) { + HLOGW("read perf_event_header failed."); + return false; + } else { + perf_event_header *header = reinterpret_cast(buf); + if (header->size > sizeof(buf)) { + HLOGE("read record header size error %hu", header->size); + return false; + } + if (remainingSize >= header->size) { + size_t headerSize = sizeof(perf_event_header); + if (Read(buf + headerSize, header->size - headerSize)) { + uint8_t *data = buf; + std::unique_ptr record = GetPerfEventRecord( + static_cast(header->type), data, *GetDefaultAttr()); + // unknown record , break the process + if (!record) { + return false; + } else { + HLOGV("record type %u", record->GetType()); + } + remainingSize -= header->size; +#ifdef HIPERF_DEBUG_TIME + const auto startCallbackTime = steady_clock::now(); +#endif + // call callback to process, then destroy record + callback(std::move(record)); + recordNumber++; +#ifdef HIPERF_DEBUG_TIME + readCallbackTime_ += + duration_cast(steady_clock::now() - startCallbackTime); +#endif + } else { + HLOGE("read record data size failed %zu", header->size - headerSize); + return false; + } + } else { + HLOGE("not enough header->size."); + return false; + } + } + } + HLOGD("read back %zu records", recordNumber); +#ifdef HIPERF_DEBUG_TIME + readRecordTime_ += duration_cast(steady_clock::now() - startReadTime); +#endif + return true; +} + +bool PerfFileReader::Read(void *buf, size_t len) +{ + if (buf == nullptr || len == 0) { + HLOG_ASSERT(buf != nullptr); + HLOG_ASSERT(len > 0); + return false; + } + + if (isMemory_) { + if (buffCurrent_ + len > buffSize_) { + return false; + } + std::copy(buff_ + buffCurrent_, buff_ + buffCurrent_ + len, reinterpret_cast(buf)); + buffCurrent_ += len; + } else if (fread(buf, len, 1, fp_) != 1) { + printf("failed to read file: %d", errno); + return false; + } + return true; +} + +const perf_file_header &PerfFileReader::GetHeader() const +{ + return header_; +} + +bool PerfFileReader::Read(char *buf, uint64_t offset, size_t len) +{ + if (buf == nullptr || len == 0) { + HLOG_ASSERT(buf != nullptr); + HLOG_ASSERT(len > 0); + return false; + } + if (!SeekFromBegin(offset)) { + return false; + } + + if (isMemory_) { + if (buffCurrent_ + len > buffSize_) { + return false; + } + std::copy(buff_ + buffCurrent_, buff_ + buffCurrent_ + len, reinterpret_cast(buf)); + buffCurrent_ += len; + } else if (fread(buf, len, 1, fp_) != 1) { + printf("failed to read file: %d", errno); + return false; + } + HLOGM("offset %" PRIx64 " len %zu buf %x %x %x %x", offset, len, buf[0], buf[1], buf[2], + buf[3]); + return true; +} +const std::vector &PerfFileReader::GetFeatures() const +{ + return features_; +} + +const std::vector> &PerfFileReader::GetFeatureSections() const +{ + return perfFileSections_; +} + +const std::string PerfFileReader::GetFeatureString(const FEATURE feature) const +{ + std::string featureName = PerfFileSection::GetFeatureName(feature); + HLOGV("GetFeatureSection %s", featureName.c_str()); + if (!IsFeatrureStringSection(feature)) { + HLOGV("not a string feature: %s", featureName.c_str()); + } else { + const PerfFileSection *featureSection = GetFeatureSection(feature); + if (featureSection != nullptr) { + const PerfFileSectionString *sectionString = + static_cast(featureSection); + return sectionString->toString(); + } else { + HLOGV("have not found: %s", featureName.c_str()); + } + } + return EMPTY_STRING; +} + +const PerfFileSection *PerfFileReader::GetFeatureSection(FEATURE feature) const +{ + HLOGV("enter"); + for (auto const &it : perfFileSections_) { + HLOGV("perfFileSections %p", it.get()); + if (it->featureId_ == feature) { + return it.get(); + } + } + return nullptr; +} + +bool PerfFileReader::ReadFeatureSection() +{ + uint64_t featureSectionOffsetRead = featureSectionOffset_; + HLOGV(" ReadDataSection data offset '0x%" PRIx64 " ", featureSectionOffset_); + + for (FEATURE feature : features_) { + perf_file_section sectionHeader; + if (!Read((char *)§ionHeader, featureSectionOffsetRead, sizeof(sectionHeader))) { + // read failed ?? + printf("file format not correct. featureSectionOffsetRead '0x%" PRIx64 "\n", + featureSectionOffsetRead); + return false; + } + + HLOGV("process feature %d:%s", feature, PerfFileSection::GetFeatureName(feature).c_str()); + HLOGV(" sectionHeader -> read offset '0x%" PRIx64 " size '0x%" PRIx64 "'", + sectionHeader.offset, sectionHeader.size); + if (isMemory_) { + if (sectionHeader.size == 0 or sectionHeader.size > buffSize_) { + HLOGE("sectionHeader.size %" PRIu64 " is not correct", sectionHeader.size); + return false; + } + } else { + if (sectionHeader.size == 0 or sectionHeader.size > fileSize_) { + HLOGE("sectionHeader.size %" PRIu64 " is not correct", sectionHeader.size); + return false; + } + } + std::vector buf(sectionHeader.size); + if (!Read(&buf[0], sectionHeader.offset, buf.size())) { + // read failed ?? + printf("file format not correct. featureSectionDataOffset '0x%" PRIx64 "\n", + sectionHeader.offset); + return false; + } + if (IsFeatrureStringSection(feature)) { + perfFileSections_.emplace_back( + std::make_unique(feature, (char *)&buf[0], buf.size())); + } else if (feature == FEATURE::HIPERF_FILES_SYMBOL) { + perfFileSections_.emplace_back(std::make_unique( + feature, (char *)&buf[0], buf.size())); + } else if (feature == FEATURE::EVENT_DESC) { + perfFileSections_.emplace_back( + std::make_unique(feature, (char *)&buf[0], buf.size())); + } else { + HLOGW("still not imp how to process with feature %d", feature); + } + + featureSectionOffsetRead += sizeof(sectionHeader); // next feaure + } + return true; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/program_header.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/program_header.cpp new file mode 100644 index 0000000..636ac74 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/program_header.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 + +using namespace OHOS::Developtools::HiPerf::ELF; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +std::unique_ptr ProgramHeader::MakeUnique(char * const phdrBuf, const size_t bufSize) +{ + std::unique_ptr phdr {new (std::nothrow) ProgramHeader()}; + if (phdr == nullptr) { + HLOGE("ProgramHeader() failed"); + return nullptr; + } + if (!phdr->Init(phdrBuf, bufSize)) { + HLOGE("ProgramHeader::Init(phdrBuf, bufSize) failed"); + DumpPhdrBuf(phdrBuf, bufSize); + return nullptr; + } + return phdr; +} + +bool ProgramHeader::ParsePrgHeader32(char * const phdrBuf) +{ + uint32_t *u4Buf = reinterpret_cast(phdrBuf); + size_t index {0}; + type_ = u4Buf[index]; + ++index; + offset_ = u4Buf[index]; + ++index; + vaddr_ = u4Buf[index]; + ++index; + paddr_ = u4Buf[index]; + ++index; + fileSize_ = u4Buf[index]; + ++index; + memSize_ = u4Buf[index]; + ++index; + flags_ = u4Buf[index]; + ++index; + secAlign_ = u4Buf[index]; + return true; +} + +bool ProgramHeader::ParsePrgHeader64(char * const phdrBuf) +{ + uint32_t *u4Buf = reinterpret_cast(phdrBuf); + size_t index {0}; + type_ = u4Buf[index]; + ++index; + flags_ = u4Buf[index]; + + uint64_t *u8Buf = reinterpret_cast(phdrBuf); + offset_ = u8Buf[index]; + ++index; + vaddr_ = u8Buf[index]; + ++index; + paddr_ = u8Buf[index]; + ++index; + fileSize_ = u8Buf[index]; + ++index; + memSize_ = u8Buf[index]; + ++index; + secAlign_ = u8Buf[index]; + return true; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/register.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/register.cpp new file mode 100644 index 0000000..248572b --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/register.cpp @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ + +// for libunwind.h empty struct has size 0 in c, size 1 in c++ +#define UNW_EMPTY_STRUCT uint8_t unused + +#include "register.h" + +#if !is_mingw +#include +#endif + +#if HAVE_LIBUNWIND +#include +#endif + +#include "debug_logger.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static ArchType deviceArchType = ArchType::UNSUPPORT; + +// these copy from kerne uapi perf_regs.h +uint64_t GetSupportedRegMask(ArchType arch) +{ + uint64_t result = 0; + switch (arch) { + case ArchType::X86_32: + result = ((1ULL << PERF_REG_X86_32_MAX) - 1); + break; + case ArchType::X86_64: + result = ((1ULL << PERF_REG_X86_64_MAX) - 1); + result &= ~((1ULL << PERF_REG_X86_DS) | (1ULL << PERF_REG_X86_ES) | + (1ULL << PERF_REG_X86_FS) | (1ULL << PERF_REG_X86_GS)); + break; + case ArchType::ARM: + result = ((1ULL << PERF_REG_ARM_MAX) - 1); + break; + case ArchType::ARM64: + result = ((1ULL << PERF_REG_ARM64_MAX) - 1); + break; + default: + result = std::numeric_limits::max(); + HLOGE("unsupport arch %d", arch); + break; + } + return result; +} + +#if HAVE_LIBUNWIND +const std::map LibUnwindRegMap = { +#if defined(target_cpu_x64) + {UNW_X86_64_RAX, PERF_REG_X86_AX}, {UNW_X86_64_RDX, PERF_REG_X86_DX}, + {UNW_X86_64_RCX, PERF_REG_X86_CX}, {UNW_X86_64_RBX, PERF_REG_X86_BX}, + {UNW_X86_64_RSI, PERF_REG_X86_SI}, {UNW_X86_64_RDI, PERF_REG_X86_DI}, + {UNW_X86_64_RBP, PERF_REG_X86_BP}, {UNW_X86_64_RSP, PERF_REG_X86_SP}, + {UNW_X86_64_R8, PERF_REG_X86_R8}, {UNW_X86_64_R9, PERF_REG_X86_R9}, + {UNW_X86_64_R10, PERF_REG_X86_R10}, {UNW_X86_64_R11, PERF_REG_X86_R11}, + {UNW_X86_64_R12, PERF_REG_X86_R12}, {UNW_X86_64_R13, PERF_REG_X86_R13}, + {UNW_X86_64_R14, PERF_REG_X86_R14}, {UNW_X86_64_R15, PERF_REG_X86_R15}, + {UNW_X86_64_RIP, PERF_REG_X86_IP}, +#elif defined(target_cpu_arm64) + {UNW_AARCH64_X0, PERF_REG_ARM64_X0}, {UNW_AARCH64_X1, PERF_REG_ARM64_X1}, + {UNW_AARCH64_X2, PERF_REG_ARM64_X2}, {UNW_AARCH64_X3, PERF_REG_ARM64_X3}, + {UNW_AARCH64_X4, PERF_REG_ARM64_X4}, {UNW_AARCH64_X5, PERF_REG_ARM64_X5}, + {UNW_AARCH64_X6, PERF_REG_ARM64_X6}, {UNW_AARCH64_X7, PERF_REG_ARM64_X7}, + {UNW_AARCH64_X8, PERF_REG_ARM64_X8}, {UNW_AARCH64_X9, PERF_REG_ARM64_X9}, + {UNW_AARCH64_X10, PERF_REG_ARM64_X10}, {UNW_AARCH64_X11, PERF_REG_ARM64_X11}, + {UNW_AARCH64_X12, PERF_REG_ARM64_X12}, {UNW_AARCH64_X13, PERF_REG_ARM64_X13}, + {UNW_AARCH64_X14, PERF_REG_ARM64_X14}, {UNW_AARCH64_X15, PERF_REG_ARM64_X15}, + {UNW_AARCH64_X16, PERF_REG_ARM64_X16}, {UNW_AARCH64_X17, PERF_REG_ARM64_X17}, + {UNW_AARCH64_X18, PERF_REG_ARM64_X18}, {UNW_AARCH64_X19, PERF_REG_ARM64_X19}, + {UNW_AARCH64_X20, PERF_REG_ARM64_X20}, {UNW_AARCH64_X21, PERF_REG_ARM64_X21}, + {UNW_AARCH64_X22, PERF_REG_ARM64_X22}, {UNW_AARCH64_X23, PERF_REG_ARM64_X23}, + {UNW_AARCH64_X24, PERF_REG_ARM64_X24}, {UNW_AARCH64_X25, PERF_REG_ARM64_X25}, + {UNW_AARCH64_X26, PERF_REG_ARM64_X26}, {UNW_AARCH64_X27, PERF_REG_ARM64_X27}, + {UNW_AARCH64_X28, PERF_REG_ARM64_X28}, {UNW_AARCH64_X29, PERF_REG_ARM64_X29}, + {UNW_AARCH64_X30, PERF_REG_ARM64_LR}, {UNW_AARCH64_SP, PERF_REG_ARM64_SP}, + {UNW_AARCH64_PC, PERF_REG_ARM64_PC}, +#elif defined(target_cpu_arm) + {UNW_ARM_R0, PERF_REG_ARM_R0}, {UNW_ARM_R1, PERF_REG_ARM_R1}, {UNW_ARM_R2, PERF_REG_ARM_R2}, + {UNW_ARM_R3, PERF_REG_ARM_R3}, {UNW_ARM_R4, PERF_REG_ARM_R4}, {UNW_ARM_R5, PERF_REG_ARM_R5}, + {UNW_ARM_R6, PERF_REG_ARM_R6}, {UNW_ARM_R7, PERF_REG_ARM_R7}, {UNW_ARM_R8, PERF_REG_ARM_R8}, + {UNW_ARM_R9, PERF_REG_ARM_R9}, {UNW_ARM_R10, PERF_REG_ARM_R10}, {UNW_ARM_R11, PERF_REG_ARM_FP}, + {UNW_ARM_R12, PERF_REG_ARM_IP}, {UNW_ARM_R13, PERF_REG_ARM_SP}, {UNW_ARM_R14, PERF_REG_ARM_LR}, + {UNW_ARM_R15, PERF_REG_ARM_PC}, +#else +#error not support +#endif +}; + +int LibunwindRegIdToPerfReg(int libUnwindReg) +{ + if (LibUnwindRegMap.count(libUnwindReg)) { + return LibUnwindRegMap.at(libUnwindReg); + } else { + HLOGE("unwind: invalid reg id %d", libUnwindReg); + return -EINVAL; + } +} +#endif + +const std::string UpdatePerfContext(uint64_t addr, perf_callchain_context &perfCallchainContext) +{ + if (PERF_CONTEXT_NAME.count(addr) != 0) { + perfCallchainContext = static_cast(addr); + return StringPrintf("%s: %" PRIx64 "", PERF_CONTEXT_NAME.at(addr).c_str(), addr); + } else { + perfCallchainContext = PERF_CONTEXT_MAX; + return StringPrintf("unknow context: %" PRIx64 "", addr); + } +} + +const std::string GetArchName(ArchType arch) +{ + switch (arch) { + case ArchType::X86_32: + return "X86_32"; + case ArchType::X86_64: + return "X86_64"; + case ArchType::ARM: + return "ARM"; + case ArchType::ARM64: + return "ARM64"; + default: + return "Unsupport"; + } +} + +size_t RegisterGetIP(ArchType arch) +{ + switch (arch) { + case ArchType::X86_32: + case ArchType::X86_64: + return PERF_REG_X86_IP; + case ArchType::ARM: + return PERF_REG_ARM_PC; + case ArchType::ARM64: + return PERF_REG_ARM64_PC; + default: + return std::numeric_limits::max(); + } +} + +size_t RegisterGetSP(ArchType arch) +{ + switch (arch) { + case ArchType::X86_32: + case ArchType::X86_64: + return PERF_REG_X86_SP; + case ArchType::ARM: + return PERF_REG_ARM_SP; + case ArchType::ARM64: + return PERF_REG_ARM64_SP; + default: + return std::numeric_limits::max(); + } +} + +const std::string RegisterGetName(size_t registerIndex) +{ + std::string name; + name.append("PerfReg["); + name.append(std::to_string(registerIndex)); + if (PERF_REG_NAME_MAP.count(registerIndex) > 0) { + name.append(":"); + name.append(PERF_REG_NAME_MAP.at(registerIndex)); + } + name.append("]"); + return name; +} + +bool RegisterGetValue(uint64_t &value, const u64 registers[], const size_t registerIndex, + const size_t registerNumber) +{ + if (registerIndex >= registerNumber) { + HLOGE("registerIndex is %zu, max is %zu", registerIndex, registerNumber); + return false; + } + value = registers[registerIndex]; + return true; +} + +ArchType GetArchTypeFromUname(const std::string &machine) +{ + if (StringStartsWith(machine, "arm")) { + if (machine == "armv8l") { + // 32 bit elf run in 64 bit cpu + return ArchType::ARM64; + } + return ArchType::ARM; + } else if (machine == "aarch64") { + return ArchType::ARM64; + } else if (machine == "x86_64") { + return ArchType::X86_64; + } else if (machine == "x86" || machine == "i686") { + return ArchType::X86_32; + } else { + HLOGE("unsupport machine %s", machine.c_str()); + return ArchType::UNSUPPORT; + } +} + +ArchType GetArchTypeFromABI(bool abi32) +{ + if (deviceArchType == ArchType::UNSUPPORT) { + deviceArchType = GetDeviceArch(); + } + if (abi32) { + if (deviceArchType == ArchType::ARM64) { + return ArchType::ARM; + } else if (deviceArchType == ArchType::X86_64) { + return ArchType::X86_32; + } + } + return deviceArchType; +} + +ArchType SetDeviceArch(ArchType arch) +{ + HLOGD("deviceArchType change to %s", GetArchName(arch).c_str()); + deviceArchType = arch; + return deviceArchType; +} + +ArchType GetDeviceArch() +{ +#if is_mingw + return deviceArchType; +#else + if (deviceArchType != ArchType::UNSUPPORT) { + return deviceArchType; + } else { + utsname systemName; + if ((uname(&systemName)) != 0) { + // fallback + deviceArchType = buildArchType; + } else { + deviceArchType = GetArchTypeFromUname(systemName.machine); + HLOGD("machine arch is %s : %s", systemName.machine, + GetArchName(deviceArchType).c_str()); + if (deviceArchType == ArchType::UNSUPPORT) { + deviceArchType = buildArchType; + } + } + } + return deviceArchType; +#endif +} + +void UpdateRegForABI(ArchType arch, u64 *regs) +{ + if (deviceArchType == ArchType::ARM64 and arch == ArchType::ARM) { + // arm in arm64 + regs[PERF_REG_ARM_PC] = regs[PERF_REG_ARM64_PC]; + } +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/report.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/report.cpp new file mode 100644 index 0000000..e5b0ed6 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/report.cpp @@ -0,0 +1,656 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "Report" + +#include "report.h" + +#include +#include +#include + +#if is_mingw +#include +#else +#include +#endif + +using namespace std::placeholders; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +unsigned long long ReportItem::allIndex_ = 0; +void Report::AddReportItem(const PerfRecordSample &sample, bool includeCallStack) +{ + size_t configIndex = GetConfigIndex(sample.data_.id); + HLOG_ASSERT_MESSAGE(configs_.size() > configIndex, + "in %zu configs found index %zu, from ids %llu", configs_.size(), + configIndex, sample.data_.id); + VirtualThread &thread = virtualRuntime_.GetThread(sample.data_.pid, sample.data_.tid); + HLOG_ASSERT(sample.callFrames_.size() > 0); + if (sample.callFrames_.size() > 0) { + // if we need callstack ? + if (includeCallStack) { + // we will use caller mode , from last to first + auto frameIt = sample.callFrames_.rbegin(); + ReportItem &item = configs_[configIndex].reportItems_.emplace_back( + sample.data_.pid, sample.data_.tid, thread.name_, frameIt->filePath_, + frameIt->symbolName_, frameIt->vaddrInFile_, sample.data_.period); + HLOGV("%s", item.ToDebugString().c_str()); + HLOG_ASSERT(!item.func_.empty()); + + std::vector *currentCallFrames = &item.callStacks_; + for (frameIt = sample.callFrames_.rbegin(); frameIt != sample.callFrames_.rend(); + frameIt++) { + HLOG_ASSERT(frameIt->ip_ < PERF_CONTEXT_MAX); + // in add items case , right one should only have 1 callstack + // so just new callfames and move to next level + ReportItemCallFrame &nextCallFrame = currentCallFrames->emplace_back( + frameIt->symbolName_, frameIt->vaddrInFile_, frameIt->filePath_, + sample.data_.period, + (std::next(frameIt) == sample.callFrames_.rend()) ? sample.data_.period : 0); + HLOGV("add callframe %s", nextCallFrame.ToDebugString().c_str()); + currentCallFrames = &nextCallFrame.childs; + } + HLOGV("callstack %zu", item.callStacks_.size()); + if (item.callStacks_.size() > 0) { + HLOGV("callstack 2nd level %zu", item.callStacks_[0].childs.size()); + } + } else { + auto frameIt = sample.callFrames_.begin(); + HLOG_ASSERT(frameIt->ip_ < PERF_CONTEXT_MAX); + ReportItem &item = configs_[configIndex].reportItems_.emplace_back( + sample.data_.pid, sample.data_.tid, thread.name_, frameIt->filePath_, + frameIt->symbolName_, frameIt->vaddrInFile_, sample.data_.period); + HLOGV("%s", item.ToDebugString().c_str()); + HLOG_ASSERT(!item.func_.empty()); + } + } + configs_[configIndex].sampleCount_++; + configs_[configIndex].eventCount_ += sample.data_.period; +} + +void Report::AddReportItemBranch(const PerfRecordSample &sample) +{ + size_t configIndex = GetConfigIndex(sample.data_.id); + HLOG_ASSERT(configs_.size() > configIndex); + VirtualThread &thread = virtualRuntime_.GetThread(sample.data_.pid, sample.data_.tid); + for (u64 i = 0; i < sample.data_.bnr; i++) { + Symbol symbol_to = + virtualRuntime_.GetSymbol(sample.data_.lbr[i].to, sample.data_.pid, sample.data_.tid); + Symbol symbol_from = + virtualRuntime_.GetSymbol(sample.data_.lbr[i].from, sample.data_.pid, sample.data_.tid); + + // branch only have 1 time only for period + ReportItem &item = configs_[configIndex].reportItems_.emplace_back( + sample.data_.pid, sample.data_.tid, thread.name_, symbol_to.module_, symbol_to.Name(), + symbol_to.funcVaddr_, 1u); + + item.fromDso_ = symbol_from.module_; + item.fromFunc_ = symbol_from.Name(); + + HLOGV("%s 0x%" PRIx64 "", item.ToDebugString().c_str(), symbol_to.taskVaddr_); + } + configs_[configIndex].sampleCount_++; + configs_[configIndex].eventCount_ += sample.data_.bnr; +} + +void Report::StatisticsRecords() +{ + for (auto &config : configs_) { + size_t duplicates = 0; + size_t totalReportCount = config.reportItems_.size(); + // merge duplicate + HLOGD("uniquing %zu", totalReportCount); + auto last = std::unique(config.reportItems_.begin(), config.reportItems_.end(), + std::bind(&Report::MultiLevelSameAndUpdateCount, this, _1, _2)); + + config.reportItems_.erase(last, config.reportItems_.end()); + + duplicates = totalReportCount - config.reportItems_.size(); + HLOGD("duplicates %zu, %zu -> %zu", duplicates, totalReportCount, + config.reportItems_.size()); + } +} + +void Report::FilterDisplayRecords() +{ + // remove the item with not in fliter + for (auto &config : configs_) { + size_t filterOuts = 0; + size_t totalReportCount = config.reportItems_.size(); + for (auto &reportKeyPair : reportKeyMap_) { + auto reportKey = reportKeyPair.second; + if (reportKey.displayFilter_.size() != 0) { + auto itemIt = config.reportItems_.begin(); + while (itemIt != config.reportItems_.end()) { + if (!reportKey.ShouldDisplay(*itemIt)) { + HLOGM("filter out %s", itemIt->ToDebugString().c_str()); + + // we need recalc the heating ,so also remove in total count + config.eventCount_ -= itemIt->eventCount_; + + // after update total eventCount remove this + itemIt = config.reportItems_.erase(itemIt); + filterOuts++; + } else { + itemIt++; + } + } + } + } + HLOGD("filter out %zu, %zu -> %zu", filterOuts, totalReportCount, + config.reportItems_.size()); + } +} + +void Report::UpdateReportItemsAfterAdjust() +{ + for (auto &config : configs_) { + HLOGV("percentage %zu items", config.reportItems_.size()); + uint64_t totalEventCount = 0; // just for debug check + for (auto &item : config.reportItems_) { + item.heat = Percentage(item.eventCount_, config.eventCount_); + totalEventCount += item.eventCount_; + HLOGM("%s percentage from %5.2f%% %" PRIu64 "/ %" PRIu64 "", + item.ToDebugString().c_str(), item.heat, item.eventCount_, config.eventCount_); + for (auto keyPair : reportKeyMap_) { + reportKeyMap_.at(keyPair.first).UpdateValueMaxLen(keyPair.second.GetValue(item)); + } + } + // check again + HLOGV("recalc totalEventCount is %" PRIu64 " old totalEventCount is %" PRIu64 "", + totalEventCount, config.eventCount_); + HLOG_ASSERT(totalEventCount == config.eventCount_); + } +} + +void Report::AdjustReportItems() +{ + HLOGD("Adjust Record Order ...."); + for (auto &config : configs_) { + uint64_t totalReportCount = config.reportItems_.size(); + if (option_.debug_) { + for (auto &reportItem : config.reportItems_) { + HLOGV("reportItem %s", reportItem.ToDebugString().c_str()); + } + } + // sort first. + HLOGD("MultiLevelSorting %" PRIu64 "", totalReportCount); + std::sort(config.reportItems_.begin(), config.reportItems_.end(), + std::bind(&Report::MultiLevelSorting, this, _1, _2)); + HLOGD("MultiLevelSorting %" PRIu64 " done", totalReportCount); + // reorder the callstack + if (option_.debug_) { + for (auto &reportItem : config.reportItems_) { + HLOGV("reportItem %s", reportItem.ToDebugString().c_str()); + } + } + StatisticsRecords(); + FilterDisplayRecords(); + + // reorder by count + std::sort(config.reportItems_.begin(), config.reportItems_.end(), + &ReportItem::CompareSortingEventCount); + + // reorder the callstack + for (auto &reportItem : config.reportItems_) { + ReportItemCallFrame::OrderCallFrames(reportItem.callStacks_); + } + HLOGD("afater sorting and unique, we have %zu report items,", config.reportItems_.size()); + } + // udpate percentage + UpdateReportItemsAfterAdjust(); +} + +int Report::MultiLevelCompare(const ReportItem &a, const ReportItem &b) +{ + HLOGM("MultiLevelCompare %s vs %s sort order %s", a.ToDebugString().c_str(), + b.ToDebugString().c_str(), VectorToString(option_.sortKeys_).c_str()); + + // check each key user care + for (auto it = option_.sortKeys_.begin(); it != option_.sortKeys_.end(); ++it) { + int result = reportKeyMap_.at(*it).compareFunction_(a, b); + if (result == 0) { + // this key is same , check the next one + continue; + } else { + // if onekey is not same , returl as not same + HLOGM("not same because %s %d : %s vs %s", it->c_str(), result, + reportKeyMap_.at(*it).GetValue(a).c_str(), + reportKeyMap_.at(*it).GetValue(b).c_str()); + return result; + } + } + // all the key is same + return 0; +} + +bool Report::MultiLevelSame(const ReportItem &a, const ReportItem &b) +{ + return MultiLevelCompare(a, b) == 0; +} + +void Report::MergeCallFrameCount(ReportItem &leftItem, ReportItem &rightItem) +{ + // add to left (right to left) + std::vector *leftCallFrames = &leftItem.callStacks_; + const std::vector *rightCallFrames = &rightItem.callStacks_; + uint64_t maxEventCount = leftItem.eventCount_; + // right should only have one call stack + int level = 0; + while (rightCallFrames->size() != 0) { + HLOG_ASSERT(rightCallFrames->size() == 1u); + const ReportItemCallFrame &rightFrame = rightCallFrames->at(0); + auto leftFrameIt = std::find(leftCallFrames->begin(), leftCallFrames->end(), rightFrame); + if (leftFrameIt == leftCallFrames->end()) { + // new callfames + auto &leftCallFrame = leftCallFrames->emplace_back(rightFrame); + HLOGV("%*s create frame %s in %s", level, "", leftCallFrame.ToDebugString().c_str(), + leftItem.ToDebugString().c_str()); + HLOG_ASSERT(leftCallFrame.eventCount_ <= maxEventCount); + // this is a new call stack , + // all the child in rightFrame has been copy to left. + break; + } else { + // already have , add count + leftFrameIt->eventCount_ += rightFrame.eventCount_; + leftFrameIt->selfEventCount_ += rightFrame.selfEventCount_; + // left move to next + leftCallFrames = &(leftFrameIt->childs); + HLOGM("%*s udpate frame +%" PRIu64 " %s in %s", level, "", rightFrame.eventCount_, + leftFrameIt->ToDebugString().c_str(), leftItem.ToDebugString().c_str()); + HLOG_ASSERT_MESSAGE(leftFrameIt->eventCount_ <= maxEventCount, + " maxEventCount is %" PRIu64 "", maxEventCount); + maxEventCount = leftFrameIt->eventCount_; + } + // move to next level + rightCallFrames = &(rightFrame.childs); + level++; + } +} + +bool Report::MultiLevelSameAndUpdateCount(ReportItem &l, ReportItem &r) +{ + if (MultiLevelCompare(l, r) == 0) { + l.eventCount_ += r.eventCount_; + HLOGM("l %" PRIu64 " %s c:%zu vs r %" PRIu64 " %s c:%zu", l.eventCount_, l.func_.data(), + l.callStacks_.size(), r.eventCount_, r.func_.data(), r.callStacks_.size()); + // if it have call stack? + if (r.callStacks_.size() != 0) { + // add to left (right to left) + MergeCallFrameCount(l, r); + } + return true; + } else { + return false; + } +} + +bool Report::MultiLevelSorting(const ReportItem &a, const ReportItem &b) +{ + /* + The value returned indicates whether the element passed as first argument is + considered to go before the second in the specific strict weak ordering it defines. + */ + bool result = MultiLevelCompare(a, b) > 0; +#ifdef HIPERF_DEBUG + if (DebugLogger::GetInstance()->GetLogLevel() <= LEVEL_VERBOSE) { + bool result2 = MultiLevelCompare(b, a) > 0; + if (result and result == result2) { + HLOGE("MultiLevelSorting a->b %d vs b->a %d", result, result2); + HLOGE("left %s", a.ToDebugString().c_str()); + HLOGE("right %s", b.ToDebugString().c_str()); + HLOG_ASSERT(false); + } + } +#endif + return result; +} + +void Report::OutputStdStatistics(ReportEventConfigItem &config) +{ + if (fprintf(output_, "\n") < 0) { + return; + } // make a blank line for new event + if (fprintf(output_, "Event: %s (type %" PRIu32 " id %" PRIu64 ")\n", config.eventName_.c_str(), + config.type_, config.config_) < 0) { + return; + } + if (fprintf(output_, "Samples Count: %" PRIu64 "\n", config.sampleCount_) < 0) { + return; + } + if (!config.coutMode_) { + fprintf(output_, "Time in ns: "); + } else { + fprintf(output_, "Event Count: "); + } + fprintf(output_, "%" PRIu64 "\n", config.eventCount_); +} + +bool Report::OutputStdStatistics(ReportEventConfigItem &config, ReportEventConfigItem &otherConfig) +{ + if (config != otherConfig) { + fprintf(output_, "diff config unable compare\n"); + return false; + } + fprintf(output_, "Event: %s (type %" PRIu32 " id %" PRIu64 ")", config.eventName_.c_str(), + config.type_, config.config_); + fprintf(output_, "Samples Count: %" PRIu64 " vs %" PRIu64 "\n", config.sampleCount_, + otherConfig.sampleCount_); + if (config.coutMode_) { + fprintf(output_, "Time in ns: "); + } else { + fprintf(output_, "Event Count: "); + } + fprintf(output_, "%" PRIu64 " vs %" PRIu64 "\n", config.eventCount_, otherConfig.eventCount_); + return true; +} + +void Report::OutputStdHead(ReportEventConfigItem &config, bool diffMode) +{ + // head print + const std::string head = "Heating"; + if (fprintf(output_, "%-*s ", FULL_PERCENTAGE_LEN, head.c_str()) < 0) { + return; + } + + if (diffMode) { + const std::string diff = "Diff"; + fprintf(output_, "%-*s ", FULL_PERCENTAGE_DIFF_LEN, diff.c_str()); + } + + // merge sort key and no-sort key (like count) + + displayKeyNames_ = option_.sortKeys_; + if (!option_.hideCount_) { + displayKeyNames_.insert(displayKeyNames_.begin(), "count"); + } + + unsigned int remainingWidth = consoleWidth_; + // sort key head + for (auto &keyName : displayKeyNames_) { + auto &key = reportKeyMap_.at(keyName); + remainingWidth -= key.maxLen_; + if (remainingWidth <= 0) { + key.maxLen_ = 0; + } + if (fprintf(output_, "%-*s ", (remainingWidth > 0) ? static_cast(key.maxLen_) : 0, + key.keyName_.c_str()) < 0) { + return; + } + HLOGD("'%s' max len %zu(from '%s') console width %d", key.keyName_.c_str(), key.maxLen_, + key.maxValue_.c_str(), remainingWidth); + } + if (fprintf(output_, "\n") < 0) { + return; + } +} + +bool Report::OutputStdCallFrame(int indent, const std::string_view &funcName, uint64_t eventCount, + uint64_t totalEventCount) +{ + float heat = Percentage(eventCount, totalEventCount); + float num = 100.0; + HLOGV("frame %f indent %d at %s", heat, indent, funcName.data()); + + if (heat < option_.callStackHeatLimit_) { + // don't print this three anymore + return false; + } + + if (heat == num) { + fprintf(output_, "%*s", indent, " "); + fprintf(output_, "%*s ", FULL_PERCENTAGE_NUM_LEN, " "); + } else { + fprintf(output_, "%*s", indent, "|- "); + fprintf(output_, "%*.2f%% ", FULL_PERCENTAGE_NUM_LEN, heat); + } + if (option_.debug_) { + fprintf(output_, "%" PRIu64 "/%" PRIu64 " %s\n", eventCount, totalEventCount, + funcName.data()); + } else { + fprintf(output_, "%s\n", funcName.data()); + } + return true; +} + +void Report::PrepareConsole() +{ +#if is_mingw + CONSOLE_SCREEN_BUFFER_INFO csbi; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); + consoleWidth_ = static_cast(csbi.srWindow.Right - csbi.srWindow.Left + 1); + const auto handle = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD mode; + GetConsoleMode(handle, &mode); + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(handle, mode); +#else + struct winsize w = {0, 0, 0, 0}; + ioctl(fileno(stdout), TIOCGWINSZ, &w); + consoleWidth_ = static_cast(w.ws_col); +#endif + if (consoleWidth_ == 0) { + consoleWidth_ = ConsoleDefaultWidth; + } + HLOGD("consoleWidth_:%d", consoleWidth_); +} + +void Report::OutputStdCallFrames(int indent, const ReportItemCallFrame &callFrame, + uint64_t totalEventCount) +{ + /* + 90% a + |- 80% b + c + d + |- 50% e + |- 50% f + g + */ + // this is the first call frame + if (!OutputStdCallFrame(indent, callFrame.func_, callFrame.eventCount_, totalEventCount)) { + // this tree will skipped. + return; + } + + // print it self + if (callFrame.selfEventCount_ != 0 and callFrame.selfEventCount_ != callFrame.eventCount_) { + OutputStdCallFrame(indent + CALLSTACK_INDENT, "[run in self function]", + callFrame.selfEventCount_, callFrame.eventCount_); + } + + // printf children + // if only one children + if (callFrame.childs.size() == 1u and + callFrame.childs[0].eventCount_ == callFrame.eventCount_) { + HLOGV("childCallFream %*c %s", indent, ' ', callFrame.childs[0].func_.data()); + // don't indent if same count (only one 100% children) + OutputStdCallFrames(indent, callFrame.childs[0], callFrame.eventCount_); + } else { + // else a lot children + for (const ReportItemCallFrame &childCallFrame : callFrame.childs) { + HLOGV("childCallFream %*c %s", indent, ' ', childCallFrame.func_.data()); + OutputStdCallFrames(indent + CALLSTACK_INDENT, childCallFrame, callFrame.eventCount_); + } + } +} + +void Report::OutputStdContent(ReportEventConfigItem &config) +{ + // content print + auto it = config.reportItems_.begin(); + while (it != config.reportItems_.end()) { + const ReportItem &reportItem = it.operator*(); + // if we need skip it ? + if (reportItem.heat < option_.heatLimit_) { + it++; + continue; // below limit + } else { + fprintf(output_, "%*.2f%% ", FULL_PERCENTAGE_NUM_LEN, reportItem.heat); + } + OutputStdContentItem(reportItem); + if (reportItem.callStacks_.size() != 0) { + HLOGV("reportItem.callStacks_ %zu %s", reportItem.callStacks_.size(), + reportItem.ToDebugString().c_str()); + HLOG_ASSERT(reportItem.callStacks_.size() == 1u); + for (auto &callFrame : reportItem.callStacks_) { + OutputStdCallFrames(CALLSTACK_INDENT, callFrame, reportItem.eventCount_); + } + } + it++; + } +} + +void Report::OutputStdContentItem(const ReportItem &reportItem) +{ + // output by sort keys + for (auto sortKey : displayKeyNames_) { + ReportKey &reportKey = Report::reportKeyMap_.at(sortKey); + if (fprintf(output_, "%s ", reportKey.GetValue(reportItem).c_str()) < 0) { + return; + } + } + if (fprintf(output_, "\n") < 0) { + return; + } +} + +void Report::OutputStdItemHeating(float heat, float heat2) +{ + if (heat == heat2 and heat == 0.0f) { + fprintf(output_, "something error , all it is end.\n"); + } else if (heat2 == 0) { + // only have first + fprintf(output_, "%*.2f%% ", FULL_PERCENTAGE_NUM_LEN, heat); + fprintf(output_, "%*s ", FULL_PERCENTAGE_DIFF_LEN, ""); + } else if (heat == 0) { + // only have second + fprintf(output_, "%*s ", FULL_PERCENTAGE_LEN, ""); + fprintf(output_, "%+*.2f%% ", FULL_PERCENTAGE_DIFF_NUM_LEN, heat2); + } else if (heat2 > heat) { + fprintf(output_, "%s%*.2f%%%s ", TEXT_RED.c_str(), FULL_PERCENTAGE_NUM_LEN, heat, + TEXT_RESET.c_str()); + fprintf(output_, "%s%+*.2f%%%s ", TEXT_GREEN.c_str(), FULL_PERCENTAGE_DIFF_NUM_LEN, + heat2 - heat, TEXT_RESET.c_str()); + } else if (heat2 < heat) { + fprintf(output_, "%s%*.2f%%%s ", TEXT_GREEN.c_str(), FULL_PERCENTAGE_NUM_LEN, heat, + TEXT_RESET.c_str()); + fprintf(output_, "%s%+*.2f%%%s ", TEXT_RED.c_str(), FULL_PERCENTAGE_DIFF_NUM_LEN, + heat2 - heat, TEXT_RESET.c_str()); + } else { + // same heating + fprintf(output_, "%*.2f%% ", FULL_PERCENTAGE_NUM_LEN, heat); + fprintf(output_, "%+*.2f%% ", FULL_PERCENTAGE_DIFF_NUM_LEN, heat2 - heat); + } +} + +void Report::OutputStdContentDiff(ReportEventConfigItem &left, ReportEventConfigItem &right) +{ + // first we need found the match config + HLOGD("first count %zu second count %zu", left.reportItems_.size(), right.reportItems_.size()); + ReportItemsConstIt it = left.reportItems_.begin(); + ReportItemsConstIt it2 = right.reportItems_.begin(); + while (it != left.reportItems_.end()) { + // still have it2 ? + if (it2 != right.reportItems_.end()) { + // find the same item in it2 by same sort key + while (it2 != right.reportItems_.end()) { + if (MultiLevelSame(*it, *it2)) { + // we found the same item + // output the diff heating + if (it->heat > option_.heatLimit_ and it2->heat > option_.heatLimit_) { + OutputStdItemHeating(it->heat, it2->heat); + OutputStdContentItem(*it); + } + it++; + it2++; + break; // next it + } else { + // only print it2 item + if (it2->heat > option_.heatLimit_) { + OutputStdItemHeating(0.0f, it2->heat); + OutputStdContentItem(*it2); + } + it2++; + continue; // next it2 + } + } + } else { + // no more it2, go on print all the it + if (it->heat > option_.heatLimit_) { + OutputStdItemHeating(it->heat, 0.0f); + OutputStdContentItem(*it); + } + it++; + continue; // next it + } + } + while (it2 != right.reportItems_.end()) { + // if diff still have some item in it2 ,print it + OutputStdItemHeating(0, it2->heat); + OutputStdContentItem(*it2); + it2++; + continue; // next it2 + } +} + +void Report::OutputStdContentDiffOneSide(bool leftOnly, ReportItem &reportItem) +{ + if (reportItem.heat > option_.heatLimit_) { + if (leftOnly) { + OutputStdItemHeating(reportItem.heat, 0.0f); + } else { + OutputStdItemHeating(0.0f, reportItem.heat); + } + OutputStdContentItem(reportItem); + } +} + +void Report::OutputStd(FILE *output) +{ + output_ = output; + PrepareConsole(); + + for (auto &config : configs_) { + OutputStdStatistics(config); + OutputStdHead(config); + OutputStdContent(config); + } +} + +void Report::OutputStdDiff(FILE *output, Report &other) +{ + output_ = output; + PrepareConsole(); + + auto left = configs_.begin(); + while (left != configs_.end()) { + auto right = other.configs_.begin(); + while (right != other.configs_.end()) { + if (*left == *right) { + OutputStdStatistics(*left); + OutputStdHead(*left, true); + OutputStdContentDiff(*left, *right); + break; // check next left + } + right++; + } + left++; // go on left + } +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/ring_buffer.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/ring_buffer.cpp new file mode 100644 index 0000000..4aa2dbc --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/ring_buffer.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "RingBuffer" + +#include "ring_buffer.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +RingBuffer::RingBuffer(size_t size) : size_(size) +{ + if (size > 0) { + buf_ = std::make_unique(size); + } +} + +RingBuffer::~RingBuffer() {} + +// get size of the writable space +size_t RingBuffer::GetFreeSize() const +{ + return size_ - (head_.load(std::memory_order_relaxed) - tail_.load(std::memory_order_relaxed)); +} + +uint8_t *RingBuffer::AllocForWrite(size_t writeSize) +{ + size_t writeHead = head_.load(std::memory_order_relaxed); + size_t readHead = tail_.load(std::memory_order_acquire); + size_t writePos = writeHead % size_; + size_t readPos = readHead % size_; + writeSize_ = writeSize; + if (writePos < readPos) { + // |---writePos<---writeSize--->readPos---| + if (writePos + writeSize > readPos) { + return nullptr; + } + } else if (writePos == readPos and writeHead != readHead) { + // writePos catch up with readPos, but buffer is full + return nullptr; + } else { + // two cases: 1, writePos catch up with readPos, but buffer is empty + // 2, |---readPos---writePos<---writeSize--->| + if (writePos + writeSize > size_) { + // no enough space at the end + if (readPos < writeSize) { + return nullptr; + } + // wrap to the start, set mark byte + buf_.get()[writePos] = MARGIN_BYTE; + writeSize_ += (size_ - writePos); + writePos = 0; + } + } + + return buf_.get() + writePos; +} + +void RingBuffer::EndWrite() +{ + size_t head = head_.load(std::memory_order_relaxed); + head += writeSize_; + head_.store(head, std::memory_order_release); +} + +uint8_t *RingBuffer::GetReadData() +{ + size_t writeHead = head_.load(std::memory_order_acquire); + size_t readHead = tail_.load(std::memory_order_relaxed); + if (writeHead == readHead) { + return nullptr; + } + + readSize_ = 0; + size_t writePos = writeHead % size_; + size_t readPos = readHead % size_; + if (writePos <= readPos) { + // |<---data2--->writePos---readPos<---data1--->| + if (buf_.get()[readPos] == MARGIN_BYTE) { + if (writePos == 0) { + return nullptr; + } + readSize_ = (size_ - readPos); + readPos = 0; + } + } + // else |---readPos<---data--->writePos---| + perf_event_header *header = reinterpret_cast(buf_.get() + readPos); + readSize_ += header->size; + return buf_.get() + readPos; +} + +void RingBuffer::EndRead() +{ + size_t tail = tail_.load(std::memory_order_relaxed); + tail += readSize_; + tail_.store(tail, std::memory_order_release); +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/section_header.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/section_header.cpp new file mode 100644 index 0000000..fa3d0af --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/section_header.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 + +using namespace OHOS::Developtools::HiPerf::ELF; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +enum class NUMBER : int { + ZERO = 0, + ONE = 1, + TWO = 2, + THREE = 3, + FOUR = 4, + FIVE = 5, + SIX = 6, + SEVEN = 7, + EIGHT = 8, + NINE = 9, + TEN = 10, + ELEVEN = 11, + TWELVE = 12, +}; + +std::unique_ptr SectionHeader::MakeUnique(char * const shdrBuf, const size_t bufSize, + const size_t index) +{ + std::unique_ptr shdr {new (std::nothrow) SectionHeader()}; + if (shdr == nullptr) { + return nullptr; + } + if (!shdr->Init(shdrBuf, bufSize, index)) { + HLOGE("SectionHeader::Init(shdrBuf, bufSize, index) failed"); + DumpShdrBuf(shdrBuf, bufSize); + return nullptr; + } + return shdr; +} + +bool SectionHeader::ParseSecHeader32(char * const shdrBuf) +{ + uint32_t *u4Buf = reinterpret_cast(shdrBuf); + int index {0}; + nameIndex_ = u4Buf[index]; + index = static_cast(NUMBER::ONE); + secType_ = u4Buf[index]; + index = static_cast(NUMBER::TWO); + secFlags_ = u4Buf[index]; + index = static_cast(NUMBER::SIX); + link_ = u4Buf[index]; + index = static_cast(NUMBER::SEVEN); + info_ = u4Buf[index]; + index = static_cast(NUMBER::THREE); + secVaddr_ = u4Buf[index]; + index = static_cast(NUMBER::FOUR); + fileOffset_ = u4Buf[index]; + index = static_cast(NUMBER::FIVE); + secSize_ = u4Buf[index]; + index = static_cast(NUMBER::EIGHT); + secAddrAlign_ = u4Buf[index]; + index = static_cast(NUMBER::NINE); + secEntrySize_ = u4Buf[index]; + return true; +} + +bool SectionHeader::ParseSecHeader64(char * const shdrBuf) +{ + uint64_t *u8Buf = reinterpret_cast(shdrBuf); + uint32_t *u4Buf = reinterpret_cast(shdrBuf); + size_t index {0}; + nameIndex_ = u4Buf[index]; + index = static_cast(NUMBER::ONE); + secType_ = u4Buf[index]; + secFlags_ = u8Buf[index]; + index = static_cast(NUMBER::TEN); + link_ = u4Buf[index]; + index = static_cast(NUMBER::ELEVEN); + info_ = u4Buf[index]; + index = static_cast(NUMBER::TWO); + secVaddr_ = u8Buf[index]; + index = static_cast(NUMBER::THREE); + fileOffset_ = u8Buf[index]; + index = static_cast(NUMBER::FOUR); + secSize_ = u8Buf[index]; + index = static_cast(NUMBER::SIX); + secAddrAlign_ = u8Buf[index]; + index = static_cast(NUMBER::SEVEN); + secEntrySize_ = u8Buf[index]; + return true; +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.cpp new file mode 100644 index 0000000..de86194 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 "subcommand.h" + +#include "debug_logger.h" +#include "option.h" +#include "subcommand_help.h" +#include "utilities.h" + +using namespace std; +namespace OHOS { +namespace Developtools { +namespace HiPerf { +static std::map> g_SubCommandsMap; + +// parse option first +bool SubCommand::OnSubCommandOptions(std::vector args) +{ + // parse common first + if (!Option::GetOptionValue(args, "--dumpoptions", dumpOptions_)) { + return false; + } + if (!Option::GetOptionValue(args, "--help", showHelp_) + || !Option::GetOptionValue(args, "-h", showHelp_)) { + return false; + } + + if (showHelp_) { + if (!args.empty()) { + printf("unknown option '%s'\n", args.front().c_str()); + return false; + } + if (OnPreSubCommand()) { + return false; + } + } + + if (ParseOption(args)) { + if (dumpOptions_) { + DumpOptions(); + } + HLOGD(" args left over: (%zu): %s", args.size(), VectorToString(args).c_str()); + if (!args.empty()) { + printf("unknown option '%s'\n", args.front().c_str()); + return false; + } + } else { + HLOGD("incorrect option(s)\n"); + return false; + } + return true; +} + +bool SubCommand::RegisterSubCommand(std::string cmdName, std::unique_ptr subCommand) +{ + HLOGV("%s", cmdName.c_str()); + if (cmdName.empty()) { + HLOGE("unable to register empty subcommand!"); + return false; + } + if (cmdName.front() == '-') { + HLOGE("unable use '-' at the begin of subcommand '%s'", cmdName.c_str()); + return false; + } + + if (g_SubCommandsMap.count(cmdName) == 0) { + g_SubCommandsMap.insert(std::make_pair(cmdName, std::move(subCommand))); + return true; + } else { + HLOGE("subcommand '%s' already registered!", cmdName.c_str()); + return false; + } +} + +void SubCommand::ClearSubCommands() +{ + g_SubCommandsMap.clear(); +} + +const std::map> &SubCommand::GetSubCommands() +{ + HLOGV("enter"); + return g_SubCommandsMap; +} + +SubCommand *SubCommand::FindSubCommand(std::string cmdName) +{ + HLOGV("%s", cmdName.c_str()); + auto found = g_SubCommandsMap.find(cmdName); + if (found != g_SubCommandsMap.end()) { + // remove the subcmd itself + return found->second.get(); + } else { + return nullptr; + } +} +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.h b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.h new file mode 100644 index 0000000..5f5a683 --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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 HIPERF_SUBCOMMAND_H_ +#define HIPERF_SUBCOMMAND_H_ + +#include +#include +#include "utilities.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +class SubCommand { +public: + SubCommand(const std::string &name, const std::string &brief, const std::string &help) + : name_(name), brief_(brief), help_(help) + { + } + + virtual ~SubCommand() {} + + const std::string &Name() const + { + return name_; + } + const std::string &Brief() const + { + return brief_; + } + const std::string &Help() const + { + return help_; + } + + // parse option first + bool OnSubCommandOptions(std::vector args); + + // some help cmd + bool OnPreSubCommand() + { + if (showHelp_) { + printf("%s\n", Help().c_str()); + return true; + } + return false; + }; + + virtual void DumpOptions() const {} + + // args should be empty after all the args processed + virtual bool ParseOption(std::vector &args) + { + args.clear(); // all the args is processed + return true; + } + + // return false means cmd failed + virtual bool OnSubCommand(std::vector &args) = 0; + // some test code will use this for simple + bool OnSubCommand(std::string stringArgs) + { + auto args = StringSplit(stringArgs, " "); + return OnSubCommand(args); + }; + + // called from main + static bool RegisterSubCommand(std::string, std::unique_ptr); + + // get some cmd + static const std::map> &GetSubCommands(); + static SubCommand *FindSubCommand(std::string); + + // for test code + static void ClearSubCommands(); + +protected: + const std::string name_; + const std::string brief_; + std::string help_; + bool dumpOptions_ = false; + bool showHelp_ = false; +}; +} // namespace HiPerf +} // namespace Developtools +} // namespace OHOS +#endif // HIPERF_SUBCOMMAND_H_ diff --git a/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand_dump.cpp b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand_dump.cpp new file mode 100644 index 0000000..c41c02c --- /dev/null +++ b/host/trace_streamer/src/parser/hiperf_parser/hiperf/subcommand_dump.cpp @@ -0,0 +1,530 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * 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. + */ +#define HILOG_TAG "Dump" + +#include "subcommand_dump.h" + +#include +#include +#include +#include +#include + +#include "debug_logger.h" +#include "option.h" +#include "perf_event_record.h" +#include "perf_events.h" +#include "symbols_file.h" +#include "utilities.h" +#include "virtual_runtime.h" + +namespace OHOS { +namespace Developtools { +namespace HiPerf { +#define LEVEL1 (indent + 1) +#define LEVEL2 (indent + 2) +#define LEVEL3 (indent + 3) + +bool SubCommandDump::CheckInputFile() +{ + if (!dumpFileName_.empty()) { + if (elfFileName_.empty() && protobufDumpFileName_.empty()) { + return true; + } + } else if (!elfFileName_.empty()) { + if (protobufDumpFileName_.empty()) { + return true; + } + } else if (!protobufDumpFileName_.empty()) { + return true; + } else { // all is empty + dumpFileName_ = DEFAULT_DUMP_FILENAME; + return true; + } + + printf("options conflict, please check usage\n"); + return false; +} + +bool SubCommandDump::ParseOption(std::vector &args) +{ + HLOGV("enter"); + + if (!Option::GetOptionValue(args, "--head", dumpHeader_)) { + HLOGD("get option --head failed"); + return false; + } + if (!Option::GetOptionValue(args, "-f", dumpFeatures_)) { + HLOGD("get option -f failed"); + return false; + } + if (!Option::GetOptionValue(args, "-d", dumpData_)) { + HLOGD("get option -d failed"); + return false; + } + if (!Option::GetOptionValue(args, "--sympath", dumpSymbolsPaths_)) { + HLOGD("get option --sympath failed"); + return false; + } + if (!Option::GetOptionValue(args, "--elf", elfFileName_)) { + HLOGD("get option --elf failed"); + return false; + } +#if HAVE_PROTOBUF + if (!Option::GetOptionValue(args, "--proto", protobufDumpFileName_)) { + HLOGD("get option --proto failed"); + return false; + } +#endif + if (!Option::GetOptionValue(args, "--export", exportSampleIndex_)) { + HLOGD("get option --export failed"); + return false; + } + + if (dumpHeader_ || dumpFeatures_ || dumpData_) { + dumpAll_ = false; + } + + if (args.size() > 1) { + printf("unknown option %s\n", args[0].c_str()); + return false; + } + if (args.size() == 1) { + dumpFileName_ = args[0]; + args.clear(); + } + + return CheckInputFile(); +} + +SubCommandDump::~SubCommandDump() +{ + SymbolsFile::onRecording_ = true; // back to default for UT +} + +bool SubCommandDump::OnSubCommand(std::vector &args) +{ + HLOGV("enter"); + + if (!elfFileName_.empty()) { + return DumpElfFile(); + } + +#if HAVE_PROTOBUF + if (!protobufDumpFileName_.empty()) { + return DumpProtoFile(); + } +#endif + + if (access(dumpFileName_.c_str(), F_OK) != 0) { + printf("Can not access data file %s\n", dumpFileName_.c_str()); + return false; + } + // only one file should created + HLOG_ASSERT_MESSAGE(reader_ == nullptr, " reader_ %p\n", reader_.get()); + reader_ = PerfFileReader::Instance(dumpFileName_); + if (reader_ == nullptr) { + HLOGE("HiperfFileReader::Instance(%s) return null", dumpFileName_.c_str()); + return false; + } + + // any way tell symbols this is not on device + SymbolsFile::onRecording_ = false; + // we need unwind it (for function name match) even not give us path + vr_.SetDisableUnwind(false); + + if (!dumpSymbolsPaths_.empty()) { + // user give us path , we enable unwind + if (!vr_.SetSymbolsPaths(dumpSymbolsPaths_)) { + printf("Failed to set symbol path(%s)\n", VectorToString(dumpSymbolsPaths_).c_str()); + return false; + } + } + + if (dumpHeader_ || dumpAll_) { + DumpPrintFileHeader(indent_); + DumpAttrPortion(indent_); + } + + if (dumpAll_ || dumpData_) { + DumpDataPortion(indent_); + } + + if (dumpFeatures_ || dumpAll_) { + DumpFeaturePortion(indent_); + } + + return true; +} + +bool SubCommandDump::DumpElfFile() +{ + printf("dump elf: '%s'\n", elfFileName_.c_str()); + auto elf = SymbolsFile::CreateSymbolsFile(elfFileName_); + if (!elf->LoadSymbols("")) { + printf("load elf failed.\n"); + return false; + } else { + printf("load elf succeed.\n"); + } + return true; +} +#if HAVE_PROTOBUF +bool SubCommandDump::DumpProtoFile() +{ + printf("dump protobuf file: '%s'\n", protobufDumpFileName_.c_str()); + protobufInputFileReader_ = std::make_unique(); + if (!protobufInputFileReader_->Dump(protobufDumpFileName_)) { + printf("load proto failed.\n"); + return false; + } + return true; +} +#endif + +void SubCommandDump::PrintHeaderInfo(const int &indent) +{ + const perf_file_header &header = reader_->GetHeader(); + // magic + PrintIndent(indent, "magic: "); + for (size_t i = 0; i < sizeof(header.magic); ++i) { + PrintIndent(indent, "%c", header.magic[i]); + } + PrintIndent(indent, "\n"); + PrintIndent(indent, "header_size: %" PRId64 "\n", header.size); + if (header.size != sizeof(header)) { + HLOGW("record file header size doesn't match"); + } + PrintIndent(indent, "attr_size: %" PRId64 "\n", header.attrSize); + if (header.attrSize != sizeof(perf_file_attr)) { + HLOGW("attr size doesn't match"); + } + // attr + PrintIndent(indent, "attrs[file section]: offset %" PRId64 ", size %" PRId64 "\n", + header.attrs.offset, header.attrs.size); + // data + PrintIndent(indent, "data[file section]: offset %" PRId64 ", size %" PRId64 "\n", + header.data.offset, header.data.size); + PrintIndent(indent, "event_types[file section]: offset %" PRId64 ", size %" PRId64 "\n", + header.eventTypes.offset, header.eventTypes.size); + // feature + PrintIndent(indent, + "adds_features[]: 0x%" PRIX64 " 0x%" PRIX64 " 0x%" PRIX64 " 0x%" PRIX64 "\n", + *(reinterpret_cast(&header.features[0])), + *(reinterpret_cast(&header.features[8])), + *(reinterpret_cast(&header.features[16])), + *(reinterpret_cast(&header.features[24]))); +} + +void SubCommandDump::DumpPrintFileHeader(int indent) +{ + // print header + PrintHeaderInfo(indent); + + // print feature + auto features = reader_->GetFeatures(); + for (auto feature : features) { + PrintIndent(indent, "feature: %s\n", PerfFileSection::GetFeatureName(feature).c_str()); + } + + // read here , because we need found symbols + reader_->ReadFeatureSection(); + + SetDeviceArch(GetArchTypeFromUname(reader_->GetFeatureString(FEATURE::ARCH))); + + // found symbols in file + for (auto &featureSection : reader_->GetFeatureSections()) { + if (featureSection.get()->featureId_ == FEATURE::HIPERF_FILES_SYMBOL) { + const PerfFileSectionSymbolsFiles *sectionSymbolsFiles = + static_cast(featureSection.get()); + vr_.UpdateFromPerfData(sectionSymbolsFiles->symbolFileStructs_); + } + } +} + +static std::map g_sampleTypeNames = { + {PERF_SAMPLE_IP, "ip"}, + {PERF_SAMPLE_TID, "tid"}, + {PERF_SAMPLE_TIME, "time"}, + {PERF_SAMPLE_ADDR, "addr"}, + {PERF_SAMPLE_READ, "read"}, + {PERF_SAMPLE_CALLCHAIN, "callchain"}, + {PERF_SAMPLE_ID, "id"}, + {PERF_SAMPLE_CPU, "cpu"}, + {PERF_SAMPLE_PERIOD, "period"}, + {PERF_SAMPLE_STREAM_ID, "stream_id"}, + {PERF_SAMPLE_RAW, "raw"}, + {PERF_SAMPLE_BRANCH_STACK, "stack"}, + {PERF_SAMPLE_REGS_USER, "regs_user"}, + {PERF_SAMPLE_STACK_USER, "stack_user"}, + {PERF_SAMPLE_WEIGHT, "weight"}, + {PERF_SAMPLE_DATA_SRC, "data_src"}, + {PERF_SAMPLE_IDENTIFIER, "identifier"}, + {PERF_SAMPLE_TRANSACTION, "transaction"}, + {PERF_SAMPLE_REGS_INTR, "reg_intr"}, +}; + +void SubCommandDump::DumpSampleType(uint64_t sampleType, int indent) +{ + std::string names; + for (auto &pair : g_sampleTypeNames) { + if (sampleType & pair.first) { + if (!names.empty()) { + names.append(","); + } + names.append(pair.second); + } + } + PrintIndent(LEVEL1, "sample_type names: %s\n", names.c_str()); +} + +void SubCommandDump::DumpPrintEventAttr(const perf_event_attr &attr, int indent) +{ + PrintIndent(indent, "event_attr: \n"); + + PrintIndent(LEVEL1, "type %u, size %u, config %llu\n", attr.type, attr.size, attr.config); + + if (attr.freq != 0) { + PrintIndent(LEVEL1, "sample_freq %llu\n", attr.sample_freq); + } else { + PrintIndent(LEVEL1, "sample_period %llu\n", attr.sample_period); + } + + PrintIndent(LEVEL1, "sample_type (0x%llx) \n", attr.sample_type); + DumpSampleType(attr.sample_type, indent); + + PrintIndent(LEVEL1, "read_format (0x%llx) \n", attr.read_format); + + PrintIndent(LEVEL1, "disabled %u, inherit %u, pinned %u, exclusive %u\n", attr.disabled, + attr.inherit, attr.pinned, attr.exclusive); + + PrintIndent(LEVEL1, "exclude_user %u, exclude_kernel %u, exclude_hv %u, exclude_idle %u\n", + attr.exclude_user, attr.exclude_kernel, attr.exclude_hv, attr.exclude_idle); + + PrintIndent(LEVEL1, "mmap %u, mmap2 %u, comm %u, comm_exec %u, freq %u\n", attr.mmap, + attr.mmap2, attr.comm, attr.comm_exec, attr.freq); + + PrintIndent(LEVEL1, "inherit_stat %u, enable_on_exec %u, task %u, use_clockid %u\n", + attr.inherit_stat, attr.enable_on_exec, attr.task, attr.use_clockid); + + PrintIndent(LEVEL1, "watermark %u, precise_ip %u, mmap_data %u, clockid %u\n", attr.watermark, + attr.precise_ip, attr.mmap_data, attr.clockid); + + PrintIndent(LEVEL1, "sample_id_all %u, exclude_host %u, exclude_guest %u\n", attr.sample_id_all, + attr.exclude_host, attr.exclude_guest); + PrintIndent(LEVEL1, "branch_sample_type 0x%llx\n", attr.branch_sample_type); + PrintIndent(LEVEL1, "exclude_callchain_kernel %u, exclude_callchain_user %u\n", + attr.exclude_callchain_kernel, attr.exclude_callchain_user); + PrintIndent(LEVEL1, "sample_regs_user 0x%llx\n", attr.sample_regs_user); + PrintIndent(LEVEL1, "sample_stack_user 0x%x\n", attr.sample_stack_user); +} + +void SubCommandDump::DumpAttrPortion(int indent) +{ + attrIds_ = reader_->GetAttrSection(); + for (size_t i = 0; i < attrIds_.size(); ++i) { + const AttrWithId &attr = attrIds_[i]; + PrintIndent(indent, "attr %zu:\n", i + 1); + DumpPrintEventAttr(attr.attr, indent_ + 1); + if (!attr.ids.empty()) { + PrintIndent(indent, " ids:"); + for (const auto &id : attr.ids) { + PrintIndent(indent, " %" PRId64, id); + } + PrintIndent(indent, "\n"); + } + } +} + +void SubCommandDump::ExprotUserStack(const PerfRecordSample &recordSample) +{ + if (recordSample.data_.reg_nr > 0 and recordSample.data_.dyn_size > 0) { + // __user_regs_

      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%0DX4LJ7VF}tyMu;@BdQmyjCF&Pc%xp-4QHjc zDc1%2hX8{dHO*;zl?7^S#G%{1WEl@c;)y~UkdW5X$vw#GYU^;QwBDz#rFKd-Rt?f( Vs{``pG&qN+Ic4AnJn+}S{|83CIxzqM literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/process_thread.png b/host/ide/src/figures/process_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..abc3867130c10413197482d0156ce0ee00aca255 GIT binary patch literal 1841 zcmbuAX;9PG7Qp{52xSRTQ&d8WfOUC@s6ZnD*$f2m0fLXPG|FN?0|tnR6bJ;Qj}prA zKpqrX5-p_^g9HWHG*AeTrYuoW0wg8^DPhw9DS;#q8rwH--i#mm;m!QcJ$KH``Ecgm z`@1<8e31sa#<~Ci7WqVN39Q|QIU2J@# zS4IL)FKgXNsPdUy-k2+*303-IoUcrs$r)y>c7_*UXz<>u-c#v zJex?os108A&VQCS9W%nfQc`OAlfkARBlq<9vStyv%Q-d2t#tA_vXnc4-^%%@ASA-0 zOf8=;z9LFYucu*6mlnWzbKS6TA!k5H^~YsZo`xouU|{}^v9tPJ@4ocmUu)* zXBX37u1H91Lpwb$7Vovu16KC>6g>48Y&MmwuH@vUQ*`pcvQ(`Iu&XxUH9Tw{R2VpS zILhz#q}Fb5*4O~&e0JEjqMH4q$Ia(5&@FubdvQq_n3n4{Pt48Fm@7MVcX&n{QD&-d zKh5@qY=03jF5GW>Yb<;>w_+*9zHW4Y5^>p{qzgvjn0Uu z9CZGaTlicr3G{f5cbBNA3%E24PQXZ~n+Z2r7fwXuffz#YDertYZ3>sWZ8oY71DOW^ z=FB`0hwPo{HeUM{lG~?ZlC8+jhc}KhEv>0k`+}x%yR18sL62}zGdOY!Rnb|MXyCAY z4Q4g=KaAQti<~dC;4S$mg?dxP$~GKnn2K98JqisYRB?F-@zT;l`Ele04AsQIeqxshU{OgTls3z>#n&SYO&~9P`y-XZ~^>1PZsB+a6 zu}o&;K;w!Wo#S%SdpuS)$IKOup?y;jV8x*JVVk=IDy7%f*7i9~<&y>8)xATm8{{oK zeXPfd?Xkp}KQCcc<9A3u1 zK21{=l}QHeKJ>w#6*pBu%4aNN98TfidY8z2U`5l-RDc}v-LT*vE`8mmGgF~(M<_{W zFQ26fi|(Oa80~M*0xmBt?S^;!p%6dwdm-nT3$8e&ox$GN&+lBdcR6{|d*5V0g44wy z=|ahCQ}fl<(H5MIUVEgfh3|_=TJ2iuPfUAK$665Nr7)cAmF( zBjqN^)jAo`r8Q?J@u;3xw!wo4d9R>bZG@#V5VxDQJ~jNx^57!~tAiZ#xor9p02KP1 zjtZQJd^l(ER7x}FkO~7yXBKA4{MQ^Qt@0!b+MzpDM|XbDr!VSe4iUVBEWtCi-|T%O zba2&CvMv99{1TiK0wo5rzW)~ETMw6t>Z<9+hf5fze t*=L%g&S!W{k<(|4sgh>R>;FsEp%`}UM(2S;KAP_i@N)M>G`NLl{tn0ixo-df literal 0 HcmV?d00001 diff --git a/host/ide/src/figures/samplecounter.jpg b/host/ide/src/figures/samplecounter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c84e9ebd15dd6f88c2c919fadca2391575188c9 GIT binary patch literal 137322 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