From 9f18dcaa7889d58f7446bf0c665ff941a217cbd5 Mon Sep 17 00:00:00 2001 From: Xo Wang Date: Thu, 22 May 2025 18:09:47 -0700 Subject: [PATCH 1/2] Make dwarf_init_path_a error non-fatal libdwarf failing to parse an object should not inhibit falling back to parsing the ELF symtab. --- src/symbols/dwarf/dwarf_resolver.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index b77bfd30..61cf3d30 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -143,8 +143,8 @@ namespace libdwarf { buffer = std::unique_ptr(new char[CPPTRACE_MAX_PATH]); } dwarf_set_de_alloc_flag(0); - auto ret = wrap( - dwarf_init_path_a, + Dwarf_Error error = nullptr; + auto ret = dwarf_init_path_a( object_path.c_str(), buffer.get(), CPPTRACE_MAX_PATH, @@ -152,13 +152,21 @@ namespace libdwarf { universal_number, nullptr, nullptr, - &dbg.get() + &dbg.get(), + &error ); if(ret == DW_DLV_OK) { ok = true; } else if(ret == DW_DLV_NO_ENTRY) { // fail, no debug info ok = false; + } else if(ret == DW_DLV_ERROR) { + // fail, parsing error + ok = false; + if(trace_dwarf) { + auto msg = raii_wrap(dwarf_errmsg(error), [this, error] (char*) { dwarf_dealloc_error(dbg.get(), error); }); + std::fprintf(stderr, "dwarf error: %s\n", msg.get()); + } } else { ok = false; PANIC("Unknown return code from dwarf_init_path"); From 176421d5e2a739a4057f1665579c8384d20be77a Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 3 Jun 2025 00:18:13 -0500 Subject: [PATCH 2/2] Update error reporting --- src/symbols/dwarf/dwarf_resolver.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index 61cf3d30..710b01a6 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -13,6 +13,7 @@ #include "utils/lru_cache.hpp" #include "platform/path.hpp" #include "platform/program_name.hpp" // For CPPTRACE_MAX_PATH +#include "logging.hpp" #if IS_APPLE #include "binary/mach-o.hpp" @@ -163,10 +164,8 @@ namespace libdwarf { } else if(ret == DW_DLV_ERROR) { // fail, parsing error ok = false; - if(trace_dwarf) { - auto msg = raii_wrap(dwarf_errmsg(error), [this, error] (char*) { dwarf_dealloc_error(dbg.get(), error); }); - std::fprintf(stderr, "dwarf error: %s\n", msg.get()); - } + auto msg = raii_wrap(dwarf_errmsg(error), [this, error] (char*) { dwarf_dealloc_error(dbg.get(), error); }); + log::error("dwarf error: dwarf_init_path_a failed with {}", msg.get()); } else { ok = false; PANIC("Unknown return code from dwarf_init_path");