summaryrefslogtreecommitdiffhomepage
path: root/dev/LibDebugger/src/POSIXContract.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/LibDebugger/src/POSIXContract.cc')
-rw-r--r--dev/LibDebugger/src/POSIXContract.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/dev/LibDebugger/src/POSIXContract.cc b/dev/LibDebugger/src/POSIXContract.cc
new file mode 100644
index 0000000..3caeabf
--- /dev/null
+++ b/dev/LibDebugger/src/POSIXContract.cc
@@ -0,0 +1,128 @@
+/***
+ (C) 2025 Amlal El Mahrouss
+ */
+
+#include <LibCompiler/Defines.h>
+#include <Vendor/Dialogs.h>
+#include <LibDebugger/POSIXContract.h>
+#include <cstdint>
+#include <string>
+
+#ifndef _WIN32
+
+static bool kKeepRunning = false;
+static LibDebugger::POSIX::POSIXDebuggerContract kDebugger;
+static pid_t kPID = 0L;
+
+/// @internal
+/// @brief Handles CTRL-C signal on debugger.
+static void dbgl_ctrlc_handler(std::int32_t _)
+{
+ if (!kPID)
+ {
+ return;
+ }
+
+ auto list = kDebugger.Get();
+
+ LibDebugger::CAddress addr = (LibDebugger::CAddress)list[list.size() - 1];
+
+ if (!addr)
+ {
+ pfd::notify("Debugger Event", "Invalid breakpoint at: " + std::to_string(list[list.size() - 1]));
+ return;
+ }
+
+ kDebugger.Break(addr);
+
+ pfd::notify("Debugger Event", "Breakpoint at: " + std::to_string(list[list.size() - 1]));
+
+ kKeepRunning = false;
+}
+
+LIBCOMPILER_MODULE(DebuggerPOSIX)
+{
+ pfd::notify("Debugger Event", "NeKernel Debugger\n(C) 2025 Amlal El Mahrouss, all rights reserved.");
+
+ if (argc >= 3 && std::string(argv[1]) == "-p" &&
+ argv[2] != nullptr)
+ {
+ kPID = std::stoi(argv[2]);
+ kDebugger.Attach(kPID);
+ }
+
+ ::signal(SIGINT, dbgl_ctrlc_handler);
+
+ while (YES)
+ {
+ if (kKeepRunning)
+ {
+ continue;
+ }
+
+ std::string cmd;
+ std::getline(std::cin, cmd);
+
+ if (cmd == "c" ||
+ cmd == "cont")
+ {
+ kDebugger.Continue();
+ kKeepRunning = true;
+
+ std::cout << "[+] Continuing...\n";
+ pfd::notify("Debugger Event", "Continuing...");
+ }
+
+ if (cmd == "d" ||
+ cmd == "detach")
+ kDebugger.Detach();
+
+ if (cmd == "attach")
+ {
+ std::cout << "[?] Enter a PID to attach on: ";
+
+ std::getline(std::cin, cmd);
+ kPID = std::stoi(cmd.c_str());
+
+ pfd::notify("Debugger Event", "Attach process: " + std::to_string(kPID));
+
+ kDebugger.Attach(kPID);
+ }
+
+ if (cmd == "exit")
+ {
+ if (kPID > 0)
+ kDebugger.Detach();
+
+ break;
+ }
+
+ if (cmd == "break" ||
+ cmd == "b")
+ {
+ std::cout << "[?] Enter an address/symbol to add a break on: ";
+
+ std::getline(std::cin, cmd);
+
+ auto addr = std::stoul(cmd.c_str(), nullptr, 16);
+
+ try
+ {
+ pfd::notify("Debugger Event", "Add Breakpoint at: " + std::to_string(addr));
+ }
+ catch (...)
+ {
+ pfd::notify("Debugger Event", "Add Breakpoint at: " + cmd);
+ }
+
+ LibDebugger::CAddress breakpoint_addr = reinterpret_cast<LibDebugger::CAddress>(addr);
+
+ if (breakpoint_addr)
+ kDebugger.Break(breakpoint_addr);
+ }
+ }
+
+ return EXIT_SUCCESS;
+}
+
+#endif \ No newline at end of file