mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-30 13:19:02 +00:00
LibDebug: Keep going when parent's location info could not be computed
Previously, when trying to parse the location info of a member variable, we asserted that the location info of its parent is of type 'Address'. However, there are cases where we cannot compute the location info of the parent (for example - because we do not yet support the type of debug info generated for it). In those cases, it is better to just leave the location info of the member variable empty instead of crashing.
This commit is contained in:
parent
e318a3d3d4
commit
20974b0772
Notes:
sideshowbarker
2024-07-19 00:02:12 +09:00
Author: https://github.com/itamar8910
Commit: 20974b0772
Pull-request: https://github.com/SerenityOS/serenity/pull/4852
Reviewed-by: https://github.com/ADKaster
Reviewed-by: https://github.com/awesomekling
1 changed files with 24 additions and 16 deletions
|
@ -225,16 +225,19 @@ static Optional<Dwarf::DIE> parse_variable_type_die(const Dwarf::DIE& variable_d
|
|||
static void parse_variable_location(const Dwarf::DIE& variable_die, DebugInfo::VariableInfo& variable_info, const PtraceRegisters& regs)
|
||||
{
|
||||
auto location_info = variable_die.get_attribute(Dwarf::Attribute::Location);
|
||||
if (!location_info.has_value())
|
||||
if (!location_info.has_value()) {
|
||||
location_info = variable_die.get_attribute(Dwarf::Attribute::MemberLocation);
|
||||
|
||||
if (location_info.has_value()) {
|
||||
if (location_info.value().type == Dwarf::DIE::AttributeValue::Type::UnsignedNumber) {
|
||||
variable_info.location_type = DebugInfo::VariableInfo::LocationType::Address;
|
||||
variable_info.location_data.address = location_info.value().data.as_u32;
|
||||
}
|
||||
|
||||
if (location_info.value().type == Dwarf::DIE::AttributeValue::Type::DwarfExpression) {
|
||||
if (!location_info.has_value())
|
||||
return;
|
||||
|
||||
switch (location_info.value().type) {
|
||||
case Dwarf::DIE::AttributeValue::Type::UnsignedNumber:
|
||||
variable_info.location_type = DebugInfo::VariableInfo::LocationType::Address;
|
||||
variable_info.location_data.address = location_info.value().data.as_u32;
|
||||
break;
|
||||
case Dwarf::DIE::AttributeValue::Type::DwarfExpression: {
|
||||
auto expression_bytes = ReadonlyBytes { location_info.value().data.as_raw_bytes.bytes, location_info.value().data.as_raw_bytes.length };
|
||||
auto value = Dwarf::Expression::evaluate(expression_bytes, regs);
|
||||
|
||||
|
@ -243,7 +246,10 @@ static void parse_variable_location(const Dwarf::DIE& variable_die, DebugInfo::V
|
|||
variable_info.location_type = DebugInfo::VariableInfo::LocationType::Address;
|
||||
variable_info.location_data.address = value.data.as_u32;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
dbgln("Warninig: unhandled Dwarf location type: {}", (int)location_info.value().type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -297,13 +303,15 @@ OwnPtr<DebugInfo::VariableInfo> DebugInfo::create_variable_info(const Dwarf::DIE
|
|||
if (member.is_null())
|
||||
return;
|
||||
auto member_variable = create_variable_info(member, regs);
|
||||
|
||||
ASSERT(member_variable);
|
||||
|
||||
if (type_die.value().tag() == Dwarf::EntryTag::EnumerationType) {
|
||||
member_variable->parent = type_info.ptr();
|
||||
type_info->members.append(member_variable.release_nonnull());
|
||||
} else {
|
||||
if (variable_info->location_type == DebugInfo::VariableInfo::LocationType::None) {
|
||||
return;
|
||||
}
|
||||
ASSERT(variable_info->location_type == DebugInfo::VariableInfo::LocationType::Address);
|
||||
|
||||
if (member_variable->location_type == DebugInfo::VariableInfo::LocationType::Address)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue