cpptrace/src/symbols/symbols_with_dl.cpp

56 lines
1.4 KiB
C++

#ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDL
#include <cpptrace/cpptrace.hpp>
#include "symbols.hpp"
#include <cstdint>
#include <memory>
#include <vector>
#include <dlfcn.h>
namespace cpptrace {
namespace detail {
namespace libdl {
stacktrace_frame resolve_frame(const frame_ptr addr) {
Dl_info info;
if(dladdr(reinterpret_cast<void*>(addr), &info)) { // thread-safe
auto base = get_module_image_base(info.dli_fname);
return {
addr,
base.has_value()
? addr - reinterpret_cast<std::uintptr_t>(info.dli_fbase) + base.unwrap_value()
: 0,
nullable<std::uint32_t>::null(),
nullable<std::uint32_t>::null(),
info.dli_fname ? info.dli_fname : "",
info.dli_sname ? info.dli_sname : "",
false
};
} else {
return {
addr,
0,
nullable<std::uint32_t>::null(),
nullable<std::uint32_t>::null(),
"",
"",
false
};
}
}
std::vector<stacktrace_frame> resolve_frames(const std::vector<frame_ptr>& frames) {
std::vector<stacktrace_frame> trace;
trace.reserve(frames.size());
for(const auto frame : frames) {
trace.push_back(resolve_frame(frame));
}
return trace;
}
}
}
}
#endif