From 93288a639ec4c426871f058d713304069299c559 Mon Sep 17 00:00:00 2001 From: JustinYT Date: Mon, 28 Apr 2025 15:04:57 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=B0=83=E6=95=B4hiperf=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E5=8C=96=E5=A4=B1=E8=B4=A5=E6=97=B6=E5=B1=95=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F:=20so+pc=20->=20so+fileAddr.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- .../filter/perf_filter/perf_data_filter.cpp | 23 +++++++++++++------ .../src/filter/perf_filter/perf_data_filter.h | 2 ++ .../parser/hiperf_parser/perf_data_parser.cpp | 5 ++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp b/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp index 3709e4edd..5d343157c 100644 --- a/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp +++ b/trace_streamer/src/filter/perf_filter/perf_data_filter.cpp @@ -36,6 +36,14 @@ size_t PerfDataFilter::AppendPerfFiles(uint64_t fileId, uint32_t serial, DataInd return size; } +void PerfDataFilter::AppendInvalidVaddrIpToFuncName(uint64_t ip, DataIndex nameIndex) +{ + auto iter = invalidVaddrIpToFuncName_.find(ip); + if (iter == invalidVaddrIpToFuncName_.end()) { + invalidVaddrIpToFuncName_.emplace(ip, nameIndex); + } +} + void PerfDataFilter::BeforeReload() { traceDataCache_->GetPerfCallChainData()->Clear(); @@ -43,6 +51,7 @@ void PerfDataFilter::BeforeReload() fileIdToRowInFileTable_.Clear(); fileIds_.clear(); fileIdToRow_.clear(); + invalidVaddrIpToFuncName_.clear(); } void PerfDataFilter::Finish() { @@ -62,13 +71,12 @@ void PerfDataFilter::Finish() continue; } if (vaddrs[i] == 0 || symbolsIds[i] == -1) { - auto pathIndex = filePath[fileIdToRow_.at(fileIds[i])]; - auto fullPath = traceDataCache_->GetDataFromDict(pathIndex); - auto iPos = fullPath.find_last_of('/'); - fullPath = fullPath.substr(iPos + 1, -1); - auto nameIndex = traceDataCache_->GetDataIndex(fullPath + "@0x" + - base::number(ips[i] & flag, base::INTEGER_RADIX_TYPE_HEX)); - traceDataCache_->GetPerfCallChainData()->SetName(i, nameIndex); + auto iter = invalidVaddrIpToFuncName_.find(ips[i]); + if (iter != invalidVaddrIpToFuncName_.end()) { + traceDataCache_->GetPerfCallChainData()->SetName(i, iter->second); + } else { + TS_LOGE("invalidVaddrIpToFuncName_ can't find ip:%p", ips[i]); + } continue; } // if there has the file Id to which the function belongs,and the symboleid is not -1 and vaddrinfile is not -1. @@ -86,6 +94,7 @@ void PerfDataFilter::Finish() fileIdToRowInFileTable_.Clear(); fileIds_.clear(); fileIdToRow_.clear(); + invalidVaddrIpToFuncName_.clear(); } } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/filter/perf_filter/perf_data_filter.h b/trace_streamer/src/filter/perf_filter/perf_data_filter.h index 5698da906..e12221c9e 100644 --- a/trace_streamer/src/filter/perf_filter/perf_data_filter.h +++ b/trace_streamer/src/filter/perf_filter/perf_data_filter.h @@ -34,6 +34,7 @@ public: public: size_t AppendPerfFiles(uint64_t fileId, uint32_t serial, DataIndex symbols, DataIndex filePath); + void AppendInvalidVaddrIpToFuncName(uint64_t ip, DataIndex nameIndex); void Finish(); void BeforeReload(); @@ -41,6 +42,7 @@ private: DoubleMap fileIdToRowInFileTable_; std::set fileIds_; std::map fileIdToRow_{}; + std::map invalidVaddrIpToFuncName_{}; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp index 8bfd5bd6e..cbc557214 100644 --- a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp +++ b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp @@ -732,6 +732,11 @@ uint32_t PerfDataParser::UpdateCallChainUnCompressed(const std::unique_ptrpc, frame->funcOffset, frame->mapOffset, fileId, frame->index}; + if (frame->funcOffset == 0 || frame->index == -1) { + auto iPos = frame->funcName.find_last_of('/'); + auto nameIndex = traceDataCache_->dataDict_.GetStringIndex(frame->funcName.substr(iPos + 1, -1)); + streamFilters_->perfDataFilter_->AppendInvalidVaddrIpToFuncName(frame->pc, nameIndex); + } traceDataCache_->GetPerfCallChainData()->AppendNewPerfCallChain(perfCallChainRow); } return callChainId; -- Gitee From 7d94ffe7c31e8a1ee34db06c4a3d17b2673181dd Mon Sep 17 00:00:00 2001 From: JustinYT Date: Wed, 30 Apr 2025 13:37:26 +0800 Subject: [PATCH 2/8] adjsut hiperf build with hiviewdfx_faultloggerd,libbpf,bounds_checking_function,commonlibrary_c_utils,zlib,bzip2. Signed-off-by: JustinYT --- trace_streamer/build/build_base_func.sh | 1 + trace_streamer/build/ts.gni | 1 + trace_streamer/gn/BUILD.gn | 12 +- trace_streamer/pare_third_party.sh | 129 +------- .../patch_hiperf/hiviewdfx_faultloggerd.patch | 159 ++++++++++ .../prebuilts/patch_llvm/llvm.patch | 2 +- trace_streamer/src/BUILD.gn | 3 +- trace_streamer/src/base/BUILD.gn | 2 +- trace_streamer/src/filter/BUILD.gn | 10 +- .../src/filter/hook_filter/BUILD.gn | 2 +- .../src/parser/ebpf_parser/BUILD.gn | 2 +- .../src/parser/hiperf_parser/BUILD.gn | 290 ++++++++++++++++-- .../parser/hiperf_parser/perf_data_parser.cpp | 18 +- .../parser/hiperf_parser/perf_data_parser.h | 6 +- .../src/parser/pbreader_parser/BUILD.gn | 3 +- .../native_hook_parser/BUILD.gn | 2 +- .../src/parser/rawtrace_parser/BUILD.gn | 2 +- trace_streamer/src/rpc/ffrt_converter.cpp | 263 +++++++++------- trace_streamer/src/rpc/ffrt_converter.h | 58 ++-- trace_streamer/src/trace_data/BUILD.gn | 2 +- trace_streamer/test/BUILD.gn | 2 +- 21 files changed, 658 insertions(+), 311 deletions(-) create mode 100644 trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch diff --git a/trace_streamer/build/build_base_func.sh b/trace_streamer/build/build_base_func.sh index f635395e1..422928042 100644 --- a/trace_streamer/build/build_base_func.sh +++ b/trace_streamer/build/build_base_func.sh @@ -17,6 +17,7 @@ function help() { echo "Usage: $1 [linux/wasm/windows/macx] [debug] [-e ] [-d ]" echo " -e , enable the default plugins." echo " -d , enable the extend plugins." + echo " -m , enable the macro plugins." echo " -l Show the all plugin list." echo " -h Show the help info." exit diff --git a/trace_streamer/build/ts.gni b/trace_streamer/build/ts.gni index d2fdef54b..4e7b0ba7b 100644 --- a/trace_streamer/build/ts.gni +++ b/trace_streamer/build/ts.gni @@ -13,6 +13,7 @@ declare_args() { is_independent_compile = false + hiperf_debug = true enable_hiperf = true enable_ebpf = true enable_native_hook = true diff --git a/trace_streamer/gn/BUILD.gn b/trace_streamer/gn/BUILD.gn index 103762171..9cd142f53 100644 --- a/trace_streamer/gn/BUILD.gn +++ b/trace_streamer/gn/BUILD.gn @@ -59,6 +59,12 @@ config("default") { "-Wformat", "-Wno-unused-variable", ] + + # for third part hiperf + defines += [ "HIPERF_DEBUG" ] + + # for third part libbpf + defines += [ "__LITTLE_ENDIAN_BITFIELD" ] if (enable_hiperf) { defines += [ "ENABLE_HIPERF" ] } @@ -191,17 +197,17 @@ config("default") { cflags += [ "-D SUPPORTTHREAD" ] } if (is_win) { - cflags += [ "-D is_mingw" ] + cflags += [ "-D is_mingw=true" ] defines += [ "WIN32_LEAN_AND_MEAN" ] libs += [ "wsock32" ] libs += [ "ws2_32" ] cflags += [ "-Wno-attributes" ] } if (is_linux) { - cflags += [ "-D is_linux" ] + cflags += [ "-D is_linux=true" ] } if (is_mac) { - cflags += [ "-D is_mac" ] + cflags += [ "-D is_mac=true" ] } } diff --git a/trace_streamer/pare_third_party.sh b/trace_streamer/pare_third_party.sh index 498c209f4..a0b7cfa86 100755 --- a/trace_streamer/pare_third_party.sh +++ b/trace_streamer/pare_third_party.sh @@ -52,24 +52,14 @@ if [ ! -f "protobuf/BUILD.gn" ];then fi if [ ! -f "zlib/BUILD.gn" ];then - rm -rf zlib - git clone --depth=1 git@gitee.com:openharmony/third_party_zlib.git - if [ -d "third_party_zlib" ];then - mv third_party_zlib zlib - $cp ../prebuilts/patch_zlib/zlibbuild.gn zlib/BUILD.gn - fi + git clone --depth=1 git@gitee.com:openharmony/third_party_zlib.git zlib fi if [ ! -f "bzip2/BUILD.gn" ];then - rm -rf bzip2 - git clone --depth=1 git@gitee.com:openharmony/third_party_bzip2.git - if [ -d "third_party_bzip2" ];then - mv third_party_bzip2 bzip2 - $cp ../prebuilts/patch_bzip2/bzip2build.gn bzip2/BUILD.gn - cd bzip2 - ./install.sh $(pwd) - cd .. - fi + git clone --depth=1 git@gitee.com:openharmony/third_party_bzip2.git bzip2 + cd bzip2 + ./install.sh $(pwd) + cd .. fi if [ ! -f "googletest/BUILD.gn" ];then @@ -90,116 +80,27 @@ if [ ! -f "json/BUILD.gn" ];then fi fi -if [ ! -f "libunwind/BUILD.gn" ];then - rm -rf libunwind - git clone git@gitee.com:openharmony/third_party_libunwind.git - if [ -d "third_party_libunwind" ];then - mv third_party_libunwind libunwind - cd libunwind - git reset --hard 2c16627236d5e62c8fe78e088d21eca3c362c71c - cd .. - $cp ../prebuilts/patch_libunwind/libunwindbuild.gn libunwind/BUILD.gn - fi +if [ ! -d "libbpf" ];then + git clone --depth=1 git@gitee.com:openharmony/third_party_libbpf.git libbpf fi -if [ ! -f "perf_include/libbpf/linux/perf_event.h" ];then - mkdir -p perf_include/libbpf/linux - rm -rf perf_event.h - curl https://gitee.com/openharmony/third_party_libbpf/raw/20221117/github.com/libbpf/libbpf/refs/tags/v0.7.0/include/uapi/linux/perf_event.h > perf_event.h - mv perf_event.h perf_include/libbpf/linux/perf_event.h - $patch -p0 perf_include/libbpf/linux/perf_event.h ../prebuilts/patch_perf_event/perf_event.h.patch +if [ ! -d "hiviewdfx/faultloggerd" ];then + git clone --depth=1 git@gitee.com:openharmony/hiviewdfx_faultloggerd.git hiviewdfx/faultloggerd/ + cd hiviewdfx/faultloggerd + $patch -p1 < ../../../prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch + cd ../../ fi -if [ ! -d "perf_include/hiviewdfx/faultloggerd" ];then - rm -rf hiviewdfx_faultloggerd perf_include/hiviewdfx/faultloggerd - mkdir -p perf_include/hiviewdfx/faultloggerd/interfaces/innerkits - git clone git@gitee.com:openharmony/hiviewdfx_faultloggerd.git - cd hiviewdfx_faultloggerd - git reset --hard 7296f69c0d418cd9353638f3117296e4b494e4e5 - cd .. - mv hiviewdfx_faultloggerd/common/ perf_include/hiviewdfx/faultloggerd - mv hiviewdfx_faultloggerd/interfaces/common/ perf_include/hiviewdfx/faultloggerd/interfaces - mv hiviewdfx_faultloggerd/interfaces/nonlinux/ perf_include/hiviewdfx/faultloggerd/interfaces - mv hiviewdfx_faultloggerd/interfaces/innerkits/unwinder/ perf_include/hiviewdfx/faultloggerd/interfaces/innerkits - find perf_include/hiviewdfx/faultloggerd -type f -name "*.gn" -delete - $cp ../prebuilts/patch_hiperf/hiviewdfx_BUILD.gn ../third_party/perf_include/hiviewdfx/BUILD.gn - rm -rf hiviewdfx_faultloggerd - rm -rf perf_include/hiviewdfx/common/build - rm -rf perf_include/hiviewdfx/common/cutil - rm perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_regs_x86_64.cpp - $sed -i '/TRAP_BRANCH/s/^/\/\/ /' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_signal.cpp - $sed -i '/TRAP_HWBKPT/s/^/\/\/ /' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_signal.cpp - $sed -i '/is_ohos/s/is_ohos/true/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_mmap.cpp - $sed -i '/is_ohos/s/is_ohos/true/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_regs.h - $sed -i '/#include /a #include "debug_logger.h"' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/unwinder.h - $sed -i '/getpid() == gettid()/s/getpid() == gettid()/false/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/unwinder.cpp - $sed -i '/!realpath(path, realPath)/s/!realpath(path, realPath)/false/g' perf_include/hiviewdfx/faultloggerd/common/dfxutil/dfx_util.cpp - $sed -i '/#include "dfx_util.h"/a #include "utilities.h"' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_mmap.cpp - $sed -i '/#include /a #include "utilities.h"' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_mmap.h - $sed -i '/#if is_ohos && !is_mingw/s/#if is_ohos && !is_mingw/#if is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_elf.h - $sed -i '/#if is_ohos && !is_mingw/s/#if is_ohos && !is_mingw/#if is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_elf.cpp - $sed -i '/#if is_ohos/s/#if is_ohos/#if true/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_elf.h - $sed -i '/#if is_ohos/s/#if is_ohos/#if true/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_elf.cpp - $sed -i '/#ifndef is_ohos_lite/s/#ifndef is_ohos_lite/#if false/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_elf.cpp - $sed -i '/#if is_mingw/s/#if is_mingw/#ifndef is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_elf.cpp - $sed -i '/#if !is_mingw/s/#if !is_mingw/#if is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_elf_define.h - $sed -i '/#if is_mingw/s/#if is_mingw/#ifndef is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include/dfx_elf_parser.h - $sed -i '/#define DFX_NONLINUX_DEFINE_H/a #ifndef is_linux' perf_include/hiviewdfx/faultloggerd/interfaces/nonlinux/dfx_nonlinux_define.h - $sed -i '/#if is_mingw/s/#if is_mingw/#ifndef is_linux/g' perf_include/hiviewdfx/faultloggerd/interfaces/common/byte_order.h - $sed -i '$a #endif' perf_include/hiviewdfx/faultloggerd/interfaces/nonlinux/dfx_nonlinux_define.h - $cp ../prebuilts/patch_hiperf/string_view_util.h ../third_party/perf_include/hiviewdfx/faultloggerd/common/dfxutil/string_view_util.h -fi if [ ! -f "hiperf/BUILD.gn" ];then - rm -rf hiperf developtools_hiperf - git clone git@gitee.com:openharmony/developtools_hiperf.git - cd developtools_hiperf - git reset --hard 9d189f41d76c1ae6e8e12238aef5ef5b8cdbc09f - cd .. - if [ -d "developtools_hiperf" ];then - mv developtools_hiperf hiperf - $cp ../prebuilts/patch_hiperf/BUILD.gn ../third_party/hiperf/BUILD.gn - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/virtual_thread.h - # $sed -i "s/HIPERF_DEBUG/ALWAYSTRUE/g" hiperf/include/virtual_thread.h - $sed -i "/#include \"report_json_file.h\"/s/^\(.*\)$/\/\/\1/g" hiperf/include/report.h - $sed -i "/#include /s/^\(.*\)$/\/\/\1/g" hiperf/include/debug_logger.h - $sed -i "/#include /s/^\(.*\)$/\/\/\1/g" hiperf/include/utilities.h - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/virtual_thread.h - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/callstack.h - # $sed -i '/unwinder.h/s/^/\/\/ /' hiperf/include/callstack.h - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/symbols_file.h - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/virtual_runtime.h - $sed -i "/FRIEND_TEST/s/^\(.*\)$/\/\/\1/g" hiperf/include/report.h - $sed -i "s/HIPERF_DEBUG/ALWAYSTRUE/g" hiperf/include/virtual_thread.h - # $sed -i "/using __s8 = char;/a #define unw_word_t uint64_t" hiperf/include/nonlinux/linux/types.h - # $sed -i '/^void Report::PrepareConsole(/,/^}/ s/^.*$/\/\/&/; /^void Report::PrepareConsole(/,/return;/ s/^[[:blank:]]*/ /' hiperf/src/report.cpp - # $sed -i '/namespace HiPerf {/avoid Report::PrepareConsole(){ return;}' hiperf/src/report.cpp - # $sed -i '/HITRACE_METER_NAME/s/^/\/\/ /' hiperf/src/callstack.cpp - # $sed -i '/hitrace_meter.h/s/^/\/\/ /' hiperf/src/callstack.cpp - # $sed -i '/dlfcn.h/s/^/\/\/ /' hiperf/src/callstack.cpp - # $sed -i '/dfx_ark.h/s/^/\/\/ /' hiperf/src/callstack.cpp - # $sed -i '/dfx_regs.h/s/^/\/\/ /' hiperf/src/callstack.cpp - $sed -i '/return DoUnwind2/s/^/\/\/ /' hiperf/src/callstack.cpp - # $sed -i '/#if defined(is_ohos) && is_ohos/s/defined(is_ohos) && is_ohos/true/g' hiperf/src/virtual_runtime.cpp - # $sed -i '/#if defined(is_ohos) && is_ohos/s/defined(is_ohos) && is_ohos/true/g' hiperf/include/virtual_runtime.h - # $sed -i '/symbolsTable, elfFile_, elfPath/s/symbolsTable, elfFile_, elfPath/symbolsTable, elfFile_, filePath_/g' hiperf/src/symbols_file.cpp - $sed -i '/spe_decoder.h/s/^/\/\/ /' hiperf/src/virtual_runtime.cpp - $sed -i '/spe_decoder.h/s/^/\/\/ /' hiperf/src/perf_event_record.cpp - fi + git clone --depth=1 -b adjust_build_for_smartperf_host git@gitee.com:li-yiting880505/developtools_hiperf_1.git hiperf fi if [ ! -f "bounds_checking_function/BUILD.gn" ];then - rm -rf bounds_checking_function git clone --depth=1 git@gitee.com:openharmony/third_party_bounds_checking_function.git bounds_checking_function - $cp ../prebuilts/patch_bounds_checking_function/bounds_checking_functionbuild.gn bounds_checking_function/BUILD.gn fi -if [ ! -d "commonlibrary" ];then - rm -rf commonlibrary - git clone --depth=1 git@gitee.com:openharmony/commonlibrary_c_utils.git - if [ -d "commonlibrary_c_utils" ];then - mv commonlibrary_c_utils commonlibrary - rm -rf commonlibrary_c_utils - fi +if [ ! -d "commonlibrary/c_utils" ];then + git clone --depth=1 git@gitee.com:openharmony/commonlibrary_c_utils.git commonlibrary/c_utils fi if [ ! -f "profiler/device/plugins/ftrace_plugin/include/ftrace_common_type.h" ];then diff --git a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch new file mode 100644 index 000000000..088df2a36 --- /dev/null +++ b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch @@ -0,0 +1,159 @@ +diff --git a/common/dfxutil/string_view_util.h b/common/dfxutil/string_view_util.h +index b44a59ea775b368b93391ce19b440f617c309477..7dbd3568df9035edea91e920bf12fa5c58fe116f 100644 +--- a/common/dfxutil/string_view_util.h ++++ b/common/dfxutil/string_view_util.h +@@ -24,6 +24,24 @@ + + namespace OHOS { + namespace HiviewDFX { ++#ifdef is_mac ++class SpinLock { ++public: ++ void lock() ++ { ++ while (locked_.test_and_set(std::memory_order_acquire)) { ++ ; ++ } ++ } ++ void unlock() ++ { ++ locked_.clear(std::memory_order_release); ++ } ++ ++private: ++ std::atomic_flag locked_ = ATOMIC_FLAG_INIT; ++}; ++#endif + class StringViewHold { + public: + static StringViewHold &Get() +@@ -34,50 +52,77 @@ public: + + const char* Hold(STRING_VIEW view) + { ++#ifndef is_mac + pthread_spin_lock(&spin_lock_); ++#else ++ std::lock_guard lockGurand(spinlock_); ++#endif + if (view.size() == 0) { ++#ifndef is_mac + pthread_spin_unlock(&spin_lock_); ++#endif + return ""; + } + + char *p = new (std::nothrow) char[view.size() + 1]; + if (p == nullptr) { ++#ifndef is_mac + pthread_spin_unlock(&spin_lock_); ++#endif + return ""; + } + if (memset_s(p, view.size() + 1, '\0', view.size() + 1) != 0) { ++#ifndef is_mac + pthread_spin_unlock(&spin_lock_); ++#endif + return ""; + } + std::copy(view.data(), view.data() + view.size(), p); + views_.emplace_back(p); ++#ifndef is_mac + pthread_spin_unlock(&spin_lock_); ++#endif + return p; + } + + // only use in UT + void Clean() + { ++#ifndef is_mac + pthread_spin_lock(&spin_lock_); ++#else ++ std::lock_guard lockGurand(spinlock_); ++#endif + for (auto &p : views_) { + delete[] p; + } + views_.clear(); ++#ifndef is_mac + pthread_spin_unlock(&spin_lock_); ++#endif + } ++ + private: ++#ifndef is_mac + StringViewHold() + { + pthread_spin_init(&spin_lock_, PTHREAD_PROCESS_PRIVATE); + } ++#endif + ~StringViewHold() + { + Clean(); ++#ifndef is_mac + pthread_spin_destroy(&spin_lock_); ++#endif + } + + std::vector views_; ++#ifndef is_mac + pthread_spinlock_t spin_lock_; ++#else ++ SpinLock spinlock_; ++#endif + }; + } // namespace HiviewDFX + } // namespace OHOS +diff --git a/interfaces/common/byte_order.h b/interfaces/common/byte_order.h +index 3c40993ec56288deec6e40420a97d182587e9b62..a55d9db076a6fe1476a52a102fb968adb08073d7 100644 +--- a/interfaces/common/byte_order.h ++++ b/interfaces/common/byte_order.h +@@ -16,7 +16,7 @@ + #ifndef BYTE_ORDER_H + #define BYTE_ORDER_H + +-#if is_mingw ++#if is_mingw || is_mac + #define UNWIND_LITTLE_ENDIAN 1234 + #define UNWIND_BIG_ENDIAN 4321 + #define UNWIND_BYTE_ORDER -1 // Unknown +diff --git a/interfaces/innerkits/unwinder/include/dfx_elf_define.h b/interfaces/innerkits/unwinder/include/dfx_elf_define.h +index 6bc9394912c193417cbfe588551b07c255fce62a..a71d76b5641ec347f014736173137cf1115c446b 100644 +--- a/interfaces/innerkits/unwinder/include/dfx_elf_define.h ++++ b/interfaces/innerkits/unwinder/include/dfx_elf_define.h +@@ -17,7 +17,7 @@ + + #include + #include +-#if !is_mingw ++#if !is_mingw && !is_mac + #include + #include + #endif +diff --git a/interfaces/innerkits/unwinder/include/dfx_elf_parser.h b/interfaces/innerkits/unwinder/include/dfx_elf_parser.h +index b4c84437735176d28f7756930a8027152fc08155..86a4bdd197918e6246edf683eec2d213b1414803 100644 +--- a/interfaces/innerkits/unwinder/include/dfx_elf_parser.h ++++ b/interfaces/innerkits/unwinder/include/dfx_elf_parser.h +@@ -16,7 +16,7 @@ + #define DFX_ELF_PARSER_H + + #include +-#if is_mingw ++#if is_mingw || is_mac + #include "dfx_nonlinux_define.h" + #else + #include +diff --git a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp +index 9398e59acea6722bb1bfebcd0f312ee826a6f5a1..d071f2b934610fb15a921972a9eb97f3c646506f 100644 +--- a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp ++++ b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp +@@ -20,7 +20,7 @@ + #include + #include + #include +-#if is_mingw ++#if is_mingw || is_mac + #include "dfx_nonlinux_define.h" + #else + #include diff --git a/trace_streamer/prebuilts/patch_llvm/llvm.patch b/trace_streamer/prebuilts/patch_llvm/llvm.patch index 3dbb0d441..fcde97762 100644 --- a/trace_streamer/prebuilts/patch_llvm/llvm.patch +++ b/trace_streamer/prebuilts/patch_llvm/llvm.patch @@ -144,7 +144,7 @@ index 56d5b2ce7dc3..827184b7a5e0 100644 + deps = [ + "//llvm/include/llvm/Config:config", + "//llvm/lib/Demangle", -+ "//third_party/zlib:libz", ++ "//src/parser/hiperf_parser:libz", + ] + } else { + deps = [ diff --git a/trace_streamer/src/BUILD.gn b/trace_streamer/src/BUILD.gn index 2a07f3840..c40825e3d 100644 --- a/trace_streamer/src/BUILD.gn +++ b/trace_streamer/src/BUILD.gn @@ -106,11 +106,10 @@ ohos_source_set("trace_streamer_source") { "filter:filter", "metrics:metrics_parser", "parser:parser", + "parser/hiperf_parser:libsec_static", "proto_reader:proto_reader", "table:table", "trace_data:trace_data", - "//third_party/bounds_checking_function:libsec_static", - "//third_party/perf_include/hiviewdfx:libfaultloggerd", ] public_configs = [ ":trace_streamer_cfg" ] public_deps = [] diff --git a/trace_streamer/src/base/BUILD.gn b/trace_streamer/src/base/BUILD.gn index f577bc201..2996b3d61 100644 --- a/trace_streamer/src/base/BUILD.gn +++ b/trace_streamer/src/base/BUILD.gn @@ -17,7 +17,7 @@ ohos_source_set("base") { subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" part_name = "${OHOS_PROFILER_PART_NAME}" public_deps = [ - "${THIRD_PARTY}/zlib:libz", + "../parser/hiperf_parser:libz", "sqlite_ext:sqliteext", ] include_dirs = [ diff --git a/trace_streamer/src/filter/BUILD.gn b/trace_streamer/src/filter/BUILD.gn index cbe1e74f1..3dd8f2b12 100644 --- a/trace_streamer/src/filter/BUILD.gn +++ b/trace_streamer/src/filter/BUILD.gn @@ -46,12 +46,12 @@ config("filter_cfg") { "${THIRD_PARTY}/sqlite/include", "${PERF_DIR}/hiperf/include", "${PERF_DIR}/hiperf/include/nonlinux/linux", - "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include", - "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/nonlinux", - "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/common", - "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/common/dfxutil", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/nonlinux", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/common", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/dfxutil", "${PERF_DIR}/hiperf/include/nonlinux", - "${THIRD_PARTY}/perf_include/libbpf", + "${THIRD_PARTY}/libbpf/include/uapi", "${THIRD_PARTY}/bounds_checking_function/include", "${THIRD_PARTY}/json/single_include/nlohmann", "../proto_reader/include", diff --git a/trace_streamer/src/filter/hook_filter/BUILD.gn b/trace_streamer/src/filter/hook_filter/BUILD.gn index 8af327660..12edd4c68 100644 --- a/trace_streamer/src/filter/hook_filter/BUILD.gn +++ b/trace_streamer/src/filter/hook_filter/BUILD.gn @@ -17,7 +17,7 @@ import("../../../build/ts.gni") config("native_hook_filter_cfg") { include_dirs = [ ".", - "${COMMON_LIBRARY}/base/include", + "${COMMON_LIBRARY}/c_utils/base/include", ] } diff --git a/trace_streamer/src/parser/ebpf_parser/BUILD.gn b/trace_streamer/src/parser/ebpf_parser/BUILD.gn index 31f6667c0..9446f8527 100644 --- a/trace_streamer/src/parser/ebpf_parser/BUILD.gn +++ b/trace_streamer/src/parser/ebpf_parser/BUILD.gn @@ -77,7 +77,7 @@ ohos_static_library("ebpf_parser") { public_configs = [ ":ebpf_parser_cfg" ] public_deps = [ "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/memory_data:memory_data_reader", - "${PERF_DIR}/hiperf:hiperf_src", + "../hiperf_parser:ts_hiperf_src", ] deps = [ "${THIRD_PARTY}/protobuf:protobuf_lite_static", diff --git a/trace_streamer/src/parser/hiperf_parser/BUILD.gn b/trace_streamer/src/parser/hiperf_parser/BUILD.gn index 81a43fd64..0dd179d13 100644 --- a/trace_streamer/src/parser/hiperf_parser/BUILD.gn +++ b/trace_streamer/src/parser/hiperf_parser/BUILD.gn @@ -14,6 +14,242 @@ import("//build/ohos.gni") import("../../../build/ts.gni") +# THIRD_PARTY for bzip2 +config("bzip2_config") { + include_dirs = [ "${THIRD_PARTY}/bzip2" ] +} + +ohos_source_set("bzip2_src") { + sources = [ + "${THIRD_PARTY}/bzip2/blocksort.c", + "${THIRD_PARTY}/bzip2/bzlib.c", + "${THIRD_PARTY}/bzip2/compress.c", + "${THIRD_PARTY}/bzip2/crctable.c", + "${THIRD_PARTY}/bzip2/decompress.c", + "${THIRD_PARTY}/bzip2/huffman.c", + "${THIRD_PARTY}/bzip2/randtable.c", + ] + configs += [ ":bzip2_config" ] + + part_name = "bzip2" + subsystem_name = "thirdparty" +} + +ohos_source_set("libbz2") { + deps = [ ":bzip2_src" ] + public_configs = [ ":bzip2_config" ] + + part_name = "bzip2" + subsystem_name = "thirdparty" +} + +# THIRD_PARTY for zlib +config("zlib_config") { + cflags = [ + "-Wno-incompatible-pointer-types", + "-Werror", + "-Wno-strict-prototypes", + "-Wimplicit-function-declaration", + "-D HAVE_BZIP2", + ] +} + +config("zlib_public_config") { + include_dirs = [ "${THIRD_PARTY}/zlib" ] +} + +sources_zlib_with_ts_common = [ + "${THIRD_PARTY}/zlib/adler32.c", + "${THIRD_PARTY}/zlib/compress.c", + "${THIRD_PARTY}/zlib/contrib/minizip/ioapi.c", + "${THIRD_PARTY}/zlib/contrib/minizip/unzip.c", + "${THIRD_PARTY}/zlib/contrib/minizip/zip.c", + "${THIRD_PARTY}/zlib/crc32.c", + "${THIRD_PARTY}/zlib/deflate.c", + "${THIRD_PARTY}/zlib/gzclose.c", + "${THIRD_PARTY}/zlib/gzlib.c", + "${THIRD_PARTY}/zlib/gzread.c", + "${THIRD_PARTY}/zlib/gzwrite.c", + "${THIRD_PARTY}/zlib/infback.c", + "${THIRD_PARTY}/zlib/inffast.c", + "${THIRD_PARTY}/zlib/inflate.c", + "${THIRD_PARTY}/zlib/inftrees.c", + "${THIRD_PARTY}/zlib/trees.c", + "${THIRD_PARTY}/zlib/uncompr.c", + "${THIRD_PARTY}/zlib/zutil.c", +] +ohos_source_set("libz") { + sources = sources_zlib_with_ts_common + configs += [ ":zlib_config" ] + public_configs = [ ":zlib_public_config" ] + public_deps = [ ":libbz2" ] + part_name = "zlib" + subsystem_name = "thirdparty" +} + +# THIRD_PARTY for bounds_checking_function +sources_libsec_with_ts_common = [ + "${THIRD_PARTY}/bounds_checking_function/src/fscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/fwscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/gets_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/memcpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/memmove_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/memset_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/scanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/securecutil.c", + "${THIRD_PARTY}/bounds_checking_function/src/secureinput_a.c", + "${THIRD_PARTY}/bounds_checking_function/src/secureinput_w.c", + "${THIRD_PARTY}/bounds_checking_function/src/secureprintoutput_a.c", + "${THIRD_PARTY}/bounds_checking_function/src/secureprintoutput_w.c", + "${THIRD_PARTY}/bounds_checking_function/src/snprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/sprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/sscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/strcat_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/strcpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/strncat_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/strncpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/strtok_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/swprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/swscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vfscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vfwscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vsnprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vsprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vsscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vswprintf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vswscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/vwscanf_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wcscat_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wcscpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wcsncat_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wcsncpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wcstok_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wmemcpy_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wmemmove_s.c", + "${THIRD_PARTY}/bounds_checking_function/src/wscanf_s.c", +] + +ohos_source_set("libsec_static") { + sources = sources_libsec_with_ts_common + include_dirs = [ "${THIRD_PARTY}/bounds_checking_function/include" ] + cflags = [ + "-D_INC_STRING_S", + "-D_INC_WCHAR_S", + "-D_SECIMP=//", + "-D_STDIO_S_DEFINED", + "-D_INC_STDIO_S", + "-D_INC_STDLIB_S", + "-D_INC_MEMORY_S", + ] +} + +# THIRD_PARTY for hiviewdfx faultloggerd +config("faultloggerd_config") { + cflags = [ + "-D ALWAYSTRUE", + "-D DFX_NO_PRINT_LOG", + "-D is_host", + ] +} +config("faultloggerd_public_config") { + include_dirs = [ + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/dfxlog", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/dfxutil", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/trace/include", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/common", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/nonlinux", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/include", + "${THIRD_PARTY}/bounds_checking_function/include", + "${COMMON_LIBRARY}/c_utils/base/include", + ] +} +sources_faultloggerd_with_ts_common = [ + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/dfxutil/dfx_util.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/common/trace/dfx_trace_dlsym.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/ark/dfx_hap.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/dfx_elf_parser.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/dfx_symbols.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/dfx_mmap.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/elf_factory.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/elf/elf_factory_selector.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/maps/dfx_map.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/maps/dfx_maps.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/memory/dfx_memory.cpp", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/src/utils/unwinder_config.cpp", +] +ohos_source_set("libfaultloggerd") { + sources = sources_faultloggerd_with_ts_common + configs += [ ":faultloggerd_config" ] + public_configs = [ ":faultloggerd_public_config" ] + public_deps = [ ":libsec_static" ] + part_name = "faultloggerd" + subsystem_name = "thirdparty" +} + +# THIRD_PARTY for hiperf +sources_platform_with_ts_common = [ + "${PERF_DIR}/hiperf/src/dwarf_encoding.cpp", + "${PERF_DIR}/hiperf/src/option.cpp", + "${PERF_DIR}/hiperf/src/perf_event_record.cpp", + "${PERF_DIR}/hiperf/src/perf_file_format.cpp", + "${PERF_DIR}/hiperf/src/perf_file_reader.cpp", + "${PERF_DIR}/hiperf/src/register.cpp", + "${PERF_DIR}/hiperf/src/report.cpp", + "${PERF_DIR}/hiperf/src/subcommand.cpp", + "${PERF_DIR}/hiperf/src/symbols_file.cpp", + "${PERF_DIR}/hiperf/src/unique_stack_table.cpp", + "${PERF_DIR}/hiperf/src/utilities.cpp", + "${PERF_DIR}/hiperf/src/virtual_runtime.cpp", + "${PERF_DIR}/hiperf/src/virtual_thread.cpp", +] + +if (hiperf_debug) { + sources_platform_with_ts_common += + [ "${PERF_DIR}/hiperf/src/debug_logger.cpp" ] +} + +config("ts_hiperf_config") { + cflags = [ + "-D ALWAYSTRUE", + "-D CONFIG_NO_HILOG", + ] + cflags_cc = [ + "-std=c++17", + "-fvisibility=hidden", + "-Wno-unused-variable", + ] +} +config("ts_hiperf_public_config") { + include_dirs = [ + "${PERF_DIR}/hiperf/include", + "${PERF_DIR}/hiperf/include/nonlinux", + "${PERF_DIR}/hiperf/include/nonlinux/linux", + ] + include_dirs += [ + "${THIRD_PARTY}/bounds_checking_function/include", + "${COMMON_LIBRARY}/c_utils/base/include", + "${THIRD_PARTY}/libbpf/include/uapi", + ] + if (is_mingw) { + cflags = [ "-includeMingW64Fix.h" ] + } +} +ohos_source_set("ts_hiperf_src") { + subsystem_name = "thirdparty" + part_name = "hiperf" + configs -= [ trace_cfg_path ] + configs += [ ":ts_hiperf_config" ] + public_configs = [ ":ts_hiperf_public_config" ] + public_deps = [ + ":libfaultloggerd", + ":libz", + ] + sources = sources_platform_with_ts_common +} + +# for hiperf parser config("hiperf_parser_cfg") { if (!is_independent_compile) { configs = [ "${TS_DIR}/gn:ts_config" ] @@ -46,7 +282,7 @@ config("hiperf_parser_cfg") { "${THIRD_PARTY}/bounds_checking_function/include", "${THIRD_PARTY}/sqlite/include", "${THIRD_PARTY}/protobuf/src", - "${COMMON_LIBRARY}/base/include", + "${COMMON_LIBRARY}/c_utils/base/include", "${THIRD_PARTY}/googletest/googletest/include", ] include_dirs += [ @@ -62,13 +298,10 @@ config("hiperf_parser_cfg") { ] include_dirs += [ "${THIRD_PARTY}/googletest/googletest/include", - "${THIRD_PARTY}/perf_include/libbpf", - "${THIRD_PARTY}/perf_include/include", - "${THIRD_PARTY}/perf_include", - "${THIRD_PARTY}/perf_include/linux", + "${THIRD_PARTY}/libbpf/include/uapi", "../hiperf_parser", "../hiperf_parser/include", - "${COMMON_LIBRARY}/base/include", + "${COMMON_LIBRARY}/c_utils/base/include", "${THIRD_PARTY}/sqlite", ] if (enable_addr2line) { @@ -82,28 +315,29 @@ config("hiperf_parser_cfg") { } } -ohos_static_library("hiperf_parser") { - subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" - part_name = "${OHOS_PROFILER_PART_NAME}" - sources = [ "perf_data_parser.cpp" ] - public_configs = [ - ":hiperf_parser_cfg", - "../../filter/perf_filter:hiperf_filter_cfg", - ] - public_deps = [ - "${PERF_DIR}/hiperf:hiperf_src", - "${THIRD_PARTY}/protobuf:protobuf_lite_static", - "${THIRD_PARTY}/protobuf:protobuf_static", - "//third_party/perf_include/hiviewdfx:libfaultloggerd", - ] - if (enable_addr2line) { - public_deps += [ - "${LLVM_ROOT}/lib/DebugInfo/DWARF", - "${LLVM_ROOT}/lib/DebugInfo/PDB", - "${LLVM_ROOT}/lib/DebugInfo/Symbolize", - "${LLVM_ROOT}/lib/Demangle", - "${LLVM_ROOT}/lib/Object", - "${LLVM_ROOT}/lib/Support", +if (enable_hiperf) { + ohos_static_library("hiperf_parser") { + subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" + part_name = "${OHOS_PROFILER_PART_NAME}" + sources = [ "perf_data_parser.cpp" ] + public_configs = [ + ":hiperf_parser_cfg", + "../../filter/perf_filter:hiperf_filter_cfg", + ] + public_deps = [ + ":ts_hiperf_src", + "${THIRD_PARTY}/protobuf:protobuf_lite_static", + "${THIRD_PARTY}/protobuf:protobuf_static", ] + if (enable_addr2line) { + public_deps += [ + "${LLVM_ROOT}/lib/DebugInfo/DWARF", + "${LLVM_ROOT}/lib/DebugInfo/PDB", + "${LLVM_ROOT}/lib/DebugInfo/Symbolize", + "${LLVM_ROOT}/lib/Demangle", + "${LLVM_ROOT}/lib/Object", + "${LLVM_ROOT}/lib/Support", + ] + } } } diff --git a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp index 8bfd5bd6e..ebee25de7 100644 --- a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp +++ b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.cpp @@ -683,17 +683,17 @@ void PerfDataParser::UpdateClockType() TS_LOGI("useClockId_ = %u, clockId_ = %u", useClockId_, clockId_); } } -bool PerfDataParser::RecordCallBack(std::unique_ptr record) +bool PerfDataParser::RecordCallBack(PerfEventRecord &record) { // tell process tree what happend for rebuild symbols - report_->virtualRuntime_.UpdateFromRecord(*record); + report_->virtualRuntime_.UpdateFromRecord(record); - if (record->GetType() == PERF_RECORD_SAMPLE) { - std::unique_ptr sample(static_cast(record.release())); + if (record.GetType() == PERF_RECORD_SAMPLE) { + auto *sample = static_cast(&record); uint32_t callChainId = UpdateCallChainUnCompressed(sample); UpdatePerfSampleData(callChainId, sample); - } else if (record->GetType() == PERF_RECORD_COMM) { - auto recordComm = static_cast(record.get()); + } else if (record.GetType() == PERF_RECORD_COMM) { + auto recordComm = static_cast(&record); auto range = tidToPid_.equal_range(recordComm->data_.tid); for (auto it = range.first; it != range.second; it++) { if (it->second == recordComm->data_.pid) { @@ -708,7 +708,7 @@ bool PerfDataParser::RecordCallBack(std::unique_ptr record) return true; } -uint32_t PerfDataParser::UpdateCallChainUnCompressed(const std::unique_ptr &sample) +uint32_t PerfDataParser::UpdateCallChainUnCompressed(const PerfRecordSample *sample) { std::string stackStr = ""; for (auto &callFrame : sample->callFrames_) { @@ -723,7 +723,7 @@ uint32_t PerfDataParser::UpdateCallChainUnCompressed(const std::unique_ptrdata_.tid)}); - uint32_t depth = 0; +uint32_t depth = 0; for (auto frame = sample->callFrames_.rbegin(); frame != sample->callFrames_.rend(); ++frame) { uint64_t fileId = INVALID_UINT64; auto fileDataIndex = traceDataCache_->dataDict_.GetStringIndex(frame->mapName); @@ -737,7 +737,7 @@ uint32_t PerfDataParser::UpdateCallChainUnCompressed(const std::unique_ptr &sample) +void PerfDataParser::UpdatePerfSampleData(uint32_t callChainId, const PerfRecordSample *sample) { auto perfSampleData = traceDataCache_->GetPerfSampleData(); uint64_t newTimeStamp = 0; diff --git a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.h b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.h index 1c885c6e6..b47ebf186 100644 --- a/trace_streamer/src/parser/hiperf_parser/perf_data_parser.h +++ b/trace_streamer/src/parser/hiperf_parser/perf_data_parser.h @@ -103,12 +103,12 @@ private: void UpdateReportWorkloadInfo() const; void UpdateSymbolAndFilesData(); void UpdateClockType(); - bool RecordCallBack(std::unique_ptr record); - void UpdatePerfSampleData(uint32_t callChainId, std::unique_ptr &sample); + bool RecordCallBack(PerfEventRecord &record); + void UpdatePerfSampleData(uint32_t callChainId, const PerfRecordSample *sample); std::tuple GetFileIdWithLikelyFilePath(const std::string &inputFilePath); bool ReloadPerfFile(const std::unique_ptr &symbolsFile, uint64_t &fileId, DataIndex &filePathIndex); void ReloadPerfCallChain(const std::unique_ptr &symbolsFile, uint64_t fileId, DataIndex filePathIndex); - uint32_t UpdateCallChainUnCompressed(const std::unique_ptr &sample); + uint32_t UpdateCallChainUnCompressed(const PerfRecordSample *sample); SplitPerfState DataLengthProcessing(const std::deque &dequeBuffer, perf_event_header &dataHeader, uint64_t size, diff --git a/trace_streamer/src/parser/pbreader_parser/BUILD.gn b/trace_streamer/src/parser/pbreader_parser/BUILD.gn index 26bbe946d..789ffc410 100644 --- a/trace_streamer/src/parser/pbreader_parser/BUILD.gn +++ b/trace_streamer/src/parser/pbreader_parser/BUILD.gn @@ -130,7 +130,6 @@ ohos_source_set("pbreader_parser_src") { "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/services:ts_all_type_cpp_standard", "${THIRD_PARTY}/protobuf:protobuf_lite_static", "${THIRD_PARTY}/protobuf:protobuf_static", - "${THIRD_PARTY}/zlib:libz", - "//third_party/perf_include/hiviewdfx:libfaultloggerd", + "../hiperf_parser:libz", ] } diff --git a/trace_streamer/src/parser/pbreader_parser/native_hook_parser/BUILD.gn b/trace_streamer/src/parser/pbreader_parser/native_hook_parser/BUILD.gn index 0e512554e..cd10c6bff 100644 --- a/trace_streamer/src/parser/pbreader_parser/native_hook_parser/BUILD.gn +++ b/trace_streamer/src/parser/pbreader_parser/native_hook_parser/BUILD.gn @@ -29,7 +29,7 @@ ohos_static_library("native_hook_parser") { "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/services:ts_all_type_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/ftrace_data/${device_kernel_version}:ftrace_data_reader", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/native_hook:native_hook_data_reader", - "${PERF_DIR}/hiperf:hiperf_src", + "../../hiperf_parser:ts_hiperf_src", ] public_configs = [ ":native_hook_parser_cfg", diff --git a/trace_streamer/src/parser/rawtrace_parser/BUILD.gn b/trace_streamer/src/parser/rawtrace_parser/BUILD.gn index 4786ec415..646ed3af7 100755 --- a/trace_streamer/src/parser/rawtrace_parser/BUILD.gn +++ b/trace_streamer/src/parser/rawtrace_parser/BUILD.gn @@ -29,7 +29,7 @@ config("rawtrace_parser_comm") { "${THIRD_PARTY}/bounds_checking_function/include", "${THIRD_PARTY}/json/single_include/nlohmann", "${PERF_DIR}/profiler/device/plugins/ftrace_plugin/include", - "${COMMON_LIBRARY}/base/include", + "${COMMON_LIBRARY}/c_utils/base/include", ] include_dirs += [ "${SRC}/trace_data/trace_stdtype", diff --git a/trace_streamer/src/rpc/ffrt_converter.cpp b/trace_streamer/src/rpc/ffrt_converter.cpp index 72b5f3e05..9065504b5 100644 --- a/trace_streamer/src/rpc/ffrt_converter.cpp +++ b/trace_streamer/src/rpc/ffrt_converter.cpp @@ -44,7 +44,7 @@ static bool WriteOutputFile(std::ofstream &outfile, std::vector &co std::vector file_buffer(BUFFER_SIZE); outfile.rdbuf()->pubsetbuf(file_buffer.data(), file_buffer.size()); - for (const auto& line : context_) { + for (const auto &line : context_) { outfile.write(line.c_str(), line.size()); outfile.put('\n'); } @@ -87,7 +87,7 @@ bool FfrtConverter::RecoverTraceAndGenerateNewFile(ConStr &ffrtFileName, std::of return WriteOutputFile(outFile, context_); } -static uint32_t ExtractProcessId(ConStr& log) +static uint32_t ExtractProcessId(ConStr &log) { size_t leftParen = log.find('('); size_t rightParen = log.find(')', leftParen); @@ -120,7 +120,7 @@ static uint32_t ExtractProcessId(ConStr& log) return processId; } -static int ExtractThreadId(ConStr& log) +static int ExtractThreadId(ConStr &log) { static const std::regex pattern(R"( \(\s*\d+\)\s+\[\d)"); std::smatch match; @@ -131,16 +131,14 @@ static int ExtractThreadId(ConStr& log) return INT_MAX; } -static std::string TrimRight(ConStr& str) +static std::string TrimRight(ConStr &str) { - auto end = std::find_if_not(str.rbegin(), str.rend(), [](unsigned char ch) { - return std::isspace(ch); - }).base(); + auto end = std::find_if_not(str.rbegin(), str.rend(), [](unsigned char ch) { return std::isspace(ch); }).base(); return std::string(str.begin(), end); } -static void ExtraceFfrtThreadInfoFromSchedSwitch(ConStr &log, std::string &tName, int& tid) +static void ExtraceFfrtThreadInfoFromSchedSwitch(ConStr &log, std::string &tName, int &tid) { static std::string prevComm = "prev_comm"; static std::string prevPid = "prev_pid="; @@ -183,10 +181,10 @@ static std::string ExtractCpuId(ConStr &log) return ""; } -static std::string ExtractTaskLable(ConStr& log) +static std::string ExtractTaskLable(ConStr &log) { size_t pos = log.find("|H:FFRT"); - if (pos != std::string::npos) { // ohos + if (pos != std::string::npos) { // ohos size_t startPos = pos + std::string("|H:FFRT").length(); size_t endPos = log.find("|", startPos); if (endPos != std::string::npos) { @@ -199,7 +197,7 @@ static std::string ExtractTaskLable(ConStr& log) return log.substr(startPos + 1, endPos - startPos - 1); } } - return ""; // Return empty string if no label found + return ""; // Return empty string if no label found } static void FindPrevAndNextPidForSchedSwitch(ConStr &log, int &prevPid, int &nextPid) @@ -218,7 +216,7 @@ static void FindPrevAndNextPidForSchedSwitch(ConStr &log, int &prevPid, int &nex void FfrtConverter::SetOSPlatformKey(const FfrtTidMap &ffrtTidMap) { - for (const auto& tinfo : ffrtTidMap) { + for (const auto &tinfo : ffrtTidMap) { if (tinfo.second.first.find("ffrtwk") != std::string::npos) { osPlatformKet_ = "nohos"; return; @@ -283,7 +281,7 @@ static void FindProcessNamePositions(ConStr &log, std::vector &indexs) } } -static void SplitLogs(std::vector &indexs, std::vector &newLogs, ConStr& log) +static void SplitLogs(std::vector &indexs, std::vector &newLogs, ConStr &log) { for (int i = 0; i < indexs.size(); i++) { int begin = indexs[i]; @@ -296,7 +294,7 @@ static void SplitLogs(std::vector &indexs, std::vector &new } } -static void GenFfrtPids(FfrtPids& ffrtPids, Info &info, FfrtTidMap &ffrtTidMap, WakeLogs &traceMap) +static void GenFfrtPids(FfrtPids &ffrtPids, Info &info, FfrtTidMap &ffrtTidMap, WakeLogs &traceMap) { for (const auto tid : info.second) { if (ffrtTidMap.find(tid) != ffrtTidMap.end()) { @@ -355,7 +353,7 @@ bool IsOldVersionTrace(ConStr &log) return true; } -void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& ffrtWakeLogs) +void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs) { PidMap pidMap; FfrtTidMap ffrtTidMap; @@ -384,10 +382,10 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& std::unordered_map> localPidMap; std::unordered_map>> locFfrtTidMap; std::unordered_map> locTraceMap; - std::vector& updates = threadUpdates[threadId]; + std::vector &updates = threadUpdates[threadId]; for (size_t lineno = start; lineno < end && lineno < context_.size(); ++lineno) { - const std::string& log = context_[lineno]; + const std::string &log = context_[lineno]; indexs.clear(); FindProcessNamePositions(log, indexs); @@ -415,13 +413,13 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& } { std::lock_guard lock(pidMutex); - for (const auto& [pid, tid_set] : localPidMap) { + for (const auto &[pid, tid_set] : localPidMap) { pidMap[pid].insert(tid_set.begin(), tid_set.end()); } } { std::lock_guard lock(tidMutex); - for (const auto& [tid, info] : locFfrtTidMap) { + for (const auto &[tid, info] : locFfrtTidMap) { if (ffrtTidMap.find(tid) == ffrtTidMap.end()) { ffrtTidMap[tid] = info; } @@ -429,8 +427,8 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& } { std::lock_guard lock(traceMutex); - for (const auto& [tid, traces] : locTraceMap) { - auto& target = traceMap[tid]; + for (const auto &[tid, traces] : locTraceMap) { + auto &target = traceMap[tid]; target.insert(target.end(), traces.begin(), traces.end()); } } @@ -441,35 +439,32 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& size_t end = std::min((i + 1) * chunkSize, context_.size()); threads.emplace_back(worker, i, start, end); } - for (auto& thread : threads) { + for (auto &thread : threads) { thread.join(); } std::vector allUpdates; - for (const auto& threadUpdate : threadUpdates) { + for (const auto &threadUpdate : threadUpdates) { allUpdates.insert(allUpdates.end(), threadUpdate.begin(), threadUpdate.end()); } std::sort(allUpdates.begin(), allUpdates.end(), - [](const ContextUpdate& a, const ContextUpdate& b) { - return a.position > b.position; - }); - for (const auto& update : allUpdates) { + [](const ContextUpdate &a, const ContextUpdate &b) { return a.position > b.position; }); + for (const auto &update : allUpdates) { context_.erase(context_.begin() + update.position); - context_.insert(context_.begin() + update.position, - update.new_logs.begin(), update.new_logs.end()); + context_.insert(context_.begin() + update.position, update.new_logs.begin(), update.new_logs.end()); } #else uint64_t lineno = 0; bool shouldCheck = true; std::vector indexs; indexs.reserve(ten); - auto classifyLogs = [this, &traceMap, &pidMap, &ffrtTidMap, &ffrtWakeLogs](ConVecStr& newLogs, size_t startLineNo) { + auto classifyLogs = [this, &traceMap, &pidMap, &ffrtTidMap, &ffrtWakeLogs](ConVecStr &newLogs, size_t startLineNo) { for (size_t i = 0; i < newLogs.size(); ++i) { auto logInfo = LogInfo{context_[startLineNo + i], static_cast(startLineNo + i), 0, 0}; FindFfrtProcClassifyLogs(logInfo, traceMap, pidMap, ffrtTidMap, ffrtWakeLogs); } }; while (lineno < context_.size()) { - ConStr& log = context_[lineno]; + ConStr &log = context_[lineno]; indexs.clear(); FindProcessNamePositions(log, indexs); if (shouldCheck && IsOldVersionTrace(log)) { @@ -491,7 +486,7 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& } #endif SetOSPlatformKey(ffrtTidMap); - for (auto& info : pidMap) { + for (auto &info : pidMap) { GenFfrtPids(ffrtPids, info, ffrtTidMap, traceMap); } } @@ -515,9 +510,7 @@ static size_t FindPatternStart(ConStr &log) ++bracketEnd; } - if (bracketEnd < log.length() && - log[bracketEnd] == '[' && - bracketEnd + 1 < log.length() && + if (bracketEnd < log.length() && log[bracketEnd] == '[' && bracketEnd + 1 < log.length() && isdigit(log[bracketEnd + 1])) { return pos; } @@ -625,8 +618,11 @@ void FfrtConverter::SetTracingMarkerKey(LogInfo logInfo) } } -void FfrtConverter::FindFfrtProcClassifyLogs(LogInfo logInfo, WakeLogs &traceMap, PidMap &pidMap, - FfrtTidMap &ffrtTidMap, FfrtWakeLogs &ffrtWakeLogs) +void FfrtConverter::FindFfrtProcClassifyLogs(LogInfo logInfo, + WakeLogs &traceMap, + PidMap &pidMap, + FfrtTidMap &ffrtTidMap, + FfrtWakeLogs &ffrtWakeLogs) { bool isPrevCommFfrt = logInfo.log.find("prev_comm=ffrt") != std::string::npos; bool isPrevCommFfrtOs = logInfo.log.find("prev_comm=OS_FFRT") != std::string::npos; @@ -748,9 +744,8 @@ static std::string MakeWakeupFakeLog(ConStr &log, const FakeLogArgs &fakeLogArgs { std::string mockTid = GenMockTid(fakeLogArgs.pid, fakeLogArgs.taskRunning); std::stringstream fakeLogStrm; - fakeLogStrm << log.substr(0, log.find(tracingMarkerKey)) << "sched_wakeup: comm=" << - fakeLogArgs.taskLabel << " pid=" << mockTid << " prio=" << - fakeLogArgs.prio << " target_cpu=" << fakeLogArgs.cpuId; + fakeLogStrm << log.substr(0, log.find(tracingMarkerKey)) << "sched_wakeup: comm=" << fakeLogArgs.taskLabel + << " pid=" << mockTid << " prio=" << fakeLogArgs.prio << " target_cpu=" << fakeLogArgs.cpuId; return fakeLogStrm.str(); } @@ -764,19 +759,15 @@ static std::string ReplaceSchedSwitchLog(ConStr &fakeLog, LogInfo logInfo, int g size_t index = fakeLog.find("("); result = " " + label + "-" + mockTid + " " + fakeLog.substr(index); } - result = result.substr(0, result.find("prev_comm=")) + - "prev_comm=" + label + - " " + result.substr(result.find("prev_pid=")); - result = result.substr(0, result.find("prev_pid=")) + - "prev_pid=" + mockTid + - " " + result.substr(result.find("prev_prio=")); + result = result.substr(0, result.find("prev_comm=")) + "prev_comm=" + label + " " + + result.substr(result.find("prev_pid=")); + result = result.substr(0, result.find("prev_pid=")) + "prev_pid=" + mockTid + " " + + result.substr(result.find("prev_prio=")); } else if (logInfo.log.find("next_pid=" + std::to_string(logInfo.tid)) != std::string::npos) { - result = result.substr(0, result.find("next_comm=")) + - "next_comm=" + label + - " " + result.substr(result.find("next_pid=")); - result = result.substr(0, result.find("next_pid=")) + - "next_pid=" + mockTid + - " " + result.substr(result.find("next_prio=")); + result = result.substr(0, result.find("next_comm=")) + "next_comm=" + label + " " + + result.substr(result.find("next_pid=")); + result = result.substr(0, result.find("next_pid=")) + "next_pid=" + mockTid + " " + + result.substr(result.find("next_prio=")); } return result; } @@ -807,11 +798,10 @@ static std::string ReplaceSchedBlockLog(ConStr &fakeLog, int pid, int gid) if (pos != std::string::npos) { pos = fakeLog.find("iowait=", pos); if (pos != std::string::npos) { - result = fakeLog.substr(0, fakeLog.find("pid=")) + "pid=" + - mockTid + " " + fakeLog.substr(pos); + result = fakeLog.substr(0, fakeLog.find("pid=")) + "pid=" + mockTid + " " + fakeLog.substr(pos); } else { - result = fakeLog.substr(0, fakeLog.find("pid=")) + "pid=" + - mockTid + " " + fakeLog.substr(fakeLog.find("io_wait=")); + result = fakeLog.substr(0, fakeLog.find("pid=")) + "pid=" + mockTid + " " + + fakeLog.substr(fakeLog.find("io_wait=")); } } return result; @@ -935,7 +925,7 @@ void FfrtConverter::FindQueueTaskInfo(FfrtPids &ffrtPids, QueueTaskInfo &queueTa { for (auto &pidItem : ffrtPids) { int pid = pidItem.first; - queueTaskInfo[pid] = {}; // Initialize map for this pid + queueTaskInfo[pid] = {}; // Initialize map for this pid for (auto &tidItem : pidItem.second) { std::vector &linenos = tidItem.second.second; @@ -988,12 +978,12 @@ void FfrtConverter::ExceTaskGroups(std::vector &group, WakeLogs &wakeLo if (wakeLogs.find(group[i].gid) != wakeLogs.end()) { int gid = group[i].gid; wakeLogs[firstGid].insert(wakeLogs[firstGid].end(), wakeLogs[gid].begin(), wakeLogs[gid].end()); - for (auto& lineno : group[i].begin) { + for (auto &lineno : group[i].begin) { size_t rightIndex = context_[lineno].find_last_of("|"); if (context_[lineno][rightIndex + 1] == 'I') { - context_[lineno] - = context_[lineno].substr(0, context_[lineno].substr(0, rightIndex).find_last_of("|") + 1) - + std::to_string(firstGid) + context_[lineno].substr(rightIndex) + "\n"; + context_[lineno] = + context_[lineno].substr(0, context_[lineno].substr(0, rightIndex).find_last_of("|") + 1) + + std::to_string(firstGid) + context_[lineno].substr(rightIndex) + "\n"; } else { context_[lineno] = context_[lineno].substr(0, rightIndex + 1) + std::to_string(firstGid) + "\n"; } @@ -1004,7 +994,7 @@ void FfrtConverter::ExceTaskGroups(std::vector &group, WakeLogs &wakeLo void FfrtConverter::HandleTaskGroups(std::vector> &taskGroups, WakeLogs &wakeLogs) { - for (auto& group : taskGroups) { + for (auto &group : taskGroups) { if (group.size() > 1) { int firstGid = group[0].gid; if (wakeLogs.find(firstGid) == wakeLogs.end()) { @@ -1016,15 +1006,15 @@ void FfrtConverter::HandleTaskGroups(std::vector> &taskGrou } } -void FfrtConverter::HandleFfrtQueueTasks(FfrtQueueTasks &ffrtQueueTasks, FfrtWakeLogs& ffrtWakeLogs) +void FfrtConverter::HandleFfrtQueueTasks(FfrtQueueTasks &ffrtQueueTasks, FfrtWakeLogs &ffrtWakeLogs) { for (auto &pidItem : ffrtQueueTasks) { WakeLogs tmp = {}; - WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) ? - ffrtWakeLogs[pidItem.first] : tmp; + WakeLogs &wakeLogs = + (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) ? ffrtWakeLogs[pidItem.first] : tmp; for (auto &qidItem : pidItem.second) { - auto cmp = [](tidInfo& value1, tidInfo& value2) {return value1.begin[0] < value2.begin[0];}; + auto cmp = [](tidInfo &value1, tidInfo &value2) { return value1.begin[0] < value2.begin[0]; }; std::sort(qidItem.second.begin(), qidItem.second.end(), cmp); std::vector> taskGroups; @@ -1045,8 +1035,8 @@ void FfrtConverter::HandleMarks(ConStr &log, int lineno, int pid) if (lostMarkPos != std::string::npos || faultMarkPos != std::string::npos) { if (tracingMarkerPos != std::string::npos) { - context_[lineno] = log.substr(0, tracingMarkerPos + tracingMarkerKey_.size()) - + "E|" + std::to_string(pid) + "\n"; + context_[lineno] = + log.substr(0, tracingMarkerPos + tracingMarkerKey_.size()) + "E|" + std::to_string(pid) + "\n"; } } } @@ -1132,8 +1122,10 @@ bool IsFfrtTaskBlockOrFinish(ConStr &log) return true; } -bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, std::string &label) +bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + std::string &label) { static const int spaceNum = 7; if (fakLogArg.log.find("|H:FFRT") != std::string::npos) { @@ -1141,13 +1133,14 @@ bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wake if (fakLogArg.taskRunning != -1) { missLog = MakeCoyieldFakeLog(fakLogArg); std::stringstream ss; - ss << " " << fakLogArg.tname << "-" << fakLogArg.tid << " (" << - std::setw(spaceNum) << std::right << fakLogArg.pid << ") [" << - fakLogArg.cpuId << "] .... " << fakLogArg.timestamp << - ": " << tracingMarkerKey_ << "E|" << fakLogArg.pid << "\n"; + ss << " " << fakLogArg.tname << "-" << fakLogArg.tid << " (" << std::setw(spaceNum) << std::right + << fakLogArg.pid << ") [" << fakLogArg.cpuId << "] .... " << fakLogArg.timestamp << ": " + << tracingMarkerKey_ << "E|" << fakLogArg.pid << "\n"; missLog += ss.str(); } - if (label.find("ex_task") != std::string::npos) { return true; } + if (label.find("ex_task") != std::string::npos) { + return true; + } int gid = -1; size_t pos = fakLogArg.log.find_last_of('|'); if (pos != std::string::npos) { @@ -1191,8 +1184,11 @@ bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wake return false; } -bool FfrtConverter::HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, ConStr traceBeginMark, ConStr traceEndMark) +bool FfrtConverter::HandlePreLineno(FakeLogArgs &fakArg, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + ConStr traceBeginMark, + ConStr traceEndMark) { std::string label = ExtractTaskLable(fakArg.log); if (HandleFfrtTaskExecute(fakArg, wakeLogs, taskLabels, label)) { @@ -1229,14 +1225,15 @@ bool FfrtConverter::HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, return false; } -void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, - std::pair pidItem, std::string traceBeginMark, +void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, + FfrtWakeLogs &ffrtWakeLogs, + std::pair pidItem, + std::string traceBeginMark, std::string traceEndMark) { taskLabels[pidItem.first] = {}; WakeLogs tmp = {}; - WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) - ? ffrtWakeLogs[pidItem.first] : tmp; + WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) ? ffrtWakeLogs[pidItem.first] : tmp; for (auto &tidItem : pidItem.second) { std::string tname = tidItem.second.first; @@ -1253,15 +1250,16 @@ void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrt std::string cpuId = ExtractCpuId(log); std::string timestamp = ExtractTimeStr(log); - FakeLogArgs fakArg{pidItem.first, tidItem.first, taskRunning, prio, lineno, - switchInFakeLog, switchOutFakeLog, log, tname, - taskLabels[pidItem.first][taskRunning], cpuId, timestamp}; + FakeLogArgs fakArg{ + pidItem.first, tidItem.first, taskRunning, prio, lineno, + switchInFakeLog, switchOutFakeLog, log, tname, taskLabels[pidItem.first][taskRunning], + cpuId, timestamp}; HandlePreLineno(fakArg, wakeLogs, taskLabels, traceBeginMark, traceEndMark); } } } -void FfrtConverter::GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs, TaskLabels &taskLabels) +void FfrtConverter::GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs, TaskLabels &taskLabels) { static std::string traceBeginMark = tracingMarkerKey_ + "B"; static std::string traceEndMark = tracingMarkerKey_ + "E"; @@ -1270,7 +1268,7 @@ void FfrtConverter::GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWake } } -void FfrtConverter::ConvertFrrtThreadToFfrtTaskOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs) +void FfrtConverter::ConvertFrrtThreadToFfrtTaskOhos(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs) { QueueTaskInfo queueTaskInfo; FindQueueTaskInfo(ffrtPids, queueTaskInfo); @@ -1284,8 +1282,11 @@ void FfrtConverter::ConvertFrrtThreadToFfrtTaskOhos(FfrtPids &ffrtPids, FfrtWake GenTaskLabelsOhos(ffrtPids, ffrtWakeLogs, taskLabels); } -bool FfrtConverter::HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, WakeLogs &wakeLogs, TaskLabels &taskLabels, - std::string label, std::unordered_map &schedWakeFlag) +bool FfrtConverter::HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + std::string label, + std::unordered_map &schedWakeFlag) { static const int spaceNum = 7; if (fakeArgs.log.find("|FFRT") == std::string::npos) { @@ -1295,36 +1296,59 @@ bool FfrtConverter::HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, WakeLogs &wake if (fakeArgs.taskRunning != -1) { missLog = MakeCoyieldFakeLog(fakeArgs); std::stringstream ss; - ss << " " << fakeArgs.tname << "-" << fakeArgs.tid << " (" << - std::setw(spaceNum) << std::right << fakeArgs.pid << ") [" << - fakeArgs.cpuId << "] .... " << fakeArgs.timestamp << ": " << - tracingMarkerKey_ << "E|" << fakeArgs.pid << "\n"; + ss << " " << fakeArgs.tname << "-" << fakeArgs.tid << " (" << std::setw(spaceNum) << std::right + << fakeArgs.pid << ") [" << fakeArgs.cpuId << "] .... " << fakeArgs.timestamp << ": " << tracingMarkerKey_ + << "E|" << fakeArgs.pid << "\n"; missLog += ss.str(); } - if (label.find("executor_task") != std::string::npos) { return true; } + if (label.find("executor_task") != std::string::npos) { + return true; + } int gid = -1; size_t pos = fakeArgs.log.find_last_of('|'); if (pos != std::string::npos) { - if (pos + 1 >= fakeArgs.log.size()) { return true; } + if (pos + 1 >= fakeArgs.log.size()) { + return true; + } std::string gidStr = fakeArgs.log.substr(pos + 1); auto [ptr, ec] = std::from_chars(gidStr.data(), gidStr.data() + gidStr.size(), gid); - if (ec != std::errc{}) { return true; } + if (ec != std::errc{}) { + return true; + } } if (taskLabels[fakeArgs.pid].find(gid) == taskLabels[fakeArgs.pid].end()) { taskLabels[fakeArgs.pid][gid] = label; } fakeArgs.taskRunning = gid; - FakeLogArgs fakArg2{fakeArgs.pid, fakeArgs.tid, fakeArgs.taskRunning, fakeArgs.prio, fakeArgs.lineno, - fakeArgs.switchInFakeLog, fakeArgs.switchOutFakeLog, fakeArgs.log, fakeArgs.tname, - taskLabels[fakeArgs.pid][fakeArgs.taskRunning], fakeArgs.cpuId, fakeArgs.timestamp}; + FakeLogArgs fakArg2{fakeArgs.pid, + fakeArgs.tid, + fakeArgs.taskRunning, + fakeArgs.prio, + fakeArgs.lineno, + fakeArgs.switchInFakeLog, + fakeArgs.switchOutFakeLog, + fakeArgs.log, + fakeArgs.tname, + taskLabels[fakeArgs.pid][fakeArgs.taskRunning], + fakeArgs.cpuId, + fakeArgs.timestamp}; std::string fakeLog = MakeCostartFakeLog(fakArg2); context_[fakeArgs.lineno] = fakeLog; if (!missLog.empty()) { context_[fakeArgs.lineno] = missLog + context_[fakeArgs.lineno]; } - FakeLogArgs fakArg3{fakeArgs.pid, fakeArgs.tid, fakeArgs.taskRunning, fakeArgs.prio, fakeArgs.lineno, - fakeArgs.switchInFakeLog, fakeArgs.switchOutFakeLog, fakeArgs.log, fakeArgs.tname, - taskLabels[fakeArgs.pid][fakeArgs.taskRunning], fakeArgs.cpuId, fakeArgs.timestamp}; + FakeLogArgs fakArg3{fakeArgs.pid, + fakeArgs.tid, + fakeArgs.taskRunning, + fakeArgs.prio, + fakeArgs.lineno, + fakeArgs.switchInFakeLog, + fakeArgs.switchOutFakeLog, + fakeArgs.log, + fakeArgs.tname, + taskLabels[fakeArgs.pid][fakeArgs.taskRunning], + fakeArgs.cpuId, + fakeArgs.timestamp}; if (wakeLogs.find(fakeArgs.taskRunning) != wakeLogs.end()) { int prevIndex = FindGreaterThan(wakeLogs[fakeArgs.taskRunning], fakeArgs.lineno); if (prevIndex > 0) { @@ -1342,9 +1366,13 @@ static bool IsFfrtTaskBlockOrFinishNohos(ConStr &log) { static const std::string fStr = " F|"; size_t fPos = log.find(fStr); - if (fPos == std::string::npos) { return false; } + if (fPos == std::string::npos) { + return false; + } size_t firstNumberEndPos = log.find('|', fPos + fStr.size()); - if (firstNumberEndPos == std::string::npos) { return false; } + if (firstNumberEndPos == std::string::npos) { + return false; + } std::string firstNumber = log.substr(fPos + 3, firstNumberEndPos - (fPos + fStr.size())); bool isValidNumber = true; for (char c : firstNumber) { @@ -1353,7 +1381,9 @@ static bool IsFfrtTaskBlockOrFinishNohos(ConStr &log) break; } } - if (!isValidNumber) { return false; } + if (!isValidNumber) { + return false; + } size_t typePos = firstNumberEndPos + 1; if (typePos < log.length() && (log[typePos] == 'B' || log[typePos] == 'F')) { size_t thirdPipePos = log.find('|', typePos + 1); @@ -1367,8 +1397,10 @@ static bool IsFfrtTaskBlockOrFinishNohos(ConStr &log) return false; } -bool FfrtConverter::HandlePreLinenoNohos(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, std::unordered_map &schedWakeFlag) +bool FfrtConverter::HandlePreLinenoNohos(FakeLogArgs &fakArg, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + std::unordered_map &schedWakeFlag) { std::string label = ExtractTaskLable(fakArg.log); if (HandleHFfrtTaskExecute(fakArg, wakeLogs, taskLabels, label, schedWakeFlag)) { @@ -1388,24 +1420,25 @@ bool FfrtConverter::HandlePreLinenoNohos(FakeLogArgs &fakArg, WakeLogs &wakeLogs } return false; } -void FfrtConverter::ExceTaskLabelNohos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, - std::pair pidItem, std::unordered_map &schedWakeFlag) +void FfrtConverter::ExceTaskLabelNohos(TaskLabels &taskLabels, + FfrtWakeLogs &ffrtWakeLogs, + std::pair pidItem, + std::unordered_map &schedWakeFlag) { bool oneF = false; bool twoF = false; taskLabels[pidItem.first] = {}; WakeLogs tmp = {}; - WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) - ? ffrtWakeLogs[pidItem.first] : tmp; + WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) ? ffrtWakeLogs[pidItem.first] : tmp; - for (auto& tidItem : pidItem.second) { + for (auto &tidItem : pidItem.second) { std::string tname = tidItem.second.first; std::vector linenos = tidItem.second.second; int prio = 120; int taskRunning = -1; for (auto lineno : linenos) { - std::string& log = context_[lineno]; + std::string &log = context_[lineno]; HandleMarks(log, lineno, pidItem.first); HandleSchedSwitch(log, tidItem.first, prio); @@ -1414,9 +1447,9 @@ void FfrtConverter::ExceTaskLabelNohos(TaskLabels &taskLabels, FfrtWakeLogs &ffr std::string timestamp = ExtractTimeStr(log); std::string label = ExtractTaskLable(log); - FakeLogArgs fakArg{pidItem.first, tidItem.first, taskRunning, prio, lineno, - oneF, twoF, log, tname, - taskLabels[pidItem.first][taskRunning], cpuId, timestamp}; + FakeLogArgs fakArg{pidItem.first, tidItem.first, taskRunning, prio, lineno, + oneF, twoF, log, tname, taskLabels[pidItem.first][taskRunning], + cpuId, timestamp}; HandlePreLinenoNohos(fakArg, wakeLogs, taskLabels, schedWakeFlag); } } diff --git a/trace_streamer/src/rpc/ffrt_converter.h b/trace_streamer/src/rpc/ffrt_converter.h index 94fb6b6c3..f117a5f29 100644 --- a/trace_streamer/src/rpc/ffrt_converter.h +++ b/trace_streamer/src/rpc/ffrt_converter.h @@ -24,7 +24,7 @@ namespace SysTuning { namespace TraceStreamer { - using ConStr = const std::string; +using ConStr = const std::string; struct tidInfo { std::vector begin; @@ -78,13 +78,15 @@ public: bool RecoverTraceAndGenerateNewFile(ConStr &ffrtFileName, std::ofstream &outFile); private: - void SetOSPlatformKey(const std::unordered_map>> &ffrt_tid_map); - void FindFfrtProcClassifyLogs(LogInfo logInfo, WakeLogs &traceMap, PidMap &pidMap, - FfrtTidMap &ffrtTidMap, FfrtWakeLogs &ffrtWakeLogs); + void FindFfrtProcClassifyLogs(LogInfo logInfo, + WakeLogs &traceMap, + PidMap &pidMap, + FfrtTidMap &ffrtTidMap, + FfrtWakeLogs &ffrtWakeLogs); void ClassifyLogsForFfrtWorker(FfrtPids &ffrt_pids, FfrtWakeLogs &ffrt_wake_logs); - void ConvertFrrtThreadToFfrtTaskOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs); + void ConvertFrrtThreadToFfrtTaskOhos(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs); void ConvertFrrtThreadToFfrtTaskNohos(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs); // trace content @@ -95,19 +97,21 @@ private: void FindQueueTaskInfo(FfrtPids &ffrtPids, QueueTaskInfo &queueTaskInfo); - void HandleFfrtQueueTasks(FfrtQueueTasks &ffrtQueueTasks, FfrtWakeLogs& ffrtWakeLogs); + void HandleFfrtQueueTasks(FfrtQueueTasks &ffrtQueueTasks, FfrtWakeLogs &ffrtWakeLogs); void HandleMarks(ConStr &log, int lineno, int pid); bool HandleFfrtTaskCo(ConStr &log, int lineno, bool &switchInFakeLog, bool &switchOutFakeLog); - bool HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, std::string &label); + bool HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wakeLogs, TaskLabels &taskLabels, std::string &label); - void GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs, TaskLabels &taskLabels); + void GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs &ffrtWakeLogs, TaskLabels &taskLabels); - bool HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, ConStr traceBeginMark, ConStr traceEndMark); + bool HandlePreLineno(FakeLogArgs &fakArg, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + ConStr traceBeginMark, + ConStr traceEndMark); void SetTracingMarkerKey(LogInfo logInfo); @@ -117,17 +121,27 @@ private: void HandleTaskGroups(std::vector> &taskGroups, WakeLogs &wakeLogs); - void ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, std::pair pidItem, - std::string traceBeginMark, std::string traceEndMark); - - bool HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, WakeLogs &wakeLogs, TaskLabels &taskLabels, - std::string label, std::unordered_map &schedWakeFlag); - - bool HandlePreLinenoNohos(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels, std::unordered_map &schedWakeFlag); - - void ExceTaskLabelNohos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, - std::pair pidItem, std::unordered_map &schedWakeFlag); + void ExceTaskLabelOhos(TaskLabels &taskLabels, + FfrtWakeLogs &ffrtWakeLogs, + std::pair pidItem, + std::string traceBeginMark, + std::string traceEndMark); + + bool HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + std::string label, + std::unordered_map &schedWakeFlag); + + bool HandlePreLinenoNohos(FakeLogArgs &fakArg, + WakeLogs &wakeLogs, + TaskLabels &taskLabels, + std::unordered_map &schedWakeFlag); + + void ExceTaskLabelNohos(TaskLabels &taskLabels, + FfrtWakeLogs &ffrtWakeLogs, + std::pair pidItem, + std::unordered_map &schedWakeFlag); }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/BUILD.gn b/trace_streamer/src/trace_data/BUILD.gn index ad0ff7364..d2b2664d7 100644 --- a/trace_streamer/src/trace_data/BUILD.gn +++ b/trace_streamer/src/trace_data/BUILD.gn @@ -81,7 +81,7 @@ ohos_source_set("trace_data") { "${THIRD_PARTY}/protobuf/src", "${THIRD_PARTY}/bounds_checking_function/include", "${THIRD_PARTY}/json/single_include/nlohmann", - "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/nonlinux", + "${THIRD_PARTY}/hiviewdfx/faultloggerd/interfaces/nonlinux", "${SRC}/trace_data/trace_stdtype", "${SRC}/trace_data/trace_stdtype/ftrace", "${SRC}/trace_data/trace_stdtype/ftrace/template", diff --git a/trace_streamer/test/BUILD.gn b/trace_streamer/test/BUILD.gn index 723d01671..f5c7033bc 100644 --- a/trace_streamer/test/BUILD.gn +++ b/trace_streamer/test/BUILD.gn @@ -90,8 +90,8 @@ if (is_test) { "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/process_data:ts_process_data_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/test_data:test_data_cpp", "${OHOS_TRACE_STREAMER_PROTOS_DIR}/protos/types/plugins/xpower_data:ts_xpower_data_cpp", + "${SRC}/parser/hiperf_parser:libsec_static", "${SRC}/parser/rawtrace_parser:rawtrace_parser", - "${THIRD_PARTY}/bounds_checking_function:libsec_static", "${THIRD_PARTY}/googletest:gtest", "${THIRD_PARTY}/googletest:gtest_main", "${THIRD_PARTY}/protobuf:protobuf_lite_static", -- Gitee From b29c24e2971cc0c39db8750d678ee18dd4ecf051 Mon Sep 17 00:00:00 2001 From: JustinYT Date: Tue, 13 May 2025 09:47:56 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A1=8C=E5=8F=B7?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- ide/src/trace/bean/BoxSelection.ts | 11 ++++++ ide/src/trace/bean/PerfProfile.ts | 3 ++ .../trace/component/trace/base/TraceSheet.ts | 37 ++++++++++++++++++- .../component/trace/base/TraceSheetConfig.ts | 5 +++ .../trace/sheet/hiperf/TabPerfProfile.html.ts | 2 +- .../trace/sheet/hiperf/TabPerfSampleList.ts | 9 ++++- ide/src/trace/database/sql/Perf.sql.ts | 32 ++++++++++++++++ 7 files changed, 96 insertions(+), 3 deletions(-) diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index a77c8bae5..81cd3c3ea 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -1420,6 +1420,17 @@ export class SysCallBoxJumpParam { isJumpPage: boolean | undefined; } +export class PerfSampleBoxJumpParam { + traceId: string | undefined | null; + leftNs: number = 0; + rightNs: number = 0; + isJumpPage: boolean | undefined; + pid: number | undefined; + tid: number | undefined; + count: number = 0; + tsArr: number[] = []; +} + export class SliceBoxJumpParam { traceId: string | undefined | null; leftNs: number = 0; diff --git a/ide/src/trace/bean/PerfProfile.ts b/ide/src/trace/bean/PerfProfile.ts index d35a7eeb2..f7561bff8 100644 --- a/ide/src/trace/bean/PerfProfile.ts +++ b/ide/src/trace/bean/PerfProfile.ts @@ -121,6 +121,9 @@ export class PerfStack { fileId: number = 0; type: number = 0; vaddrInFile: number = 0; + sourceId: number | undefined; + sourceFile: string | undefined; + lineNumber: number | undefined; } export class PerfCmdLine { diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 386717a37..df841f812 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -20,7 +20,8 @@ import { BoxJumpParam, SelectionParam, SysCallBoxJumpParam, - SliceBoxJumpParam + SliceBoxJumpParam, + PerfSampleBoxJumpParam } from '../../../bean/BoxSelection'; import { type TabPaneCurrentSelection } from '../sheet/TabPaneCurrentSelection'; import { type TabPaneFlag } from '../timer-shaft/TabPaneFlag'; @@ -117,6 +118,7 @@ import { info, error } from '../../../../log/Log'; import { XpowerThreadCountStruct } from '../../../database/ui-worker/ProcedureWorkerXpowerThreadCount'; import { XpowerGpuFreqCountStruct } from '../../../database/ui-worker/ProcedureWorkerXpowerGpuFreqCount'; import { TabPaneSysCallChild } from '../sheet/process/TabPaneSysCallChild'; +import { TabPanePerfSampleChild } from '../sheet/hiperf/TabPerfSampleChild'; @element('trace-sheet') @@ -314,6 +316,10 @@ export class TraceSheet extends BaseElement { this.getComponentByID('box-thread-syscall')?.addEventListener('td-click', (evt: unknown) => { this.tdSysCallClickHandler(evt); }); + // @ts-ignore + this.getComponentByID('box-perf-profile')?.addEventListener('td-click', (evt: unknown) => { + this.tdPerfSampleClickHandler(evt); + }); } private perfAnalysisListener(evt: MouseEvent): void { @@ -1508,6 +1514,35 @@ export class TraceSheet extends BaseElement { (pane.children.item(0) as TabPaneSysCallChild).data = param; } + tdPerfSampleClickHandler(e: unknown): void { + // @ts-ignore + this.currentPaneID = e.target.parentElement.id; + //隐藏除了当前Tab页的其他Tab页 + this.shadowRoot!.querySelectorAll('lit-tabpane').forEach((it): boolean => + it.id !== this.currentPaneID ? (it.hidden = true) : (it.hidden = false) + ); //todo:看能不能优化 + let pane = this.getPaneByID('box-perf-sample-child'); //通过Id找到需要展示的Tab页 + pane.closeable = true; //关闭的ican显示 + pane.hidden = false; + this.litTabs!.activeByKey(pane.key); //显示key值对应的Tab页 + // @ts-ignore + pane.tab = e.detail.symbol; //设置Tab页标题,有的标题可直接用,有的标题需在此转换成需要展示的字符串 + let param = new PerfSampleBoxJumpParam(); + param.traceId = this.selection!.traceId; + param.leftNs = this.selection!.leftNs; + param.rightNs = this.selection!.rightNs; + //@ts-ignore + param.pid = e.detail.pid; + //@ts-ignore + param.tid = e.detail.tid; + //@ts-ignore + param.count = e.detail.dur || 0; + //@ts-ignore + param.tsArr = e.detail.tsArray || []; + param.isJumpPage = true; + (pane.children.item(0) as TabPanePerfSampleChild).data = param; + } + //Slice Tab点击Occurrences列下的td进行跳转 tdSliceClickHandler(e: unknown): void { // @ts-ignore diff --git a/ide/src/trace/component/trace/base/TraceSheetConfig.ts b/ide/src/trace/component/trace/base/TraceSheetConfig.ts index d49ff7a63..44ab3360c 100644 --- a/ide/src/trace/component/trace/base/TraceSheetConfig.ts +++ b/ide/src/trace/component/trace/base/TraceSheetConfig.ts @@ -30,6 +30,7 @@ import { TabPaneNMStatstics } from '../sheet/native-memory/TabPaneNMStatstics'; import { TabPaneNMemory } from '../sheet/native-memory/TabPaneNMemory'; import { TabPaneNMSampleList } from '../sheet/native-memory/TabPaneNMSampleList'; import { TabpanePerfProfile } from '../sheet/hiperf/TabPerfProfile'; +import { TabPanePerfSampleChild } from '../sheet/hiperf/TabPerfSampleChild'; import { TabPanePerfSample } from '../sheet/hiperf/TabPerfSampleList'; import { TabPaneLiveProcesses } from '../sheet/ability/TabPaneLiveProcesses'; import { TabPaneHistoryProcesses } from '../sheet/ability/TabPaneHistoryProcesses'; @@ -262,6 +263,10 @@ export let tabConfig: { type: TabPanePerfSample, require: (param: SelectionParam) => param.perfSampleIds.length > 0, }, + 'box-perf-sample-child': { + title: '', + type: TabPanePerfSampleChild + }, 'box-perf-async': { title: 'Async Call Profile', type: TabPanePerfAsync, diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.html.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.html.ts index 21c6f8a95..1abd315db 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.html.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.html.ts @@ -64,7 +64,7 @@ selector{ + align="flex-start" order tdJump> { for (let stack of result) { + if (stack.sourceId !== undefined) { + stack.sourceFile = SpSystemTrace.DATA_DICT.get(stack.sourceId) || ''; + } if (typeof stack.symbol === 'number') { stack.symbol = SpSystemTrace.DATA_DICT.get(stack.symbol) || ''; - } // @ts-ignore + } + if (stack.sourceFile && stack.lineNumber !== undefined) { + stack.symbol = `${stack.symbol}【${stack.sourceFile}(${stack.lineNumber})】`; + } + //@ts-ignore let files = (perfDataQuery.filesData[stack.fileId] ?? []) as Array; stack.path = files[stack.symbolId]?.path || ''; stack.type = stack.path.endsWith('.so.1') || stack.path.endsWith('.dll') || stack.path.endsWith('.so') ? 0 : 1; diff --git a/ide/src/trace/database/sql/Perf.sql.ts b/ide/src/trace/database/sql/Perf.sql.ts index 8bd8b1297..edeb74aff 100644 --- a/ide/src/trace/database/sql/Perf.sql.ts +++ b/ide/src/trace/database/sql/Perf.sql.ts @@ -80,6 +80,36 @@ where time >= $leftNs and time <= $rightNs and A.thread_id != 0 }); }; +export const queryPerfSampleChildListByTree = ( + leftNs: number, + rightNs: number, + pid?: number, + tid?: number, +): Promise> => { + let sql = ` +select A.callchain_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 (pid !== undefined) { + sql = `${sql} and C.process_id = ${pid}`; + } + if (tid !== undefined) { + sql = `${sql} and A.thread_id = ${tid}`; + } + return query('queryPerfSampleChildListByTree', sql, { + $leftNs: leftNs, + $rightNs: rightNs, + }); +}; + export const queryPerfSampleIdsByTimeRange = ( leftNs: number, rightNs: number, @@ -116,6 +146,8 @@ export const queryPerfSampleCallChain = (sampleId: number): Promise Date: Tue, 13 May 2025 09:50:20 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A1=8C=E5=8F=B7?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8A=9F=E8=83=BD,=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- .../trace/sheet/hiperf/TabPerfSampleChild.ts | 233 ++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts new file mode 100644 index 000000000..0c4010de2 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts @@ -0,0 +1,233 @@ +/* + * 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'; +import { LitTable } from '../../../../../base-ui/table/lit-table'; +import { PerfSampleBoxJumpParam, SelectionParam } from '../../../../bean/BoxSelection'; +import { perfDataQuery } from '../../../chart/PerfDataQuery'; +import { PerfFile, PerfSample, PerfThread } from '../../../../bean/PerfProfile'; +import { Utils } from '../../base/Utils'; +import { log } from '../../../../../log/Log'; +import '../../../../../base-ui/slicer/lit-slicer'; +import { SpSystemTrace } from '../../../SpSystemTrace'; +import { + queryPerfProcess, + queryPerfSampleCallChain, + queryPerfSampleChildListByTree, + queryPerfSampleListByTimeRange, +} from '../../../../database/sql/Perf.sql'; + +@element('tabpane-perf-sample-child') +export class TabPanePerfSampleChild extends BaseElement { + private perfSampleTbl: LitTable | null | undefined; + private tblData: LitTable | null | undefined; + private perfSampleSource: Array = []; + private processMap: Map = new Map(); + private sortKey: string = 'timeString'; + private sortType: number = 0; + + set data(sampleChildParam: PerfSampleBoxJumpParam | null | undefined) { + this.perfSampleTbl!.style.visibility = 'visible'; + // @ts-ignore + this.perfSampleTbl?.shadowRoot?.querySelector('.table')?.style?.height = `${ + this.parentElement!.clientHeight - 40 + }px`; + this.perfSampleTbl!.recycleDataSource = []; + // @ts-ignore + this.tblData?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 25}px`; + this.tblData!.recycleDataSource = []; + if (sampleChildParam) { + Promise.all([ + queryPerfProcess(), + queryPerfSampleChildListByTree( + sampleChildParam.leftNs, + sampleChildParam.rightNs, + sampleChildParam.pid, + sampleChildParam.tid, + ), + ]).then((results) => { + let processes = results[0] as Array; + log(`queryPerfProcess size : ${processes.length}`); + let samples = results[1] as Array; + log(`queryPerfSampleChildListByTree size : ${samples.length}`); + this.processMap.clear(); + for (let process of processes) { + this.processMap.set(process.pid, process); + } + + this.initPerfSampleData(samples.filter(it => sampleChildParam.tsArr.some(ts => ts === it.time))); + }); + } + } + + private initPerfSampleData(samples: PerfSample[]): void { + for (let sample of samples) { + let process = this.processMap.get(sample.pid); + sample.processName = + process === null || process === undefined + ? `Process(${sample.pid})` + : `${process!.processName || 'Process'}(${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); + sample.backtrace = []; + let call = perfDataQuery.callChainMap.get(sample.sampleId); + if (call === undefined || call === null) { + sample.depth = 0; + sample.backtrace.push('No Effective Call Stack'); + } else { + sample.depth = call.depth; + if (typeof call.name === 'number') { + call.name = SpSystemTrace.DATA_DICT.get(call.name) || ''; + } + sample.backtrace.push(call.name); + sample.backtrace.push(`(${sample.depth} other frames)`); + } + } + this.perfSampleSource = samples; + this.sortPerfSampleTable(this.sortKey, this.sortType); + } + + setRightTableData(sample: PerfSample): void { + queryPerfSampleCallChain(sample.sampleId).then((result) => { + for (let stack of result) { + if (stack.sourceId !== undefined) { + stack.sourceFile = SpSystemTrace.DATA_DICT.get(stack.sourceId) || ''; + } + if (typeof stack.symbol === 'number') { + stack.symbol = SpSystemTrace.DATA_DICT.get(stack.symbol) || ''; + } + if (stack.sourceFile && stack.lineNumber !== undefined) { + stack.symbol = `${stack.symbol}【${stack.sourceFile}(${stack.lineNumber})】`; + } + // @ts-ignore + let files = (perfDataQuery.filesData[stack.fileId] ?? []) as Array; + stack.path = files[stack.symbolId]?.path || ''; + stack.type = stack.path.endsWith('.so.1') || stack.path.endsWith('.dll') || stack.path.endsWith('.so') ? 0 : 1; + } + this.tblData!.dataSource = result; + }); + } + + initElements(): void { + this.perfSampleTbl = this.shadowRoot?.querySelector('#tb-perf-sample'); + this.tblData = this.shadowRoot?.querySelector('#tb-stack-data'); + this.perfSampleTbl!.addEventListener('row-click', (e) => { + // @ts-ignore + let data = e.detail.data as PerfSample; + this.setRightTableData(data); + }); + this.perfSampleTbl!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortKey = evt.detail.key; + // @ts-ignore + this.sortType = evt.detail.sort; + // @ts-ignore + this.sortPerfSampleTable(evt.detail.key, evt.detail.sort); + }); + } + + connectedCallback(): void { + super.connectedCallback(); + new ResizeObserver(() => { + if (this.parentElement?.clientHeight !== 0) { + // @ts-ignore + this.perfSampleTbl?.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.perfSampleTbl?.reMeauseHeight(); + this.tblData?.reMeauseHeight(); + } + }).observe(this.parentElement!); + } + + sortPerfSampleTable(key: string, type: number): void { + this.perfSampleSource.sort((perfSampleA, perfSampleB): number => { + if (key === 'timeString') { + if (type === 0) { + return perfSampleA.time - perfSampleB.time; + } else if (type === 1) { + return perfSampleA.time - perfSampleB.time; + } else { + return perfSampleB.time - perfSampleA.time; + } + } else { + if (type === 0) { + return perfSampleA.core - perfSampleB.core; + } else if (type === 1) { + return perfSampleA.core - perfSampleB.core; + } else { + return perfSampleB.core - perfSampleA.core; + } + } + }); + this.perfSampleTbl!.recycleDataSource = this.perfSampleSource; + } + + initHtml(): string { + return ` +
+ +
+ + + + + + + + + + + +
+ + + + + + + +
+
`; + } +} -- Gitee From 2d34ce661564a39894a35756d2307e65e114143d Mon Sep 17 00:00:00 2001 From: JustinYT Date: Tue, 13 May 2025 17:35:00 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=A0=88=E7=BB=9F=E8=AE=A1tab=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- .../trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts index 0c4010de2..3e71a4986 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts @@ -39,6 +39,9 @@ export class TabPanePerfSampleChild extends BaseElement { private sortType: number = 0; set data(sampleChildParam: PerfSampleBoxJumpParam | null | undefined) { + if (sampleChildParam?.tsArr === undefined) { + return; + } this.perfSampleTbl!.style.visibility = 'visible'; // @ts-ignore this.perfSampleTbl?.shadowRoot?.querySelector('.table')?.style?.height = `${ -- Gitee From beb68660d3c032a6030ac3fb559a89b60769e9f8 Mon Sep 17 00:00:00 2001 From: JustinYT Date: Wed, 14 May 2025 15:46:26 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=81=AB=E7=84=B0?= =?UTF-8?q?=E5=9B=BE=E8=B7=B3=E8=BD=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- ide/src/trace/bean/FrameChartStruct.ts | 1 + ide/src/trace/component/chart/FrameChart.ts | 44 ++++++++++++++++--- .../trace/sheet/hiperf/TabPerfSampleChild.ts | 21 ++++++++- ide/src/trace/database/sql/Perf.sql.ts | 4 +- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/ide/src/trace/bean/FrameChartStruct.ts b/ide/src/trace/bean/FrameChartStruct.ts index de1eeb94f..052b84e2b 100644 --- a/ide/src/trace/bean/FrameChartStruct.ts +++ b/ide/src/trace/bean/FrameChartStruct.ts @@ -37,6 +37,7 @@ export class ChartStruct extends BaseStruct { static hoverFuncStruct: ChartStruct | undefined; static selectFuncStruct: ChartStruct | undefined; static lastSelectFuncStruct: ChartStruct | undefined; + static tempSelectStruct: ChartStruct | undefined; isDraw = false; // 是否绘制,太小的不绘制 depth: number = 0; symbol: string = ''; diff --git a/ide/src/trace/component/chart/FrameChart.ts b/ide/src/trace/component/chart/FrameChart.ts index 8255fec26..35d663846 100644 --- a/ide/src/trace/component/chart/FrameChart.ts +++ b/ide/src/trace/component/chart/FrameChart.ts @@ -674,6 +674,20 @@ export class FrameChart extends BaseElement { this.floatHint!.innerHTML = this.hintContent; this.floatHint!.style.display = 'block'; this.floatHint!.style.zIndex = '9999999'; + const countSpan = this.floatHint!.querySelector('.count'); + if (countSpan) { + //@ts-ignore + countSpan.onclick = (e) => { + this.dispatchEvent( + new CustomEvent('td-click', { + detail: ChartStruct.tempSelectStruct, + composed: true, + }) + ); + // @ts-ignore + e.stopPropagation(); + }; + } let tipArea = this.tabPaneFilter?.getBoundingClientRect().top! - this.canvas.getBoundingClientRect().top - @@ -857,6 +871,7 @@ export class FrameChart extends BaseElement { if (ChartStruct.hoverFuncStruct && ChartStruct.hoverFuncStruct !== ChartStruct.selectFuncStruct) { ChartStruct.lastSelectFuncStruct = ChartStruct.selectFuncStruct; ChartStruct.selectFuncStruct = ChartStruct.hoverFuncStruct; + ChartStruct.tempSelectStruct = undefined; this.isClickMode = ChartStruct.selectFuncStruct !== this.rootNode; this.rect.width = this.canvas!.clientWidth; // 重置缩放 @@ -875,8 +890,13 @@ export class FrameChart extends BaseElement { }) ); } + this.hideTip(); + } else { + // mouse right button + if (ChartStruct.hoverFuncStruct) { + ChartStruct.tempSelectStruct = ChartStruct.hoverFuncStruct; + } } - this.hideTip(); } private hideTip(): void { @@ -928,7 +948,7 @@ export class FrameChart extends BaseElement { Lib: ${hoverNode?.lib}
Addr: ${hoverNode?.addr}
${sourceHint} - ${label}: ${count}`; + ${label}: ${count}`; break; } if (this._mode !== ChartMode.Byte) { @@ -984,14 +1004,20 @@ export class FrameChart extends BaseElement { const searchResult = this.searchDataByCoord(this.currentData!, this.canvasX, this.canvasY); if (searchResult && (searchResult.isDraw || searchResult.depth === 0)) { ChartStruct.hoverFuncStruct = searchResult; + if (ChartStruct.hoverFuncStruct !== ChartStruct.tempSelectStruct) { + ChartStruct.tempSelectStruct = undefined; + } // 悬浮的node未改变,不需要更新悬浮框文字信息,不绘图 if (searchResult !== lastNode) { this.updateTipContent(); this.calculateChartData(); } - this.showTip(); + if (ChartStruct.tempSelectStruct === undefined) { + this.showTip(); + } } else { this.hideTip(); + ChartStruct.tempSelectStruct = undefined; ChartStruct.hoverFuncStruct = undefined; } } @@ -1022,7 +1048,6 @@ export class FrameChart extends BaseElement { this.canvas = this.shadowRoot!.querySelector('#canvas')!; this.canvasContext = this.canvas.getContext('2d')!; this.floatHint = this.shadowRoot?.querySelector('#float_hint'); - this.canvas!.oncontextmenu = (): boolean => { return false; }; @@ -1041,10 +1066,11 @@ export class FrameChart extends BaseElement { }; this.canvas!.onmouseleave = (): void => { - this.isFocusing = false; - this.hideTip(); + if (!ChartStruct.tempSelectStruct) { + this.isFocusing = false; + this.hideTip(); + } }; - document.addEventListener('keydown', (e) => { if (!this.isFocusing) { return; @@ -1095,6 +1121,10 @@ export class FrameChart extends BaseElement { .bold{ font-weight: bold; } + .count { + text-decoration: underline; + cursor: pointer + } .text{ max-width:350px; word-break: break-all; diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts index 3e71a4986..0254bfa44 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts @@ -31,6 +31,7 @@ import { @element('tabpane-perf-sample-child') export class TabPanePerfSampleChild extends BaseElement { + private param: PerfSampleBoxJumpParam | null | undefined; private perfSampleTbl: LitTable | null | undefined; private tblData: LitTable | null | undefined; private perfSampleSource: Array = []; @@ -39,9 +40,10 @@ export class TabPanePerfSampleChild extends BaseElement { private sortType: number = 0; set data(sampleChildParam: PerfSampleBoxJumpParam | null | undefined) { - if (sampleChildParam?.tsArr === undefined) { + if (sampleChildParam === this.param || !sampleChildParam?.isJumpPage) { return; } + this.param = sampleChildParam; this.perfSampleTbl!.style.visibility = 'visible'; // @ts-ignore this.perfSampleTbl?.shadowRoot?.querySelector('.table')?.style?.height = `${ @@ -70,7 +72,12 @@ export class TabPanePerfSampleChild extends BaseElement { this.processMap.set(process.pid, process); } - this.initPerfSampleData(samples.filter(it => sampleChildParam.tsArr.some(ts => ts === it.time))); + this.initPerfSampleData(samples.filter(it => { + if (sampleChildParam.tsArr && sampleChildParam.tsArr.length > 0) { + return sampleChildParam.tsArr.some(ts => it.time === ts) + } + return true; + })); }); } } @@ -130,10 +137,20 @@ export class TabPanePerfSampleChild extends BaseElement { initElements(): void { this.perfSampleTbl = this.shadowRoot?.querySelector('#tb-perf-sample'); this.tblData = this.shadowRoot?.querySelector('#tb-stack-data'); + //监听row的点击事件,在对应起始时间上画标记棋子,并设置调用栈数据 this.perfSampleTbl!.addEventListener('row-click', (e) => { // @ts-ignore let data = e.detail.data as PerfSample; this.setRightTableData(data); + // @ts-ignore + data.isSelected = true; + this.perfSampleTbl!.clearAllSelection(data); + this.perfSampleTbl!.setCurrentSelection(data); + document.dispatchEvent( + new CustomEvent('triangle-flag', { + detail: { time: [data.time], type: 'triangle' }, + }) + ); }); this.perfSampleTbl!.addEventListener('column-click', (evt) => { // @ts-ignore diff --git a/ide/src/trace/database/sql/Perf.sql.ts b/ide/src/trace/database/sql/Perf.sql.ts index edeb74aff..1f403d308 100644 --- a/ide/src/trace/database/sql/Perf.sql.ts +++ b/ide/src/trace/database/sql/Perf.sql.ts @@ -98,10 +98,10 @@ 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 (pid !== undefined) { + if (pid) { sql = `${sql} and C.process_id = ${pid}`; } - if (tid !== undefined) { + if (pid && tid !== undefined) { sql = `${sql} and A.thread_id = ${tid}`; } return query('queryPerfSampleChildListByTree', sql, { -- Gitee From ad9b4c7c5d17ef2b6b2358d765395b62230d6f1f Mon Sep 17 00:00:00 2001 From: JustinYT Date: Thu, 15 May 2025 14:29:31 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=82=B9=E8=A1=8C=E5=8F=B7=E6=8B=BC=E6=8E=A5=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- .../trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts | 2 +- ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts index 0254bfa44..badb2c90f 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleChild.ts @@ -123,7 +123,7 @@ export class TabPanePerfSampleChild extends BaseElement { stack.symbol = SpSystemTrace.DATA_DICT.get(stack.symbol) || ''; } if (stack.sourceFile && stack.lineNumber !== undefined) { - stack.symbol = `${stack.symbol}【${stack.sourceFile}(${stack.lineNumber})】`; + stack.symbol = `${stack.symbol}[${stack.sourceFile}(${stack.lineNumber})]`; } // @ts-ignore let files = (perfDataQuery.filesData[stack.fileId] ?? []) as Array; diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts index d38ba2a4d..49042adb8 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts @@ -113,7 +113,7 @@ export class TabPanePerfSample extends BaseElement { stack.symbol = SpSystemTrace.DATA_DICT.get(stack.symbol) || ''; } if (stack.sourceFile && stack.lineNumber !== undefined) { - stack.symbol = `${stack.symbol}【${stack.sourceFile}(${stack.lineNumber})】`; + stack.symbol = `${stack.symbol}[${stack.sourceFile}(${stack.lineNumber})]`; } //@ts-ignore let files = (perfDataQuery.filesData[stack.fileId] ?? []) as Array; -- Gitee From a47e7fa4c61442cc18f8a240642ba8ce95fb4a05 Mon Sep 17 00:00:00 2001 From: JustinYT Date: Wed, 14 May 2025 09:51:49 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=B1=87=E7=BC=96=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BC=98=E5=8C=96=E4=B8=BA=E4=BA=8C=E8=BF=9B?= =?UTF-8?q?=E5=88=B6=E4=BC=A0=E8=BE=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: JustinYT --- .../trace/component/trace/base/TraceSheet.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 386717a37..11d530877 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -804,21 +804,21 @@ export class TraceSheet extends BaseElement { let blob: Blob | null = file.slice(writeSize, writeSize + sliceLen); let buffer: ArrayBuffer | null = await blob.arrayBuffer(); let data: Uint8Array | null = new Uint8Array(buffer); - - const dataObject = { + const dataObject = { file_name: fileName, buffer_index: bufferIndex, buffer_size: sliceLen, total_size: file.size, - is_last: writeSize + sliceLen >= file.size, - buffer: Array.from(data), + is_last: writeSize + sliceLen >= file.size }; - - const dataString = JSON.stringify(dataObject); + const jsonStr = `${dataString.length}|${dataString}`; const textEncoder = new TextEncoder(); - const encodedData = textEncoder.encode(dataString); - wsInstance!.sendMessage(TypeConstants.DISASSEMBLY_TYPE, Constants.DISASSEMBLY_SAVE_CMD, encodedData); + const jsonData = textEncoder.encode(jsonStr); + let mergeData: Uint8Array = new Uint8Array(jsonData.length + data.length); + mergeData.set(jsonData); + mergeData.set(data, jsonData.length); + wsInstance!.sendMessage(TypeConstants.DISASSEMBLY_TYPE, Constants.DISASSEMBLY_SAVE_CMD, mergeData); writeSize += sliceLen; // 等待服务器端确认当前分片的 ACK await waitForAck(); @@ -912,14 +912,14 @@ export class TraceSheet extends BaseElement { -
+
-
+