fix bug with initial state change

This commit is contained in:
T0b1
2024-05-13 18:28:00 +02:00
parent 894ff6a408
commit e1be42052d

View File

@@ -141,6 +141,14 @@ void LLDBBackend::handle_state_change(lldb::StateType state)
using namespace lldb; using namespace lldb;
if (_first_run) if (_first_run)
{ {
spdlog::trace("Got initial state change: {}", static_cast<uint32_t>(state));
if (state != lldb::StateType::eStateStopped) {
// TODO: handle other stopped states, e.g. crashed
spdlog::trace("Not handling initial state {}", static_cast<uint32_t>(state));
return;
}
_first_run = false; _first_run = false;
// TODO: do initialization // TODO: do initialization
// TODO: we should only do this when the process was stopped, no? // TODO: we should only do this when the process was stopped, no?
@@ -278,26 +286,26 @@ void LLDBBackend::prepare_proc_info(
} }
auto frame = _process->GetThreadAtIndex(0).GetFrameAtIndex(0); auto frame = _process->GetThreadAtIndex(0).GetFrameAtIndex(0);
const auto regs = frame.GetRegisters(); /*const auto regs = frame.GetRegisters();
/*const auto len = regs.GetSize(); const auto len = regs.GetSize();
for (size_t i = 0; i < len; ++i) { for (size_t i = 0; i < len; ++i) {
auto reg_or_set = regs.GetValueAtIndex(i); auto reg_or_set = regs.GetValueAtIndex(i);
if (reg_or_set.GetValueType() == eValueTypeRegister) { if (reg_or_set.GetValueType() == eValueTypeRegister) {
printf("Got register %s (%s) with value: %lX\n", reg_or_set.GetName(), reg_or_set.GetTypeName(), reg_or_set.GetValueAsUnsigned(0)); spdlog::trace("Got register {} ({}) with value: {:X}", reg_or_set.GetName(), reg_or_set.GetTypeName(), reg_or_set.GetValueAsUnsigned(0));
info.reg_names.emplace_back(reg_or_set.GetName()); //info.reg_names.emplace_back(reg_or_set.GetName());
continue; continue;
} }
printf("Got register set %s\n", reg_or_set.GetName()); spdlog::trace("Got register set {}\n", reg_or_set.GetName());
const auto is_gp_set = std::string_view{reg_or_set.GetName()} == "General Purpose Registers"; const auto is_gp_set = std::string_view{reg_or_set.GetName()} == "General Purpose Registers";
for (uint32_t child_idx = 0; child_idx < reg_or_set.GetNumChildren(); ++child_idx) { for (uint32_t child_idx = 0; child_idx < reg_or_set.GetNumChildren(); ++child_idx) {
auto reg = reg_or_set.GetChildAtIndex(child_idx); auto reg = reg_or_set.GetChildAtIndex(child_idx);
printf("Got register %s (%s) with value: %lX\n", reg.GetName(), reg.GetTypeName(), reg.GetValueAsUnsigned(0)); spdlog::trace("Got register {} ({}) with value: {:X}", reg.GetName(), reg.GetTypeName(), reg.GetValueAsUnsigned(0));
if (is_gp_set && info.arch == Arch::x86_64 && reg.GetByteSize() < 8) { if (is_gp_set && info.arch == Arch::x86_64 && reg.GetByteSize() < 8) {
// skip non-full regs here // skip non-full regs here
printf(" -> Skipped\n"); spdlog::trace(" -> Skipped");
continue; continue;
} }
info.reg_names.emplace_back(reg.GetName()); //info.reg_names.emplace_back(reg.GetName());
} }
}*/ }*/
@@ -640,8 +648,8 @@ dbgui::data::type_info::TypeID
auto base_id = parse_type_inner(out_vec, base_type); auto base_id = parse_type_inner(out_vec, base_type);
out_vec.push_back(type_info::TypeInfo{ out_vec.push_back(type_info::TypeInfo{
.type = type_info::Type::_enum, .type = type_info::Type::_enum,
.byte_size = type_copy.GetByteSize(),
.enum_base = base_id, .enum_base = base_id,
.byte_size = type_copy.GetByteSize(),
.display_name = std::string{display_name}, .display_name = std::string{display_name},
.internal_name = std::string{internal_name}, .internal_name = std::string{internal_name},
.member_types = std::vector<type_info::MemberInfo>{}}); .member_types = std::vector<type_info::MemberInfo>{}});
@@ -2659,8 +2667,8 @@ dbgui::data::type_info::TypeID
auto base_id = this->build_type_from_lldb_type(base_type); auto base_id = this->build_type_from_lldb_type(base_type);
_types.emplace_back(std::make_pair( _types.emplace_back(std::make_pair(
lldb_type, TypeInfo{.type = Type::_enum, lldb_type, TypeInfo{.type = Type::_enum,
.byte_size = lldb_type.GetByteSize(),
.enum_base = base_id, .enum_base = base_id,
.byte_size = lldb_type.GetByteSize(),
.display_name = std::string{display_name}, .display_name = std::string{display_name},
.internal_name = std::string{internal_name}, .internal_name = std::string{internal_name},
.member_types = std::vector<MemberInfo>{}})); .member_types = std::vector<MemberInfo>{}}));