From 7730467dec6b155828c7cd6500eb5bb311a6d82a Mon Sep 17 00:00:00 2001 From: Nicolas Savoire Date: Thu, 22 Feb 2024 11:22:43 +0100 Subject: [PATCH] Add option to disable symbolization (#380) --- include/ddprof_cli.hpp | 1 + include/ddprof_context.hpp | 1 + include/dwfl_symbol_lookup.hpp | 3 ++- include/symbol_hdr.hpp | 6 ++++-- include/unwind_state.hpp | 10 +++++++--- src/ddprof_cli.cc | 7 +++++++ src/ddprof_context_lib.cc | 1 + src/ddprof_worker.cc | 3 ++- src/dwfl_symbol_lookup.cc | 6 ++++-- src/unwind_state.cc | 5 +++-- test/ddprof_exporter-ut.cc | 4 +++- test/ddprof_pprof-ut.cc | 4 +++- 12 files changed, 38 insertions(+), 13 deletions(-) diff --git a/include/ddprof_cli.hpp b/include/ddprof_cli.hpp index 21c22f074..60d519803 100644 --- a/include/ddprof_cli.hpp +++ b/include/ddprof_cli.hpp @@ -68,6 +68,7 @@ struct DDProfCLI { bool fault_info{true}; bool help_extended{false}; bool remote_symbolization{false}; + bool disable_symbolization{false}; std::string socket_path; int pipefd_to_library{-1}; diff --git a/include/ddprof_context.hpp b/include/ddprof_context.hpp index e2a85ddcd..647cf8e6d 100644 --- a/include/ddprof_context.hpp +++ b/include/ddprof_context.hpp @@ -33,6 +33,7 @@ struct DDProfContext { bool show_samples{false}; bool timeline{false}; bool remote_symbolization{false}; + bool disable_symbolization{false}; cpu_set_t cpu_affinity{}; std::string switch_user; diff --git a/include/dwfl_symbol_lookup.hpp b/include/dwfl_symbol_lookup.hpp index a17d5a450..7d924bbae 100644 --- a/include/dwfl_symbol_lookup.hpp +++ b/include/dwfl_symbol_lookup.hpp @@ -43,7 +43,7 @@ struct DwflSymbolLookupStats { class DwflSymbolLookup { public: // build and check env var to know check setting - DwflSymbolLookup(); + explicit DwflSymbolLookup(bool disable_symbolization = false); // Get symbol from internal cache or fetch through dwarf SymbolIdx_t get_or_insert(const DDProfMod &ddprof_mod, SymbolTable &table, @@ -85,6 +85,7 @@ class DwflSymbolLookup { // unordered map of DSO elements FileInfo2SymbolMap _file_info_map; DwflSymbolLookupStats _stats; + bool _disable_symbolization{false}; }; } // namespace ddprof diff --git a/include/symbol_hdr.hpp b/include/symbol_hdr.hpp index 621a8b402..501a00e26 100644 --- a/include/symbol_hdr.hpp +++ b/include/symbol_hdr.hpp @@ -19,8 +19,10 @@ namespace ddprof { struct SymbolHdr { - explicit SymbolHdr(std::string_view path_to_proc = "") - : _runtime_symbol_lookup(path_to_proc) {} + explicit SymbolHdr(bool disable_symbolization = false, + std::string_view path_to_proc = "") + : _dwfl_symbol_lookup(disable_symbolization), + _runtime_symbol_lookup(path_to_proc) {} void display_stats() const { _dwfl_symbol_lookup.stats().display(_dwfl_symbol_lookup.size()); _dso_symbol_lookup.stats_display(); diff --git a/include/unwind_state.hpp b/include/unwind_state.hpp index 6c92ddbcd..ce64432ef 100644 --- a/include/unwind_state.hpp +++ b/include/unwind_state.hpp @@ -41,8 +41,10 @@ struct UnwindRegisters { /// Single structure with everything necessary in unwinding. The structure is /// given through callbacks struct UnwindState { - explicit UnwindState(UniqueElf ref_elf, int dd_profiling_fd = -1) - : dso_hdr("", dd_profiling_fd), ref_elf(std::move(ref_elf)) { + explicit UnwindState(UniqueElf ref_elf, int dd_profiling_fd = -1, + bool disable_symbolization = false) + : dso_hdr("", dd_profiling_fd), symbol_hdr(disable_symbolization), + ref_elf(std::move(ref_elf)) { output.clear(); output.locs.reserve(kMaxStackDepth); } @@ -65,7 +67,9 @@ struct UnwindState { UniqueElf ref_elf; // reference elf object used to initialize dwfl }; -std::optional create_unwind_state(int dd_profiling_fd = -1); +std::optional +create_unwind_state(int dd_profiling_fd = -1, + bool disable_symbolization = false); static inline bool unwind_registers_equal(const UnwindRegisters *lhs, const UnwindRegisters *rhs) { diff --git a/src/ddprof_cli.cc b/src/ddprof_cli.cc index a8a02e124..70009c1a4 100644 --- a/src/ddprof_cli.cc +++ b/src/ddprof_cli.cc @@ -347,6 +347,13 @@ int DDProfCLI::parse(int argc, const char *argv[]) { ->envname("DD_PROFILING_REMOTE_SYMBOLIZATION") ->group("")); + extended_options.push_back(app.add_flag("--disable-symbolization", + disable_symbolization, + "Disable symbolization") + ->default_val(false) + ->envname("DD_PROFILING_DISABLE_SYMBOLIZATION") + ->group("")); + // Parse CLI11_PARSE(app, argc, argv); diff --git a/src/ddprof_context_lib.cc b/src/ddprof_context_lib.cc index aa65bef7a..014bb3f23 100644 --- a/src/ddprof_context_lib.cc +++ b/src/ddprof_context_lib.cc @@ -90,6 +90,7 @@ void copy_cli_values(const DDProfCLI &ddprof_cli, DDProfContext &ctx) { ctx.params.timeline = ddprof_cli.timeline; ctx.params.fault_info = ddprof_cli.fault_info; ctx.params.remote_symbolization = ddprof_cli.remote_symbolization; + ctx.params.disable_symbolization = ddprof_cli.disable_symbolization; ctx.params.initial_loaded_libs_check_delay = ddprof_cli.initial_loaded_libs_check_delay; diff --git a/src/ddprof_worker.cc b/src/ddprof_worker.cc index f2d504f0a..a98847928 100644 --- a/src/ddprof_worker.cc +++ b/src/ddprof_worker.cc @@ -339,7 +339,8 @@ DDRes worker_library_init(DDProfContext &ctx, // Make sure worker index is initialized correctly ctx.worker_ctx.i_current_pprof = 0; ctx.worker_ctx.exp_tid = {0}; - auto unwind_state = create_unwind_state(ctx.params.dd_profiling_fd); + auto unwind_state = create_unwind_state(ctx.params.dd_profiling_fd, + ctx.params.disable_symbolization); if (!unwind_state) { LG_ERR("Failed to create unwind state"); return ddres_error(DD_WHAT_UW_ERROR); diff --git a/src/dwfl_symbol_lookup.cc b/src/dwfl_symbol_lookup.cc index 9c0e51917..05d105a7e 100644 --- a/src/dwfl_symbol_lookup.cc +++ b/src/dwfl_symbol_lookup.cc @@ -18,7 +18,8 @@ namespace ddprof { -DwflSymbolLookup::DwflSymbolLookup() { +DwflSymbolLookup::DwflSymbolLookup(bool disable_symbolization) + : _disable_symbolization(disable_symbolization) { if (const char *env_p = std::getenv("DDPROF_CACHE_SETTING")) { if (strcmp(env_p, "VALIDATE") == 0) { // Allows to compare the accuracy of the cache @@ -93,7 +94,8 @@ SymbolIdx_t DwflSymbolLookup::insert(const DDProfMod &ddprof_mod, ElfAddress_t const elf_pc = process_pc - ddprof_mod._sym_bias; - if (!symbol_get_from_dwfl(ddprof_mod._mod, process_pc, symbol, elf_sym, + if (_disable_symbolization || + !symbol_get_from_dwfl(ddprof_mod._mod, process_pc, symbol, elf_sym, lbias)) { ++_stats._no_dwfl_symbols; // Override with info from dso diff --git a/src/unwind_state.cc b/src/unwind_state.cc index 2aeb7191c..cda1943be 100644 --- a/src/unwind_state.cc +++ b/src/unwind_state.cc @@ -9,12 +9,13 @@ #include "logger.hpp" namespace ddprof { -std::optional create_unwind_state(int dd_profiling_fd) { +std::optional create_unwind_state(int dd_profiling_fd, + bool disable_symbolization) { auto elf = create_elf_from_self(); if (!elf) { return std::nullopt; } - return UnwindState(std::move(elf), dd_profiling_fd); + return UnwindState(std::move(elf), dd_profiling_fd, disable_symbolization); } } // namespace ddprof \ No newline at end of file diff --git a/test/ddprof_exporter-ut.cc b/test/ddprof_exporter-ut.cc index 411c1cb15..33ad5832f 100644 --- a/test/ddprof_exporter-ut.cc +++ b/test/ddprof_exporter-ut.cc @@ -20,7 +20,9 @@ namespace ddprof { // todo : cut this dependency -DwflSymbolLookup::DwflSymbolLookup() : _lookup_setting(K_CACHE_ON) {} +DwflSymbolLookup::DwflSymbolLookup(bool disable_symbolization) + : _lookup_setting(K_CACHE_ON), + _disable_symbolization(disable_symbolization) {} // Mock int get_nb_hw_thread() { return 2; } diff --git a/test/ddprof_pprof-ut.cc b/test/ddprof_pprof-ut.cc index b3a128887..8a2bc887c 100644 --- a/test/ddprof_pprof-ut.cc +++ b/test/ddprof_pprof-ut.cc @@ -22,7 +22,9 @@ namespace ddprof { // todo : cut this dependency -DwflSymbolLookup::DwflSymbolLookup() : _lookup_setting(K_CACHE_ON) {} +DwflSymbolLookup::DwflSymbolLookup(bool disable_symbolization) + : _lookup_setting(K_CACHE_ON), + _disable_symbolization(disable_symbolization) {} TEST(DDProfPProf, init_profiles) { DDProfPProf pprof;