From 4f0f320ac4367e63cc7f070c2221ac1ff3b95438 Mon Sep 17 00:00:00 2001 From: T0b1 Date: Sat, 3 Jun 2023 01:32:24 +0200 Subject: [PATCH] WIP --- src/backend/lldb/lldb_backend.cpp | 59 ++++++++++++++++++++++++++++++ src/data.h | 43 ++++++++++++++++++++++ src/frontend/frontend.cpp | 17 +++++++++ src/frontend/frontend.h | 3 ++ src/frontend/window.cpp | 18 +++++++++ tmp/main | Bin 23504 -> 26664 bytes tmp/main.c | 11 ------ tmp/main.cpp | 19 ++++++++++ tmp/sec.cpp | 13 +++++++ 9 files changed, 172 insertions(+), 11 deletions(-) create mode 100644 src/data.h delete mode 100644 tmp/main.c create mode 100644 tmp/main.cpp create mode 100644 tmp/sec.cpp diff --git a/src/backend/lldb/lldb_backend.cpp b/src/backend/lldb/lldb_backend.cpp index 6292d48..a6feed4 100644 --- a/src/backend/lldb/lldb_backend.cpp +++ b/src/backend/lldb/lldb_backend.cpp @@ -123,6 +123,8 @@ void LLDBBackend::handle_state_change(lldb::StateType state) } } + this->dump_threads(); + switch (state) { case eStateStopped: @@ -280,6 +282,63 @@ void LLDBBackend::dump_threads() if (sel.IsValid()) { printf("Selected Thread: %lu\n", sel.GetThreadID()); + + auto frame = sel.GetFrameAtIndex(0); + auto symctx = frame.GetSymbolContext(eSymbolContextEverything); + auto stream = SBStream{}; + symctx.GetDescription(stream); + + printf("Symctx: %.*s\n", static_cast(stream.GetSize()), + stream.GetData()); + + auto list = _target.FindTypes("test::MyType"); + printf("List len: %lu\n", list.GetSize()); + auto len = list.GetSize(); + for (uint32_t i = 0; i < len; ++i) + { + auto typ = list.GetTypeAtIndex(i); + stream.Clear(); + typ.GetDescription(stream, eDescriptionLevelFull); + + printf("Type %u: %.*s\n", i, static_cast(stream.GetSize()), + stream.GetData()); + } + + stream.Clear(); + auto sc = + frame.GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol); + + uint64_t start, end; + if (sc.GetFunction().IsValid()) + { + auto fn = sc.GetFunction(); + start = fn.GetStartAddress().GetLoadAddress(_target); + end = fn.GetEndAddress().GetLoadAddress(_target); + } else if (sc.GetSymbol().IsValid() + && sc.GetSymbol().GetStartAddress().IsValid()) + { + auto sym = sc.GetSymbol(); + start = sym.GetStartAddress().GetLoadAddress(_target); + end = sym.GetEndAddress().GetLoadAddress(_target); + } else + { + start = frame.GetPC(); + end = start + 0x100; + } + + auto buf = std::vector{}; + buf.resize(end - start); + auto err = SBError{}; + _target.ReadMemory(SBAddress{start, _target}, buf.data(), buf.size(), err); + + auto inst_list = + _target.GetInstructionsWithFlavor(start, "intel", buf.data(), buf.size()); + stream.Clear(); + inst_list.GetDescription(stream); + printf("InstList: %.*s\n", static_cast(stream.GetSize()), + stream.GetData()); + + //printf("Disasm: %s\n", frame.Disassemble()); } else { printf("Selected thread not valid\n"); diff --git a/src/data.h b/src/data.h new file mode 100644 index 0000000..0dd52dd --- /dev/null +++ b/src/data.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include + +namespace dbgui::data +{ + struct DataSource + { + enum class Type : uint8_t + { + reg, + // TODO: special IP/SP source? so that scope selection can apply to that? + // variable, + // const, + }; + + struct Reg + { + // TODO: identify through names? + uint16_t set; + uint16_t idx; + }; + + Type type; + std::variant data; + }; + + struct DataNode + { + size_t id; + }; + + struct DataResult + { + // TODO: needs indicator that data was failed to be retrieved + size_t id; + std::vector data; + }; + +} // namespace dbgui::data \ No newline at end of file diff --git a/src/frontend/frontend.cpp b/src/frontend/frontend.cpp index 719d46a..31ca95b 100644 --- a/src/frontend/frontend.cpp +++ b/src/frontend/frontend.cpp @@ -27,6 +27,16 @@ Frontend::Frontend() void Frontend::run_frame() { + if (_draw_metric_window) + { + ImGui::ShowMetricsWindow(); + } + + if (_draw_stack_tool) + { + ImGui::ShowStackToolWindow(); + } + this->handle_msgs(); this->draw_open_popup(); this->draw_header(); @@ -98,6 +108,13 @@ void Frontend::draw_header() } ImGui::EndMenu(); } + + if (ImGui::BeginMenu("Debug")) + { + ImGui::MenuItem("Metrics", nullptr, &_draw_metric_window); + ImGui::MenuItem("Stack Tool", nullptr, &_draw_stack_tool); + ImGui::EndMenu(); + } ImGui::EndMainMenuBar(); } diff --git a/src/frontend/frontend.h b/src/frontend/frontend.h index e1fe92f..7ada723 100644 --- a/src/frontend/frontend.h +++ b/src/frontend/frontend.h @@ -41,6 +41,9 @@ namespace dbgui::frontend bool _draw_second = false; + bool _draw_metric_window = false; + bool _draw_stack_tool = false; + bool _draw_open_popup = false; ImGuiID _open_popup_id = 0; std::vector _open_popup_name_buf = {}; diff --git a/src/frontend/window.cpp b/src/frontend/window.cpp index 3381bf5..3b9b5fd 100644 --- a/src/frontend/window.cpp +++ b/src/frontend/window.cpp @@ -88,6 +88,7 @@ void RegWindow::draw(const Frontend &frontend) continue; } + // TODO: formatting options switch (reg.bytes.size()) { case 1: std::snprintf(buf, sizeof(buf), "%X", reg.bytes[0]); break; @@ -109,7 +110,24 @@ void RegWindow::draw(const Frontend &frontend) default: std::snprintf(buf, sizeof(buf), ""); break; } + ImGui::PushID(set_idx * 1000 + i); ImGui::Text(buf); + if (ImGui::IsItemHovered() + && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) + { + ImGui::OpenPopup("Context"); + } + + if (ImGui::BeginPopup("Context")) + { + if (ImGui::Selectable("Copy")) + { + ImGui::SetClipboardText(buf); + } + ImGui::EndPopup(); + } + + ImGui::PopID(); } ImGui::EndTable(); } diff --git a/tmp/main b/tmp/main index b2fdb7ccf5d407c67bd0de19d026ee10b3edf3cb..d87e84741ca9737acba15f8f7555fca2b643724d 100755 GIT binary patch delta 4548 zcmai2eN0r@6~Fh*Jch@>$S?!Lpj`&P6=w#NZ$SqE0R>SP6>#lyn0df-;SJ0O#m08D zMq8|H#oN|yYRxuT({^LFQZ`v*YO}_4#s9F)wzivYvuR9mt6fb@+wI!YbKZS3eC#&8 zWX}Da^E>yRb3fmE%)CW^GDFX=cg%jCq>7JJku2gPYsl(}?GsXo$eEIf-+QIglq;v1 zm3r%+>1~oV$>s)hN`v3Do9okcJ`E)6MuFQ~*h%VGd0+RsuX`nHqI(g6-Jrjf%6J=6 z#$FLRivCyEReGZ;CK(d;yXxqRYu5biyC*N)cwN0+Hu75LkKSjO3@?d!&{+_GLtt`-j4+9F6%SF%)491Mc+ZBlB+4beu>_}te!&anANA*ojNOF?4iSK(j!~*MebtKU1nL4 z*GsRnecnQPjg5G}Xn-9BYn^+cWL8S{cY-}F*)EOhy^n&ne6hyHN>@uKbpG_zmD0cD zIyXTCzQ1tXgsj!+GU(l*vk$?}*&dx;fo$Rd*hNA$%2)(S(F-83qW$thsaUY1Z?|?8}BMCx`RFu+HbyY^KqQ?4X}%wobMyPjM(k`JK{9N9;XE=nuoa5`D?WQ4e{oJ4-x+n z@s+3(cYY|t?gG3^9iBDhQ_1hAUfk`OahqC+# z$_kuvp-O~9E>v4l)_e}-)(t4@t{}T@66N-rD1EpT!j3N^+n}Iqilb%cNtDgsMA`BR z%EYd6q<7b&Y->l^-i@;3U8MJZfO6ksl>0wM**T8vff10zbP+7nXbwZx>DR!3M_JO3 zGVX3D8Gi6dpP{+9v(JE|83D;e0Vh0xM||n=qnEO@!)so42NJZv+%zJ(?iT|6h*0We`*0QdKta%_*)Ad2 zw+DWhm=;!otDF!`d>a70h~f&0H$ezDK^T4o!gvo=F$Xf^o6ZM>M8##N#LT#8sugKm zfcGRipbQQx5xGw#L;jFT2E%HAiiZ+<@2Ms{f#{&34D%F`NhPsm^FmEakO$Tx#gr(HBbAuuy+B{! zpQIpu5~{HUJWo=mwD8(cH4pDVcu4WS3@LhtBjGP7fmqZV?Cp<-ymb!=z&#Pb$a5n;x0%6tC7wQLNTn&NQGXU>(FR&Ax#;L2#R}J`1 z+Oyk3r`h=Kb+njG?sm{ED5Y8>91oI1p0Ins>|)k7N9hsGmP=CKI&fUD^l5ennceQw z^rSe>M%o;$A{yWZ{xez7p$= z$m^^g*gG0)A;Z}|jnM7{Kz~BETLKk(_UY_ez42466+CowyKW}`0J{}#?Cd3(!;=N_ zUN9o|aa&<|wq|vb%q89{^r%apV;jNlg4M83-D+QFOf1+=fk;eIgPt&K^qu?b+neO3 zJ&m#q8r&;#Q;TkFY1~ib#_m1!?X3+&Zf@(?QQsza?A-ZcQ>WZnzoV@QS}5ApBDZ$H zcOmQ?IUZGl{L+%;U^FZb_|@Q`Lgc=XpoUoK{=!6XP>v{r;ebD;;J0Kf6p)8QaI@fP z^)vb~hE#qSjemgx(Ho5>@uE9y@rNoQp6Icmn7D$?8Afa&3NF1~rLvdJ#5l>FDhG<(=pnK7gPt6;{>Hg;F!Bu`QDKM6#bigaJ5 z;wF4-!oILc=bCwEN7+bcp|~|^cR$kYmtlV{Ea0%HG$&g~XWKaOB{q4uP&|;b8}T^_ zU)2X{%K!iX delta 1491 zcmZ`(Urbw77(eH>gh z7P4eUVzQMlE==d5CMNpk>=GAWbQ%p!eCUHQ*_-HtJSm z-}9aGS(%o+Woe&Yd264nJ-o+5m%b;(OX@~5XpW9eU(0dcupO83SGBr= zGKg{v+luzzet6LEEb@%-GXSI3)88Te2@T!8i_K_1OM~-n7t}Q6|y4{!1zaJ3^ zH!D}Ap{BZQW4#mW>u-YX)2*}(RKHh^s~R_{HOgfL!hWwr1|aF5q*1uzXKKZ+aSf@j z{S&ecU4a1If~kO)ZosR7*KBx__;uZz!Cl#kr^8-wP+kzx7Z9}{MDY5VW3n#vM)A`# zf4JeU)KT1>`ohNZzd!4z6)4Si(;nEH^~inri70Vl_MW-!Hm!!-#F`;d8i~TxoQK9? zea_=pMH?4C_4IAr`A92qYMNzOlh=?}kZ(N1-{79o-w>FzLOd;h*muM(zEs`Nv-D7S>3-(7#o=mPefQ`av0~H4KGZFC!#}0 zk510A$e7TM4Nns`IvzV49%r$UkryK~Y$kkmJi_2X+|!FTXVQd4V`!xtS+xAhUwwlf?rxN)z_s$zBwql?eOXhMS+)~2GA~7>D zB+AWY(&-fq+~-|I<9siLKF3h;B>RZsxRx#iFgon+wA0LS5e@@?7+(NsXy#HndM^HaYIds8j&VX9rWUb+h0PlZ$>UN&OA zbTzvpdb`V-Q|k>Z)8aY(Hie6et?uiiX4GJvDUYD&gZCCs$=^7_ HvCjVhLg+rm diff --git a/tmp/main.c b/tmp/main.c deleted file mode 100644 index 46d7524..0000000 --- a/tmp/main.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -int main(int argc, char* argv[]) { - int tmp = 10; - while (tmp != 0) { - sleep(1); - tmp--; - } - return 0; -} diff --git a/tmp/main.cpp b/tmp/main.cpp new file mode 100644 index 0000000..d26ebb2 --- /dev/null +++ b/tmp/main.cpp @@ -0,0 +1,19 @@ +#include +#include + +namespace { + struct MyType { + int data; + }; +} + +void helper_fn(); + +int main(int argc, char* argv[]) { + MyType tmp = MyType{10}; + while (tmp.data != 0) { + helper_fn(); + tmp.data--; + } + return 0; +} diff --git a/tmp/sec.cpp b/tmp/sec.cpp new file mode 100644 index 0000000..44c18c5 --- /dev/null +++ b/tmp/sec.cpp @@ -0,0 +1,13 @@ +#include +#include + +namespace test { + struct MyType { + int data; + }; +} + +void helper_fn() { + test::MyType tmp = test::MyType{1}; + sleep(tmp.data); +}