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
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user