Some symbol backend refactoring, get rid of pimpl nonsense

This commit is contained in:
Jeremy 2023-08-31 01:08:27 -04:00
parent 871344f7ae
commit 0e27da8c11
No known key found for this signature in database
GPG Key ID: 19AA8270105E8EB4
8 changed files with 265 additions and 352 deletions

View File

@ -18,8 +18,7 @@ namespace cpptrace {
CPPTRACE_FORCE_NO_INLINE CPPTRACE_API CPPTRACE_FORCE_NO_INLINE CPPTRACE_API
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) { std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
std::vector<void*> frames = detail::capture_frames(skip + 1); std::vector<void*> frames = detail::capture_frames(skip + 1);
detail::symbolizer symbolizer; std::vector<stacktrace_frame> trace = detail::resolve_frames(frames);
std::vector<stacktrace_frame> trace = symbolizer.resolve_frames(frames);
for(auto& frame : trace) { for(auto& frame : trace) {
frame.symbol = detail::demangle(frame.symbol); frame.symbol = detail::demangle(frame.symbol);
} }

View File

@ -8,15 +8,7 @@
namespace cpptrace { namespace cpptrace {
namespace detail { namespace detail {
// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
class symbolizer {
struct impl;
std::unique_ptr<impl> pimpl;
public:
symbolizer();
~symbolizer();
std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames); std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames);
};
} }
} }

View File

@ -182,7 +182,6 @@ namespace cpptrace {
} }
#endif #endif
struct symbolizer::impl {
using target_vec = std::vector<std::pair<std::string, std::reference_wrapper<stacktrace_frame>>>; using target_vec = std::vector<std::pair<std::string, std::reference_wrapper<stacktrace_frame>>>;
// NOLINTNEXTLINE(readability-convert-member-functions-to-static) // NOLINTNEXTLINE(readability-convert-member-functions-to-static)
@ -330,19 +329,6 @@ namespace cpptrace {
} }
return trace; return trace;
} }
};
// NOLINTNEXTLINE(bugprone-unhandled-exception-at-new)
symbolizer::symbolizer() : pimpl{new impl} {}
symbolizer::~symbolizer() = default;
//stacktrace_frame symbolizer::resolve_frame(void* addr) {
// return pimpl->resolve_frame(addr);
//}
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
return pimpl->resolve_frames(frames);
}
} }
} }

View File

@ -302,26 +302,7 @@ namespace cpptrace {
std::mutex dbghelp_lock; std::mutex dbghelp_lock;
// TODO: Handle backtrace_pcinfo calling the callback multiple times on inlined functions // TODO: Handle backtrace_pcinfo calling the callback multiple times on inlined functions
struct symbolizer::impl { stacktrace_frame resolve_frame(HANDLE proc, void* addr) {
bool good = true;
HANDLE proc;
impl() {
// TODO: When does this need to be called? Can it be moved to the symbolizer?
SymSetOptions(SYMOPT_ALLOW_ABSOLUTE_SYMBOLS);
proc = GetCurrentProcess();
if(!SymInitialize(proc, NULL, TRUE)) {
good = false;
}
}
~impl() {
if(!SymCleanup(proc)) {
//throw std::logic_error("SymCleanup failed");
}
}
stacktrace_frame resolve_frame(void* addr) {
const std::lock_guard<std::mutex> lock(dbghelp_lock); // all dbghelp functions are not thread safe const std::lock_guard<std::mutex> lock(dbghelp_lock); // all dbghelp functions are not thread safe
alignas(SYMBOL_INFO) char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; alignas(SYMBOL_INFO) char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
SYMBOL_INFO* symbol = (SYMBOL_INFO*)buffer; SYMBOL_INFO* symbol = (SYMBOL_INFO*)buffer;
@ -390,21 +371,25 @@ namespace cpptrace {
}; };
} }
} }
};
symbolizer::symbolizer() : pimpl{new impl} {} std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
symbolizer::~symbolizer() = default;
//stacktrace_frame symbolizer::resolve_frame(void* addr) {
// return pimpl->resolve_frame(addr);
//}
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
std::vector<stacktrace_frame> trace; std::vector<stacktrace_frame> trace;
trace.reserve(frames.size()); trace.reserve(frames.size());
for(const auto frame : frames) {
trace.push_back(pimpl->resolve_frame(frame)); // TODO: When does this need to be called? Can it be moved to the symbolizer?
SymSetOptions(SYMOPT_ALLOW_ABSOLUTE_SYMBOLS);
HANDLE proc = GetCurrentProcess();
if(!SymInitialize(proc, NULL, TRUE)) {
//TODO?
throw std::logic_error("SymInitialize failed");
} }
for(const auto frame : frames) {
trace.push_back(resolve_frame(proc, frame));
}
if(!SymCleanup(proc)) {
//throw std::logic_error("SymCleanup failed");
}
return trace; return trace;
} }
} }

View File

@ -11,8 +11,6 @@
namespace cpptrace { namespace cpptrace {
namespace detail { namespace detail {
struct symbolizer::impl {
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
stacktrace_frame resolve_frame(const void* addr) { stacktrace_frame resolve_frame(const void* addr) {
Dl_info info; Dl_info info;
if(dladdr(addr, &info)) { // thread-safe if(dladdr(addr, &info)) { // thread-safe
@ -33,21 +31,12 @@ namespace cpptrace {
}; };
} }
} }
};
// NOLINTNEXTLINE(bugprone-unhandled-exception-at-new) std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
symbolizer::symbolizer() : pimpl{new impl} {}
symbolizer::~symbolizer() = default;
//stacktrace_frame symbolizer::resolve_frame(void* addr) {
// return pimpl->resolve_frame(addr);
//}
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
std::vector<stacktrace_frame> trace; std::vector<stacktrace_frame> trace;
trace.reserve(frames.size()); trace.reserve(frames.size());
for(const void* frame : frames) { for(const void* frame : frames) {
trace.push_back(pimpl->resolve_frame(frame)); trace.push_back(resolve_frame(frame));
} }
return trace; return trace;
} }

View File

@ -57,8 +57,6 @@ namespace cpptrace {
} }
// TODO: Handle backtrace_pcinfo calling the callback multiple times on inlined functions // TODO: Handle backtrace_pcinfo calling the callback multiple times on inlined functions
struct symbolizer::impl {
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
stacktrace_frame resolve_frame(const void* addr) { stacktrace_frame resolve_frame(const void* addr) {
stacktrace_frame frame; stacktrace_frame frame;
frame.col = 0; frame.col = 0;
@ -81,21 +79,12 @@ namespace cpptrace {
} }
return frame; return frame;
} }
};
// NOLINTNEXTLINE(bugprone-unhandled-exception-at-new) std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
symbolizer::symbolizer() : pimpl{new impl} {}
symbolizer::~symbolizer() = default;
//stacktrace_frame symbolizer::resolve_frame(void* addr) {
// return pimpl->resolve_frame(addr);
//}
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
std::vector<stacktrace_frame> trace; std::vector<stacktrace_frame> trace;
trace.reserve(frames.size()); trace.reserve(frames.size());
for(const void* frame : frames) { for(const void* frame : frames) {
trace.push_back(pimpl->resolve_frame(frame)); trace.push_back(resolve_frame(frame));
} }
return trace; return trace;
} }

View File

@ -856,8 +856,6 @@ namespace cpptrace {
dwarf_finish(dbg); dwarf_finish(dbg);
} }
struct symbolizer::impl {
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
stacktrace_frame resolve_frame(const dlframe& frame_info) { stacktrace_frame resolve_frame(const dlframe& frame_info) {
stacktrace_frame frame{}; stacktrace_frame frame{};
frame.filename = frame_info.obj_path; frame.filename = frame_info.obj_path;
@ -870,21 +868,12 @@ namespace cpptrace {
); );
return frame; return frame;
} }
};
// NOLINTNEXTLINE(bugprone-unhandled-exception-at-new) std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
symbolizer::symbolizer() : pimpl{new impl} {}
symbolizer::~symbolizer() = default;
//stacktrace_frame symbolizer::resolve_frame(void* addr) {
// return pimpl->resolve_frame(addr);
//}
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
std::vector<stacktrace_frame> trace; std::vector<stacktrace_frame> trace;
trace.reserve(frames.size()); trace.reserve(frames.size());
for(const auto& frame : get_frames_object_info(frames)) { for(const auto& frame : get_frames_object_info(frames)) {
trace.push_back(pimpl->resolve_frame(frame)); trace.push_back(resolve_frame(frame));
} }
return trace; return trace;
} }

View File

@ -7,21 +7,7 @@
namespace cpptrace { namespace cpptrace {
namespace detail { namespace detail {
symbolizer::symbolizer() = default; std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
symbolizer::~symbolizer() = default;
// stacktrace_frame symbolizer::resolve_frame(void*) {
// return {
// 0,
// 0,
// 0,
// "",
// "",
// };
// }
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
return std::vector<stacktrace_frame>(frames.size(), { return std::vector<stacktrace_frame>(frames.size(), {
0, 0,
0, 0,
@ -30,8 +16,6 @@ namespace cpptrace {
"" ""
}); });
} }
struct symbolizer::impl {};
} }
} }