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;
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;
// TODO: do initialization
// TODO: we should only do this when the process was stopped, no?
@@ -278,28 +286,28 @@ void LLDBBackend::prepare_proc_info(
}
auto frame = _process->GetThreadAtIndex(0).GetFrameAtIndex(0);
const auto regs = frame.GetRegisters();
/*const auto len = regs.GetSize();
for (size_t i = 0; i < len; ++i) {
auto reg_or_set = regs.GetValueAtIndex(i);
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));
info.reg_names.emplace_back(reg_or_set.GetName());
continue;
}
printf("Got register set %s\n", reg_or_set.GetName());
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) {
auto reg = reg_or_set.GetChildAtIndex(child_idx);
printf("Got register %s (%s) with value: %lX\n", reg.GetName(), reg.GetTypeName(), reg.GetValueAsUnsigned(0));
if (is_gp_set && info.arch == Arch::x86_64 && reg.GetByteSize() < 8) {
// skip non-full regs here
printf(" -> Skipped\n");
continue;
}
info.reg_names.emplace_back(reg.GetName());
}
}*/
/*const auto regs = frame.GetRegisters();
const auto len = regs.GetSize();
for (size_t i = 0; i < len; ++i) {
auto reg_or_set = regs.GetValueAtIndex(i);
if (reg_or_set.GetValueType() == eValueTypeRegister) {
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());
continue;
}
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";
for (uint32_t child_idx = 0; child_idx < reg_or_set.GetNumChildren(); ++child_idx) {
auto reg = reg_or_set.GetChildAtIndex(child_idx);
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) {
// skip non-full regs here
spdlog::trace(" -> Skipped");
continue;
}
//info.reg_names.emplace_back(reg.GetName());
}
}*/
if (info.arch == Arch::x86_64)
{
@@ -640,8 +648,8 @@ dbgui::data::type_info::TypeID
auto base_id = parse_type_inner(out_vec, base_type);
out_vec.push_back(type_info::TypeInfo{
.type = type_info::Type::_enum,
.byte_size = type_copy.GetByteSize(),
.enum_base = base_id,
.byte_size = type_copy.GetByteSize(),
.display_name = std::string{display_name},
.internal_name = std::string{internal_name},
.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);
_types.emplace_back(std::make_pair(
lldb_type, TypeInfo{.type = Type::_enum,
.byte_size = lldb_type.GetByteSize(),
.enum_base = base_id,
.byte_size = lldb_type.GetByteSize(),
.display_name = std::string{display_name},
.internal_name = std::string{internal_name},
.member_types = std::vector<MemberInfo>{}}));