diff --git a/trace_streamer/build/build_base_func.sh b/trace_streamer/build/build_base_func.sh index f635395e1f93ac6354c8fc738a3dce7084192ca8..42292804250d57625c4f7b5aa522eefc7d5d54a2 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/ohos.gni b/trace_streamer/build/ohos.gni index 3c08bb42cf4951128bbbd7857cf7748608af0fe5..8effc182b8ed3b4554d5f039c1df06886f61e735 100644 --- a/trace_streamer/build/ohos.gni +++ b/trace_streamer/build/ohos.gni @@ -20,6 +20,14 @@ template("ohos_source_set") { part_name = invoker.part_name print("part_name", part_name) } + if (defined(invoker.external_deps)) { + external_deps = invoker.external_deps + print("external_deps", external_deps) + } + if (defined(invoker.use_exceptions)) { + use_exceptions = invoker.use_exceptions + print("use_exceptions", use_exceptions) + } if (defined(invoker.sources)) { sources = invoker.sources } @@ -50,14 +58,29 @@ template("ohos_source_set") { } } template("ohos_shared_library") { - part_name = invoker.part_name - subsystem_name = invoker.subsystem_name + if (defined(invoker.subsystem_name)) { + subsystem_name = invoker.subsystem_name + print("subsystem_name", subsystem_name) + } + if (defined(invoker.part_name)) { + part_name = invoker.part_name + print("part_name", part_name) + } + if (defined(invoker.innerapi_tags)) { + innerapi_tags = invoker.innerapi_tags + print("innerapi_tags", innerapi_tags) + } + if (defined(invoker.install_enable)) { + install_enable = invoker.install_enable + print("install_enable", install_enable) + } shared_library(target_name) { - sources = invoker.sources + if (defined(invoker.sources)) { + sources = invoker.sources + } if (defined(invoker.configs)) { configs = invoker.configs } - public_configs = invoker.public_configs if (defined(invoker.defines)) { defines = invoker.defines } @@ -73,6 +96,18 @@ template("ohos_shared_library") { if (defined(invoker.deps)) { deps = invoker.deps } + if (defined(invoker.public_deps)) { + public_deps = invoker.public_deps + } + if (defined(invoker.public_configs)) { + public_configs = invoker.public_configs + } + if (defined(invoker.output_name)) { + output_name = invoker.output_name + } + if (defined(invoker.ldflags)) { + ldflags = invoker.ldflags + } } } template("ohos_static_library") { @@ -137,6 +172,14 @@ template("ohos_executable") { part_name = invoker.part_name print("part_name", part_name) } + if (defined(invoker.static_link)) { + static_link = invoker.static_link + print("static_link", static_link) + } + if (defined(invoker.install_enable)) { + install_enable = invoker.install_enable + print("install_enable", install_enable) + } if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs } @@ -170,3 +213,62 @@ template("ohos_executable") { } } } + +template("ohos_prebuilt_etc") { + assert(defined(invoker.source), "source must be defined for ${target_name}.") + if (defined(invoker.subsystem_name)) { + subsystem_name = invoker.subsystem_name + print("subsystem_name", subsystem_name) + } + if (defined(invoker.part_name)) { + part_name = invoker.part_name + print("part_name", part_name) + } + if (defined(invoker.install_images)) { + install_images = invoker.install_images + print("install_images", install_images) + } + if (defined(invoker.module_install_dir)) { + module_install_dir = invoker.module_install_dir + print("module_install_dir", module_install_dir) + } + if (defined(invoker.source)) { + source = invoker.source + print("source", source) + } + if (defined(invoker.relative_install_dir)) { + relative_install_dir = invoker.relative_install_dir + print("relative_install_dir", relative_install_dir) + } +} + +template("ohos_copy") { + assert(defined(invoker.sources), + "sources must be defined for ${target_name}.") + assert(defined(invoker.outputs), + "outputs must be defined for ${target_name}.") + if (defined(invoker.sources)) { + sources = invoker.sources + print("sources", sources) + } + if (defined(invoker.outputs)) { + outputs = invoker.outputs + print("outputs", outputs) + } + if (defined(invoker.subsystem_name)) { + subsystem_name = invoker.subsystem_name + print("subsystem_name", subsystem_name) + } + if (defined(invoker.part_name)) { + part_name = invoker.part_name + print("part_name", part_name) + } + if (defined(invoker.module_source_dir)) { + module_source_dir = invoker.module_source_dir + print("module_source_dir", module_source_dir) + } + if (defined(invoker.module_install_name)) { + module_install_name = invoker.module_install_name + print("module_install_name", module_install_name) + } +} diff --git a/trace_streamer/build/ts.gni b/trace_streamer/build/ts.gni index d2fdef54b5402418d6a5378aa60da7b84d12ca8b..4e7b0ba7bd137f0b55f5b2321953e97f68a2e59a 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 1037621711538bdbcab17813a695866f8b642141..9cd142f5395ef28a6b8a346c67bf6d4c69acfe5e 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 498c209f454033585fa2b4e2e01b524d1029fc76..8fe5534e7f7d53b54c328d33ee16b01319eba7e0 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 git@gitee.com:openharmony/developtools_hiperf.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 0000000000000000000000000000000000000000..088df2a367a8e8334ce73c4cd054e5a661086e43 --- /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 3dbb0d441f5a87bffac40a9e18bf611f4f84a05a..fcde97762192e38963c5e229d4cdb2b75c744b69 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 2a07f38406bf9a459077d5876d0d57a254c9bb21..c40825e3d27abb4ca95d9c10cd075398c946dae0 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 f577bc201291bca06b9e72037d875ff4d7bdd6c9..2996b3d614fd6ea9ecad3d31ae4b9422cedf1eec 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 cbe1e74f18f99d352780a73bed960d413b1eb5fe..3dd8f2b12c211aecb5c6c2b9c3d4c33968653866 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 8af3276601b07041de589fb294e96291f5eb2010..12edd4c68564e013f0e7eb50c776dc7ccdcd8e5f 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 31f6667c07b0558f25bd9454833a3f33fa180c23..9446f8527b0a1597ca87add62bc2c83a73efddbb 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 81a43fd649ea8837370bd0818f7fd9dac1db9011..0dd179d138a5b1a5b86e5af400afb394b76f2a0a 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 8bfd5bd6e6ce0b2b8d200d1e935731afded6daf1..ebee25de7045353de569d25ee64556437be51c81 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 1c885c6e6bac0e75866c4f6a114429cf52a06ba3..b47ebf1860f903c69270933f25a733d2e525b4d5 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 26bbe946d0f871e9da73f6a633f7b87b01484b3d..789ffc410f3938f71e412a9699a736a4f68fb62e 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 0e512554ee67919c4aa2db6b03d895b69b2f611a..cd10c6bffef6035b7e84fba2c8b5497f08f063a2 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 4786ec41546440831c587bd89bbfca70fd8d5bbf..646ed3af7963949e6af76b9a0bd60093a0d36aa5 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 72b5f3e0593c45a1b464c36d01ecf5a82b122133..9065504b5ae9d91669cbc27778e6ee22cb689ca7 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 94fb6b6c36771bc780bbe06cd628723f6a8c085f..f117a5f291682961c445d1cacf85a487800e2cf0 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 ad0ff73649a5f1322397d818573706680d3653fc..d2b2664d765dccfd5e6baa68fc28efe61a325bdf 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/src/version.cpp b/trace_streamer/src/version.cpp index 9544e6498e01649b5442a02d199c414bfe7986de..7a8226dd8c43818192660f6e726af26a3d8992f7 100644 --- a/trace_streamer/src/version.cpp +++ b/trace_streamer/src/version.cpp @@ -17,7 +17,7 @@ namespace SysTuning { namespace TraceStreamer { size_t g_loadSize = 0; size_t g_fileSize = 0; -const std::string TRACE_STREAMER_VERSION = "4.2.9"; // version -const std::string TRACE_STREAMER_PUBLISH_VERSION = "2025/1/2"; // publish datetime +const std::string TRACE_STREAMER_VERSION = "4.3.2"; // version +const std::string TRACE_STREAMER_PUBLISH_VERSION = "2025/4/24"; // publish datetime } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/test/BUILD.gn b/trace_streamer/test/BUILD.gn index 723d016712aabd9494aca4652dd7c45f115859e4..f5c7033bc38e2f187ab608d172b91ce358177981 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",