Some symbol backend refactoring, get rid of pimpl nonsense
This commit is contained in:
parent
871344f7ae
commit
0e27da8c11
@ -18,8 +18,7 @@ namespace cpptrace {
|
||||
CPPTRACE_FORCE_NO_INLINE CPPTRACE_API
|
||||
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
|
||||
std::vector<void*> frames = detail::capture_frames(skip + 1);
|
||||
detail::symbolizer symbolizer;
|
||||
std::vector<stacktrace_frame> trace = symbolizer.resolve_frames(frames);
|
||||
std::vector<stacktrace_frame> trace = detail::resolve_frames(frames);
|
||||
for(auto& frame : trace) {
|
||||
frame.symbol = detail::demangle(frame.symbol);
|
||||
}
|
||||
|
||||
@ -8,15 +8,7 @@
|
||||
|
||||
namespace cpptrace {
|
||||
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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -182,7 +182,6 @@ namespace cpptrace {
|
||||
}
|
||||
#endif
|
||||
|
||||
struct symbolizer::impl {
|
||||
using target_vec = std::vector<std::pair<std::string, std::reference_wrapper<stacktrace_frame>>>;
|
||||
|
||||
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
|
||||
@ -330,19 +329,6 @@ namespace cpptrace {
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -302,26 +302,7 @@ namespace cpptrace {
|
||||
std::mutex dbghelp_lock;
|
||||
|
||||
// TODO: Handle backtrace_pcinfo calling the callback multiple times on inlined functions
|
||||
struct symbolizer::impl {
|
||||
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) {
|
||||
stacktrace_frame resolve_frame(HANDLE proc, void* addr) {
|
||||
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)];
|
||||
SYMBOL_INFO* symbol = (SYMBOL_INFO*)buffer;
|
||||
@ -390,21 +371,25 @@ namespace cpptrace {
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
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> resolve_frames(const std::vector<void*>& frames) {
|
||||
std::vector<stacktrace_frame> trace;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,8 +11,6 @@
|
||||
|
||||
namespace cpptrace {
|
||||
namespace detail {
|
||||
struct symbolizer::impl {
|
||||
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
|
||||
stacktrace_frame resolve_frame(const void* addr) {
|
||||
Dl_info info;
|
||||
if(dladdr(addr, &info)) { // thread-safe
|
||||
@ -33,21 +31,12 @@ namespace cpptrace {
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 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) {
|
||||
std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
|
||||
std::vector<stacktrace_frame> trace;
|
||||
trace.reserve(frames.size());
|
||||
for(const void* frame : frames) {
|
||||
trace.push_back(pimpl->resolve_frame(frame));
|
||||
trace.push_back(resolve_frame(frame));
|
||||
}
|
||||
return trace;
|
||||
}
|
||||
|
||||
@ -57,8 +57,6 @@ namespace cpptrace {
|
||||
}
|
||||
|
||||
// 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 frame;
|
||||
frame.col = 0;
|
||||
@ -81,21 +79,12 @@ namespace cpptrace {
|
||||
}
|
||||
return frame;
|
||||
}
|
||||
};
|
||||
|
||||
// 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) {
|
||||
std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
|
||||
std::vector<stacktrace_frame> trace;
|
||||
trace.reserve(frames.size());
|
||||
for(const void* frame : frames) {
|
||||
trace.push_back(pimpl->resolve_frame(frame));
|
||||
trace.push_back(resolve_frame(frame));
|
||||
}
|
||||
return trace;
|
||||
}
|
||||
|
||||
@ -856,8 +856,6 @@ namespace cpptrace {
|
||||
dwarf_finish(dbg);
|
||||
}
|
||||
|
||||
struct symbolizer::impl {
|
||||
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
|
||||
stacktrace_frame resolve_frame(const dlframe& frame_info) {
|
||||
stacktrace_frame frame{};
|
||||
frame.filename = frame_info.obj_path;
|
||||
@ -870,21 +868,12 @@ namespace cpptrace {
|
||||
);
|
||||
return frame;
|
||||
}
|
||||
};
|
||||
|
||||
// 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) {
|
||||
std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
|
||||
std::vector<stacktrace_frame> trace;
|
||||
trace.reserve(frames.size());
|
||||
for(const auto& frame : get_frames_object_info(frames)) {
|
||||
trace.push_back(pimpl->resolve_frame(frame));
|
||||
trace.push_back(resolve_frame(frame));
|
||||
}
|
||||
return trace;
|
||||
}
|
||||
|
||||
@ -7,21 +7,7 @@
|
||||
|
||||
namespace cpptrace {
|
||||
namespace detail {
|
||||
symbolizer::symbolizer() = default;
|
||||
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) {
|
||||
std::vector<stacktrace_frame> resolve_frames(const std::vector<void*>& frames) {
|
||||
return std::vector<stacktrace_frame>(frames.size(), {
|
||||
0,
|
||||
0,
|
||||
@ -30,8 +16,6 @@ namespace cpptrace {
|
||||
""
|
||||
});
|
||||
}
|
||||
|
||||
struct symbolizer::impl {};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user