Fix an issue with destruction order of dwarf stuff and clean up cleanup logic
This commit is contained in:
parent
b762ee7ec6
commit
8963639639
@ -80,7 +80,10 @@ namespace libdwarf {
|
|||||||
|
|
||||||
class dwarf_resolver : public symbol_resolver {
|
class dwarf_resolver : public symbol_resolver {
|
||||||
std::string object_path;
|
std::string object_path;
|
||||||
Dwarf_Debug dbg = nullptr;
|
// dwarf_finish needs to be called after all other dwarf stuff is cleaned up, e.g. `srcfiles` and aranges etc
|
||||||
|
// raii_wrapping ensures this is the last thing done after the destructor logic and all other data members are
|
||||||
|
// cleaned up
|
||||||
|
raii_wrapper<Dwarf_Debug, void(*)(Dwarf_Debug)> dbg{nullptr, [](Dwarf_Debug dbg) { dwarf_finish(dbg); }};
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
// .debug_aranges cache
|
// .debug_aranges cache
|
||||||
Dwarf_Arange* aranges = nullptr;
|
Dwarf_Arange* aranges = nullptr;
|
||||||
@ -176,7 +179,7 @@ namespace libdwarf {
|
|||||||
universal_number,
|
universal_number,
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
&dbg
|
&dbg.get()
|
||||||
);
|
);
|
||||||
if(ret == DW_DLV_OK) {
|
if(ret == DW_DLV_OK) {
|
||||||
ok = true;
|
ok = true;
|
||||||
@ -200,15 +203,9 @@ namespace libdwarf {
|
|||||||
|
|
||||||
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
||||||
~dwarf_resolver() override {
|
~dwarf_resolver() override {
|
||||||
// TODO: Maybe redundant since dwarf_finish(dbg); will clean up the line stuff anyway but may as well just
|
|
||||||
// for thoroughness
|
|
||||||
for(auto& entry : line_tables) {
|
for(auto& entry : line_tables) {
|
||||||
dwarf_srclines_dealloc_b(entry.second.line_context);
|
dwarf_srclines_dealloc_b(entry.second.line_context);
|
||||||
}
|
}
|
||||||
// subprograms_cache needs to be destroyed before dbg otherwise there will be another use after free
|
|
||||||
subprograms_cache.clear();
|
|
||||||
split_full_cu_resolvers.clear();
|
|
||||||
skeleton.reset();
|
|
||||||
if(aranges) {
|
if(aranges) {
|
||||||
for(int i = 0; i < arange_count; i++) {
|
for(int i = 0; i < arange_count; i++) {
|
||||||
dwarf_dealloc(dbg, aranges[i], DW_DLA_ARANGE);
|
dwarf_dealloc(dbg, aranges[i], DW_DLA_ARANGE);
|
||||||
@ -216,8 +213,6 @@ namespace libdwarf {
|
|||||||
}
|
}
|
||||||
dwarf_dealloc(dbg, aranges, DW_DLA_LIST);
|
dwarf_dealloc(dbg, aranges, DW_DLA_LIST);
|
||||||
}
|
}
|
||||||
cu_cache.clear();
|
|
||||||
dwarf_finish(dbg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dwarf_resolver(const dwarf_resolver&) = delete;
|
dwarf_resolver(const dwarf_resolver&) = delete;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user