mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
LibDebug: Tolerate missing debug information
We previously crashed when programs were missing certain debug information.
This commit is contained in:
parent
58480a510f
commit
2686957836
Notes:
sideshowbarker
2024-07-19 06:11:29 +09:00
Author: https://github.com/itamar8910 Commit: https://github.com/SerenityOS/serenity/commit/26869578360 Pull-request: https://github.com/SerenityOS/serenity/pull/2345 Reviewed-by: https://github.com/awesomekling
2 changed files with 11 additions and 3 deletions
|
@ -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<const u8*>(section.raw_data()), section.size());
|
||||
auto buffer = section.wrapping_byte_buffer();
|
||||
BufferStream stream(buffer);
|
||||
|
||||
Vector<LineProgram::LineInfo> all_lines;
|
||||
|
|
|
@ -41,12 +41,15 @@ DwarfInfo::DwarfInfo(NonnullRefPtr<const ELF::Loader> 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
|
||||
|
|
Loading…
Reference in a new issue