diff --git a/src/backend/lldb/lldb_backend.cpp b/src/backend/lldb/lldb_backend.cpp index 0c94ce3..f7aef6b 100644 --- a/src/backend/lldb/lldb_backend.cpp +++ b/src/backend/lldb/lldb_backend.cpp @@ -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(state)); + + if (state != lldb::StateType::eStateStopped) { + // TODO: handle other stopped states, e.g. crashed + spdlog::trace("Not handling initial state {}", static_cast(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{}}); @@ -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{}}));