diff --git a/include/cpptrace/utils.hpp b/include/cpptrace/utils.hpp index 0f8af6c..5055d87 100644 --- a/include/cpptrace/utils.hpp +++ b/include/cpptrace/utils.hpp @@ -47,6 +47,7 @@ namespace cpptrace { // dwarf options namespace experimental { CPPTRACE_EXPORT void set_dwarf_resolver_line_table_cache_size(nullable max_entries); + CPPTRACE_EXPORT void set_dwarf_resolver_disable_aranges(bool disable); } } diff --git a/src/symbols/dwarf/dwarf_options.cpp b/src/symbols/dwarf/dwarf_options.cpp index 218571b..8dbfa20 100644 --- a/src/symbols/dwarf/dwarf_options.cpp +++ b/src/symbols/dwarf/dwarf_options.cpp @@ -7,16 +7,25 @@ namespace cpptrace { namespace detail { std::atomic> dwarf_resolver_line_table_cache_size{nullable::null()}; + std::atomic dwarf_resolver_disable_aranges{false}; optional get_dwarf_resolver_line_table_cache_size() { auto max_entries = dwarf_resolver_line_table_cache_size.load(); return max_entries.has_value() ? optional(max_entries.value()) : nullopt; } + + bool get_dwarf_resolver_disable_aranges() { + return dwarf_resolver_disable_aranges.load(); + } } namespace experimental { void set_dwarf_resolver_line_table_cache_size(nullable max_entries) { detail::dwarf_resolver_line_table_cache_size.store(max_entries); } + + void set_dwarf_resolver_disable_aranges(bool disable) { + detail::dwarf_resolver_disable_aranges.store(disable); + } } } diff --git a/src/symbols/dwarf/dwarf_options.hpp b/src/symbols/dwarf/dwarf_options.hpp index 580aa02..046c595 100644 --- a/src/symbols/dwarf/dwarf_options.hpp +++ b/src/symbols/dwarf/dwarf_options.hpp @@ -8,6 +8,7 @@ namespace cpptrace { namespace detail { optional get_dwarf_resolver_line_table_cache_size(); + bool get_dwarf_resolver_disable_aranges(); } } diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index b39f26f..3d04353 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -297,7 +297,7 @@ namespace libdwarf { VERIFY(wrap(dwarf_set_tied_dbg, dbg, skeleton.unwrap().resolver.dbg) == DW_DLV_OK); } - if(ok) { + if(ok && !get_dwarf_resolver_disable_aranges()) { // Check for .debug_aranges for fast lookup wrap(dwarf_get_aranges, dbg, &aranges, &arange_count); }