Refactor logic in the libdwarf resolver's resolve_frames, pull out trace flattening
This commit is contained in:
parent
a9f72c6f67
commit
5171e87a51
@ -1177,54 +1177,8 @@ namespace libdwarf {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
// flatten trace with inlines
|
||||||
std::vector<stacktrace_frame> resolve_frames(const std::vector<object_frame>& frames) {
|
std::vector<stacktrace_frame> flatten_inlines(const std::vector<frame_with_inlines>& trace) {
|
||||||
std::vector<frame_with_inlines> trace(frames.size(), {null_frame, {}});
|
|
||||||
// Locking around all libdwarf interaction per https://github.com/davea42/libdwarf-code/discussions/184
|
|
||||||
// And also locking for interactions with get_resolver
|
|
||||||
static std::mutex mutex;
|
|
||||||
const std::lock_guard<std::mutex> lock(mutex);
|
|
||||||
for(const auto& group : collate_frames(frames, trace)) {
|
|
||||||
try {
|
|
||||||
const auto& object_name = group.first;
|
|
||||||
auto resolver = get_resolver(object_name);
|
|
||||||
for(const auto& entry : group.second) {
|
|
||||||
const auto& dlframe = entry.first.get();
|
|
||||||
auto& frame = entry.second.get();
|
|
||||||
try {
|
|
||||||
frame = resolver->resolve_frame(dlframe);
|
|
||||||
} catch(...) {
|
|
||||||
frame.frame.raw_address = dlframe.raw_address;
|
|
||||||
frame.frame.object_address = dlframe.object_address;
|
|
||||||
frame.frame.filename = dlframe.object_path;
|
|
||||||
if(!should_absorb_trace_exceptions()) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch(...) { // NOSONAR
|
|
||||||
if(!should_absorb_trace_exceptions()) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
for(const auto& entry : group.second) {
|
|
||||||
const auto& dlframe = entry.first.get();
|
|
||||||
auto& frame = entry.second.get();
|
|
||||||
frame = {
|
|
||||||
{
|
|
||||||
dlframe.raw_address,
|
|
||||||
dlframe.object_address,
|
|
||||||
nullable<std::uint32_t>::null(),
|
|
||||||
nullable<std::uint32_t>::null(),
|
|
||||||
dlframe.object_path,
|
|
||||||
"",
|
|
||||||
false
|
|
||||||
},
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// flatten trace with inlines
|
|
||||||
std::vector<stacktrace_frame> final_trace;
|
std::vector<stacktrace_frame> final_trace;
|
||||||
for(const auto& entry : trace) {
|
for(const auto& entry : trace) {
|
||||||
// most recent call first
|
// most recent call first
|
||||||
@ -1257,6 +1211,60 @@ namespace libdwarf {
|
|||||||
}
|
}
|
||||||
return final_trace;
|
return final_trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
||||||
|
std::vector<stacktrace_frame> resolve_frames(const std::vector<object_frame>& frames) {
|
||||||
|
std::vector<frame_with_inlines> trace(frames.size(), {null_frame, {}});
|
||||||
|
// Locking around all libdwarf interaction per https://github.com/davea42/libdwarf-code/discussions/184
|
||||||
|
// And also locking for interactions with get_resolver
|
||||||
|
static std::mutex mutex;
|
||||||
|
const std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
for(const auto& group : collate_frames(frames, trace)) {
|
||||||
|
try {
|
||||||
|
const auto& object_name = group.first;
|
||||||
|
auto resolver = get_resolver(object_name);
|
||||||
|
for(const auto& entry : group.second) {
|
||||||
|
const auto& dlframe = entry.first.get();
|
||||||
|
auto& frame = entry.second.get();
|
||||||
|
try {
|
||||||
|
frame = resolver->resolve_frame(dlframe);
|
||||||
|
} catch(...) {
|
||||||
|
frame.frame.raw_address = dlframe.raw_address;
|
||||||
|
frame.frame.object_address = dlframe.object_address;
|
||||||
|
frame.frame.filename = dlframe.object_path;
|
||||||
|
if(!should_absorb_trace_exceptions()) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(...) { // NOSONAR
|
||||||
|
if(!should_absorb_trace_exceptions()) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fill in basic info for any frames where there were resolution issues
|
||||||
|
for(std::size_t i = 0; i < frames.size(); i++) {
|
||||||
|
const auto& dlframe = frames[i];
|
||||||
|
auto& frame = trace[i];
|
||||||
|
if(frame.frame == null_frame) {
|
||||||
|
frame = {
|
||||||
|
{
|
||||||
|
dlframe.raw_address,
|
||||||
|
dlframe.object_address,
|
||||||
|
nullable<std::uint32_t>::null(),
|
||||||
|
nullable<std::uint32_t>::null(),
|
||||||
|
dlframe.object_path,
|
||||||
|
"",
|
||||||
|
false
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// flatten and finish
|
||||||
|
return flatten_inlines(trace);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user