Refactor collate_frames
This commit is contained in:
parent
583c0efdb3
commit
dcd9a31ce4
@ -22,6 +22,7 @@ namespace detail {
|
|||||||
std::pair<std::reference_wrapper<const object_frame>, std::reference_wrapper<frame_with_inlines>>
|
std::pair<std::reference_wrapper<const object_frame>, std::reference_wrapper<frame_with_inlines>>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
// These two helpers create a map from a target object to a vector of frames to resolve
|
||||||
std::unordered_map<std::string, collated_vec> collate_frames(
|
std::unordered_map<std::string, collated_vec> collate_frames(
|
||||||
const std::vector<object_frame>& frames,
|
const std::vector<object_frame>& frames,
|
||||||
std::vector<stacktrace_frame>& trace
|
std::vector<stacktrace_frame>& trace
|
||||||
|
|||||||
@ -8,42 +8,37 @@
|
|||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
template<typename CollatedVec, typename Entry>
|
||||||
|
std::unordered_map<std::string, CollatedVec> collate_frames(
|
||||||
|
const std::vector<object_frame>& frames,
|
||||||
|
std::vector<Entry>& trace
|
||||||
|
) {
|
||||||
|
std::unordered_map<std::string, CollatedVec> entries;
|
||||||
|
for(std::size_t i = 0; i < frames.size(); i++) {
|
||||||
|
const auto& entry = frames[i];
|
||||||
|
// If libdl fails to find the shared object for a frame, the path will be empty. I've observed this
|
||||||
|
// on macos when looking up the shared object containing `start`.
|
||||||
|
if(!entry.object_path.empty()) {
|
||||||
|
entries[entry.object_path].emplace_back(
|
||||||
|
entry,
|
||||||
|
trace[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
std::unordered_map<std::string, collated_vec> collate_frames(
|
std::unordered_map<std::string, collated_vec> collate_frames(
|
||||||
const std::vector<object_frame>& frames,
|
const std::vector<object_frame>& frames,
|
||||||
std::vector<stacktrace_frame>& trace
|
std::vector<stacktrace_frame>& trace
|
||||||
) {
|
) {
|
||||||
std::unordered_map<std::string, collated_vec> entries;
|
return collate_frames<collated_vec>(frames, trace);
|
||||||
for(std::size_t i = 0; i < frames.size(); i++) {
|
|
||||||
const auto& entry = frames[i];
|
|
||||||
// If libdl fails to find the shared object for a frame, the path will be empty. I've observed this
|
|
||||||
// on macos when looking up the shared object containing `start`.
|
|
||||||
if(!entry.object_path.empty()) {
|
|
||||||
entries[entry.object_path].emplace_back(
|
|
||||||
entry,
|
|
||||||
trace[i]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return entries;
|
|
||||||
}
|
|
||||||
// TODO: Refactor to eliminate the code duplication
|
|
||||||
std::unordered_map<std::string, collated_vec_with_inlines> collate_frames(
|
std::unordered_map<std::string, collated_vec_with_inlines> collate_frames(
|
||||||
const std::vector<object_frame>& frames,
|
const std::vector<object_frame>& frames,
|
||||||
std::vector<frame_with_inlines>& trace
|
std::vector<frame_with_inlines>& trace
|
||||||
) {
|
) {
|
||||||
std::unordered_map<std::string, collated_vec_with_inlines> entries;
|
return collate_frames<collated_vec_with_inlines>(frames, trace);
|
||||||
for(std::size_t i = 0; i < frames.size(); i++) {
|
|
||||||
const auto& entry = frames[i];
|
|
||||||
// If libdl fails to find the shared object for a frame, the path will be empty. I've observed this
|
|
||||||
// on macos when looking up the shared object containing `start`.
|
|
||||||
if(!entry.object_path.empty()) {
|
|
||||||
entries[entry.object_path].emplace_back(
|
|
||||||
entry,
|
|
||||||
trace[i]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return entries;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user