fix bug with initial state change
This commit is contained in:
@@ -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>{}}));
|
||||||
|
|||||||
Reference in New Issue
Block a user