From 2686957836069484bdf9886fd5fb792f55376d1b Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 23 May 2020 14:55:39 +0300 Subject: [PATCH] LibDebug: Tolerate missing debug information We previously crashed when programs were missing certain debug information. --- Libraries/LibDebug/DebugInfo.cpp | 9 +++++++-- Libraries/LibDebug/Dwarf/DwarfInfo.cpp | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Libraries/LibDebug/DebugInfo.cpp b/Libraries/LibDebug/DebugInfo.cpp index d5486f868eb..93dbcf11f22 100644 --- a/Libraries/LibDebug/DebugInfo.cpp +++ b/Libraries/LibDebug/DebugInfo.cpp @@ -69,6 +69,10 @@ void DebugInfo::parse_scopes_impl(const Dwarf::DIE& die) if (name.has_value()) scope.name = name.value().data.as_string; + if (!child.get_attribute(Dwarf::Attribute::LowPc).has_value()) { + dbg() << "DWARF: Couldn't find attribtue LowPc for scope"; + return; + } scope.address_low = child.get_attribute(Dwarf::Attribute::LowPc).value().data.as_u32; // The attribute name HighPc is confusing. In this context, it seems to actually be a positive offset from LowPc scope.address_high = scope.address_low + child.get_attribute(Dwarf::Attribute::HighPc).value().data.as_u32; @@ -88,9 +92,10 @@ void DebugInfo::parse_scopes_impl(const Dwarf::DIE& die) void DebugInfo::prepare_lines() { auto section = m_elf->image().lookup_section(".debug_line"); - ASSERT(!section.is_undefined()); + if (section.is_undefined()) + return; - auto buffer = ByteBuffer::wrap(reinterpret_cast(section.raw_data()), section.size()); + auto buffer = section.wrapping_byte_buffer(); BufferStream stream(buffer); Vector all_lines; diff --git a/Libraries/LibDebug/Dwarf/DwarfInfo.cpp b/Libraries/LibDebug/Dwarf/DwarfInfo.cpp index 8c8781e6dba..e105099b4ca 100644 --- a/Libraries/LibDebug/Dwarf/DwarfInfo.cpp +++ b/Libraries/LibDebug/Dwarf/DwarfInfo.cpp @@ -41,12 +41,15 @@ DwarfInfo::DwarfInfo(NonnullRefPtr elf) ByteBuffer DwarfInfo::section_data(const String& section_name) { auto section = m_elf->image().lookup_section(section_name); - ASSERT(!section.is_undefined()); + if (section.is_undefined()) + return {}; return section.wrapping_byte_buffer(); } void DwarfInfo::populate_compilation_units() { + if (m_debug_info_data.is_null()) + return; // We have to const_cast here because there isn't a version of // BufferStream that accepts a const ByteStream // We take care not to use BufferStream operations that modify the underlying buffer