From 10826ff2d5513d826edeb5c297457bcd1f5c5ab5 Mon Sep 17 00:00:00 2001 From: T0b1 Date: Sun, 25 Jun 2023 02:57:11 +0200 Subject: [PATCH] ptr WIP --- src/backend/lldb/lldb_backend.cpp | 98 ++++++++++++++++++++++++++++- src/data.h | 15 ++++- src/frontend/frontend.cpp | 24 +++++++ src/frontend/target.h | 31 +++++++++ src/frontend/window.cpp | 101 +++++++++++++++++++++++++++--- src/frontend/window.h | 14 ++++- tmp/main | Bin 82584 -> 82608 bytes tmp/sec.cpp | 3 +- todos.txt | 1 + 9 files changed, 271 insertions(+), 16 deletions(-) diff --git a/src/backend/lldb/lldb_backend.cpp b/src/backend/lldb/lldb_backend.cpp index fd71240..f9d2be0 100644 --- a/src/backend/lldb/lldb_backend.cpp +++ b/src/backend/lldb/lldb_backend.cpp @@ -2146,6 +2146,100 @@ std::optional> return std::make_pair(cache_idx, node.id); } } + case read_cstr: + { + using namespace lldb; + uint16_t cache_idx = 0; + if (auto found_idx = find_node_for_src_id(node.id); found_idx) + { + cache_idx = *found_idx; + } else + { + cache_idx = get_free_res_slot(); + } + + size_t addr_id = std::get(node.data).src_id; + uint16_t addr_idx = *find_node_for_src_id(addr_id); + if (!_data_res[addr_idx] || !_data_res[addr_idx]->node.success) + { + return check_single_res_changed(data::result::Node{ + .idx = cache_idx, + .type_id = data::type_info::TypeID::none(), + .success = false, + }); + } + + if (_data_res[addr_idx]->node.type_id.type != data::type_info::Type::ptr) + { + return check_single_res_changed(data::result::Node{ + .idx = cache_idx, + .type_id = data::type_info::TypeID::none(), + .success = false, + }); + } + + auto addr = std::get(_data_res[addr_idx]->node.data); + std::vector buf{}; + + char tmp_buf[256]; + auto success = true; + while (true) + { + auto lldb_addr = _target.ResolveLoadAddress(addr); + auto err = SBError{}; + err.Clear(); + auto bytes_read = + _target.ReadMemory(lldb_addr, tmp_buf, sizeof(tmp_buf), err); + if (bytes_read == 0) + { + success = false; + break; + } + + auto null_pos = std::find(tmp_buf, tmp_buf + bytes_read, '\0'); + if (null_pos != tmp_buf + bytes_read) + { + size_t len = null_pos - tmp_buf; + auto old_size = buf.size(); + buf.resize(old_size + len + 1); + std::copy(tmp_buf, null_pos + 1, buf.data() + old_size); + break; + } + + if (bytes_read != sizeof(tmp_buf)) + { + if (err.Fail()) + { + printf("ReadAsCStr failed: %s\n", err.GetCString()); + success = false; + break; + } + } + + auto old_size = buf.size(); + buf.resize(old_size + bytes_read); + std::copy(tmp_buf, tmp_buf + bytes_read, buf.data() + old_size); + + addr += bytes_read; + } + + if (!success) + { + return check_single_res_changed(data::result::Node{ + .idx = cache_idx, + .type_id = data::type_info::TypeID::none(), + .success = false, + }); + } + + // TODO: embed the array size into the TypeID and then make this + // an i8 array type? + return check_single_res_changed( + data::result::Node{.idx = cache_idx, + .type_id = data::type_info::TypeID::custom(), + .success = true, + .data = std::move(buf)}); + } } printf("Unhandled data type\n"); @@ -3045,7 +3139,7 @@ dbgui::data::result::NodeIdx LLDBBackend::build_nodes_for_var_uncached( // TODO: always get child info for first level // TODO: depending on what is previewed? - res_node.success = true; + res_node.success = err.Success(); to_send.push_back(res_node); _data_res[res_idx] = CachedDataRes{.node = std::move(res_node), @@ -3132,7 +3226,7 @@ void LLDBBackend::build_nodes_for_var_cached( // TODO: always get child info for first level // TODO: depending on what is previewed? - res_node.success = true; + res_node.success = err.Success(); if (!_data_res[cache_idx]->node.success || _data_res[cache_idx]->node.data != res_node.data) { diff --git a/src/data.h b/src/data.h index 35bcbef..48fff7d 100644 --- a/src/data.h +++ b/src/data.h @@ -321,7 +321,8 @@ namespace dbgui::data uint16_t idx; }; - struct Variable { + struct Variable + { std::string expr_path; }; @@ -343,6 +344,14 @@ namespace dbgui::data size_t src_id; }; + // need this as length is unbounded + // note: does not support wchar strings right now + struct ReadAsCStr + { + // node that provides the address to read at + size_t src_id; + }; + struct Node { enum class Type : uint8_t @@ -351,12 +360,14 @@ namespace dbgui::data disassemble, line_entry, locals, + read_cstr, }; size_t id; Type type; // when adding something here, remember to update LLDBBackend::add_data_node - std::variant data; + std::variant + data; }; } // namespace source diff --git a/src/frontend/frontend.cpp b/src/frontend/frontend.cpp index b8a9ace..f7a1486 100644 --- a/src/frontend/frontend.cpp +++ b/src/frontend/frontend.cpp @@ -62,6 +62,14 @@ void Frontend::run_frame() if (ImGui::Begin("Test", nullptr, win_flags)) { + if (this->target) + { + for (auto &entry : this->target->expr_cache) + { + entry.used_this_frame = false; + } + } + // TODO: if we just do SetNextWindowDockID in each of the windows // this seems to crash once the first window is docked to it? // so some id change is necessary @@ -85,6 +93,22 @@ void Frontend::run_frame() } //this->dock_id = ImGui::GetWindowDockID(); } + + if (this->target) + { + for (size_t i = 0; i < this->target->expr_cache.size();) + { + auto &entry = this->target->expr_cache[i]; + if (!entry.used_this_frame) + { + this->target->backend->remove_data_node(entry.id); + this->target->expr_cache.erase(this->target->expr_cache.begin() + i); + } else + { + ++i; + } + } + } } ImGui::End(); diff --git a/src/frontend/target.h b/src/frontend/target.h index f81b3b9..782adac 100644 --- a/src/frontend/target.h +++ b/src/frontend/target.h @@ -78,6 +78,13 @@ namespace dbgui::frontend } }; + struct ExprCacheEntry + { + std::string expr_path; + size_t id; + bool used_this_frame = false; + }; + Target(std::string filename); std::optional data_idx_for_src_id(size_t id) @@ -108,6 +115,29 @@ namespace dbgui::frontend return &*data_res_nodes[*idx]; } + size_t find_or_create_expr_path(std::string &&path) + { + for (auto &entry : expr_cache) + { + if (entry.expr_path == path) + { + entry.used_this_frame = true; + return entry.id; + } + } + + using namespace data::source; + auto id = this->id++; + this->backend->add_data_node( + Node{.id = id, + .type = Node::Type::source, + .data = Source{.type = Source::Type::variable, + .data = Source::Variable{.expr_path = path}}}); + expr_cache.push_back(ExprCacheEntry{ + .expr_path = std::move(path), .id = id, .used_this_frame = true}); + return id; + } + TargetState state = TargetState::stopped; std::string filename; uint64_t id; @@ -124,6 +154,7 @@ namespace dbgui::frontend std::vector> src_id_to_data_idx; std::vector> data_res_nodes; std::vector types; + std::vector expr_cache; std::shared_ptr backend = nullptr; }; diff --git a/src/frontend/window.cpp b/src/frontend/window.cpp index 30273d0..7adfee0 100644 --- a/src/frontend/window.cpp +++ b/src/frontend/window.cpp @@ -1014,6 +1014,8 @@ bool WatchWindow::draw(Frontend &frontend) first = false; } + auto expr_path_vec = std::vector{}; + // ImGuiTableFlags_SizingFixedFit if (ImGui::BeginTable("##Variables", 2, ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable)) @@ -1053,9 +1055,10 @@ bool WatchWindow::draw(Frontend &frontend) reinterpret_cast(locals_data.data() + cur_off + 2), str_len}; auto node_idx = local_node.children[cur_idx]; + expr_path_vec.clear(); this->draw_value(frontend, frontend.target->data_res_nodes[node_idx]->type_id, - name, node_idx, 0); + name, node_idx, 0, expr_path_vec); cur_idx += 1; cur_off += 2 + str_len; @@ -1078,8 +1081,9 @@ bool WatchWindow::draw(Frontend &frontend) no_success = false; const auto &child_node = *frontend.target->data_res_nodes[node.children[0]]; + expr_path_vec.clear(); this->draw_value(frontend, child_node.type_id, &extra_slots[i], - node.children[0], 0); + node.children[0], 0, expr_path_vec); if (extra_slots[i].bak == "") { @@ -1192,7 +1196,8 @@ bool WatchWindow::draw(Frontend &frontend) void WatchWindow::draw_value(Frontend &frontend, data::type_info::TypeID type_id, std::variant name, - data::result::NodeIdx node_idx, size_t off) + data::result::NodeIdx node_idx, size_t off, + std::vector &expr_path) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); @@ -1367,8 +1372,12 @@ void WatchWindow::draw_value(Frontend &frontend, continue; } + expr_path.push_back(ExprPathPart{ + .ident = std::string_view{name_begin, name_end - name_begin}, + .deref = false}); this->draw_value(frontend, member.type_id, member.name, node_idx, - off + member.offset); + off + member.offset, expr_path); + expr_path.pop_back(); } } else { @@ -1379,15 +1388,21 @@ void WatchWindow::draw_value(Frontend &frontend, size_t el_count = frontend.target->types[type_id.idx].byte_size / member_size; + expr_path.push_back(ExprPathPart{ + .ident = std::string_view{name_begin, name_end - name_begin}, + .array = true}); + char buf[32]; size_t member_off = 0; for (size_t i = 0; i < el_count; ++i) { std::snprintf(buf, sizeof(buf), "[%lu]", i); this->draw_value(frontend, member_ty_id, buf, node_idx, - off + member_off); + off + member_off, expr_path); member_off += member_size; } + + expr_path.pop_back(); } ImGui::TreePop(); @@ -1435,17 +1450,22 @@ void WatchWindow::draw_value(Frontend &frontend, } } + auto tree_open = false; if (!is_editing) { char tree_id_buf[128]; std::snprintf(tree_id_buf, sizeof(tree_id_buf), "%u#off%lu", node_idx, off); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_SpanFullWidth; + if (type_id.type != Type::ptr) + { + flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; + } + // TODO: better id - ImGui::TreeNodeEx( - tree_id_buf, - ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_Leaf - | ImGuiTreeNodeFlags_NoTreePushOnOpen, - "%.*s", static_cast(name_end - name_begin), name_begin); + tree_open = + ImGui::TreeNodeEx(tree_id_buf, flags, "%.*s", + static_cast(name_end - name_begin), name_begin); //ImGui::TextUnformatted(name_begin, name_end); if (name.index() == 1 && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) @@ -1518,6 +1538,43 @@ void WatchWindow::draw_value(Frontend &frontend, { // TODO: ptr size ImGui::Text("%lX", node.get_primitive(off)); + if (tree_open) + { + // TODO: make this func be able to not print the "outer" line + // and just accept a bool to only draw the containing value + std::string path{"*"}; + // why cant i just path name_begin, name_end to string_view? :[ + construct_expr_path( + path, expr_path, + std::string_view{name_begin, + static_cast(name_end - name_begin)}); + + auto src_id = + frontend.target->find_or_create_expr_path(std::move(path)); + auto res_idx = frontend.target->data_idx_for_src_id(src_id); + if (res_idx) + { + const auto &node = *frontend.target->data_res_nodes[*res_idx]; + if (node.success && node.children.size() == 1) + { + auto data_idx = node.children[0]; + const auto &data_node = + *frontend.target->data_res_nodes[data_idx]; + expr_path.push_back(ExprPathPart{ + .ident = std::string_view{name_begin, static_cast( + name_end - name_begin)}, + .deref = true}); + + this->draw_value(frontend, data_node.type_id, + std::string_view{""}, data_idx, 0, + expr_path); + + expr_path.pop_back(); + } + } + + ImGui::TreePop(); + } break; } case _enum: @@ -1563,6 +1620,30 @@ void WatchWindow::draw_value(Frontend &frontend, } } +void WatchWindow::construct_expr_path(std::string &out, + const std::vector &path, + std::string_view tail) +{ + for (const auto &entry : path) + { + // FIXME: BIGGEST HACK in cinema history + if (entry.ident == "") + { + continue; + } + + out += entry.ident; + if (entry.deref) + { + out += "->"; + } else if (!entry.array) + { + out += '.'; + } + } + out += tail; +} + void Window::handle_source_updated(Target &target, size_t id) { switch (this->type) diff --git a/src/frontend/window.h b/src/frontend/window.h index 2f0b6d7..699ece4 100644 --- a/src/frontend/window.h +++ b/src/frontend/window.h @@ -135,11 +135,23 @@ namespace dbgui::frontend bool edit_was_started = false; }; + // TODO: cache the expr_path by node_idx + off or smth? + struct ExprPathPart + { + std::string_view ident; + bool deref = false; + bool array = false; + }; + bool draw(Frontend &); void draw_value(Frontend &, data::type_info::TypeID, std::variant name, - data::result::NodeIdx node_idx, size_t off); + data::result::NodeIdx node_idx, size_t off, + std::vector &expr_path); // void handle_source_updated(Target& target, size_t id); + void construct_expr_path(std::string &out, + const std::vector &, + std::string_view tail); std::string id; bool open; diff --git a/tmp/main b/tmp/main index 5b76443afc1e533d8fd2043cd9fd6abc2b4a1d70..b19ca1a512ae0e2d085fed575a4e25bed85f3c83 100755 GIT binary patch delta 9803 zcmZ`<3tUxI*5CV_d+z~`a6v9tkoN_I>lGA41wldWDrB0EOl>TD;v3%zYF!(&!dKAF zt|pZ_HKjSB(Tq)L*<(bTZ;Wcj%O#WpzNAa7rs8Cg78skSTc;;e>-pz5NyZ5_$nrD4A z{?LbuKW`nia_6W2d#brnw`e@2dAGH;3%81lt}b77i}xsp(I)Tf8H`mVmDPFA*VmVAnQ#uZT`xtZl(MqAmbNu; zrPM8L9*wd37VnpFFlq6&CCNsP0`%;U?d_HJe;>8Gz3Y6H_ETP<)&WeGyWqHflXo3p zn*mdjmbNi?{-R%5-D@4r-$X<8Wp$^i(T@ozRj_VpOP5utIYEz`ZvXDYYZJ=qJ}ImH zGNr|PUY8xYAV*v0@?OALKc%tOc|XNC+t7^`?JJ&Xjgtd3JvK3)3ryve(Tnu%T^ATdRV;OILAg0o{_IomW6=u(u z)t#a~UcXKqn{fJPqS*j_5u*g&^Wf(R_zHmaKt7Lww+4(u+sT-GwY0rOj;Kcyo`UE= zS>3U+x;NYYO45$m+LZc>c1lSnowc-``Ki7A#A}Q-Tb$=ZA4u6e_8(W;+jk+fF<-T} z$AYJT7l4lgr!?6PejfZVIP#56{JOn83%nY<417KK9PmfM?*l(BK1kWgzY#U5$^5+7 zkvhzK5rMU2rIoTF5s~+3!@_OeT3x%)#R!2s0mT9D*_YefOYt1Utm)L}L%&g^x{~<; zF$DBEG0m09GesSqv&3FkvgWuV-f$&p5m&_LE*I4z(vr*x)@IIDdroq8qIp2twJP>-qYM|a4sCW23tLoiZ_WlE=BXms|V+E~!8PgrLW=BtKxXk>uxV=R>li*PL&cQ2n|yLCSw{ z7D)c1bF1XOpPZxRL%XvIyqkk@=Ux)TOgG=?M|_4^b`$Yg<{gq(nu{f$ZQdjK9P<&$ z=bFz+KF@qZ^7-b6k}oi|QDnc+Op|B+!)UsY#JHqe;(#P(Uv|R>T;&T@cIIQWVW5DyF*&BqV+SrpLxVx`DAK zs9un2*m7!$#c#@I%;azOX6$d!oL0t1r>EW~jpGu#GM38qDawBroI(jGnvEQE@AR^J zGGiJ1PbOo%q3+iKVe!+Wu@UhPaZHp!I9@75(Tqe4V)Bduo@BUq8p4A?i?~0a#p!$p zx|I&)aVSobGE%%aBLP;YK_kUCGhCptGd-X;%{US+%RMDcOV&mN<(P6YvowZ1F>y-QGm*>OzzR?sfz>+(2Uj!##RGy zzeK^FyT#JVben>T#?HrMm2Nb1snV@cL)Z~PWJ@;@^Q3}Dd#6Oce!G{YZ&MvCv}c<`J#*Ha=>%97Iu85hD>5CA{k2>Wdn*FHdE?$-AKI+ zlLGOhD36mmQZ&pZ-v=apQ__o)hR-8;FG)vAI&U5Ye8aqS(0%igLEo5{G*PzS<#TM{ zwx=z|QN%F{heHC23b|YnO8-ZTF$}qr3*CSYJ?rAigy~_6QHl-bCWyyLl_;4{?cXt< zvT@`5K4|U5`KfsR0MsVh=ckp>G&0NCESUGP8f#}Uwgjd(yBM2*qN%{_#LjLjwi-{& zWo!@BRZuM_wM|T0kmOUK=dexNCR&YZ%q&gkegFGdjR9Z+(jn&AU2aFH?W3gV+P*k{5a>>zP?Ao>lt1-^492G-9 zB8X8Pl9=CFjY$YSb$TlFD}I5IyOG+Gl*a>BBMJ+R&|86gG!5_M2*lkB>OqHKJ;Hmj5xV4K7!0Fcv-Ncz|*%2lYMeEslR98un>VX)$C|Xo4cA%5Bi?gKFF{n=|t3NN!g5smaG!omAbUAg*vY-;3 zT@Ye42U?z(i9-;jb3Lnms-a1AZHRFMD}Z{i0m#SyAN0@1C+!{yF~YgBJCex^_O3L< zkrFG8F9|Ouf0rP#VvYa0bv0+wOKXTR4+k8flYlIcXc4tELpm6XYGu&DE{vQ@^0V%L z7h>e+DF;3vcPIx-muAR-J&S6K5KQAhuE*VF{P?5#

Snq~KlsL0CYtRZj<>SMw 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 diff --git a/tmp/sec.cpp b/tmp/sec.cpp index a8a6011..d592d95 100644 --- a/tmp/sec.cpp +++ b/tmp/sec.cpp @@ -16,6 +16,7 @@ namespace test { uint32_t test_bits : 20; uint32_t test_bits2: 12; MyEnum enum_val; + std::string* ptr = nullptr; }; } @@ -26,7 +27,7 @@ void helper_fn() { unsigned int y = 30; sleep(tmp.data); { - test::MyType tmp = test::MyType{2}; + test::MyType tmp = test::MyType{.data = 2, .ptr = &test}; sleep(tmp.data); } } diff --git a/todos.txt b/todos.txt index 66a80a4..02fa295 100644 --- a/todos.txt +++ b/todos.txt @@ -3,3 +3,4 @@ - memory + cpu statistics like VS - visualization for branches (draw arror if branch is taken (or in both cases?)) - allow (partial) path override for symbol source paths +- check if classes with base classes work