From a93ef6a5cd5e75fa24ffd5ba48573a69faf0207b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 24 Mar 2026 12:26:53 +0100 Subject: [FEAT] DebuggerKit: Preppring for first release of Debuggers. Signed-off-by: Amlal El Mahrouss --- .../src/Frontends/NectarCompiler+AMD64.cpp | 1 - src/DebuggerKit/src/MachContract.cpp | 3 - src/DebuggerKit/src/MachContractCLI.cpp | 4 +- src/DebuggerKit/src/NeKernelContractCLI.cpp | 2 +- src/DebuggerKit/src/POSIXContractCLI.cpp | 94 ++++++++++++++++++++++ 5 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 src/DebuggerKit/src/POSIXContractCLI.cpp (limited to 'src') diff --git a/src/CompilerKit/src/Frontends/NectarCompiler+AMD64.cpp b/src/CompilerKit/src/Frontends/NectarCompiler+AMD64.cpp index 8146a88..baf7e2f 100644 --- a/src/CompilerKit/src/Frontends/NectarCompiler+AMD64.cpp +++ b/src/CompilerKit/src/Frontends/NectarCompiler+AMD64.cpp @@ -127,7 +127,6 @@ struct CompilerContext { /// @brief This function is for internal uses only, do not call it without a wrapper! CK_IMPORT_C bool NectarCheckLine(CompilerKit::STLString& input); - /// \brief Global compiler context (replaces kState) static CompilerContext kContext; diff --git a/src/DebuggerKit/src/MachContract.cpp b/src/DebuggerKit/src/MachContract.cpp index 8a897be..518f61a 100644 --- a/src/DebuggerKit/src/MachContract.cpp +++ b/src/DebuggerKit/src/MachContract.cpp @@ -9,8 +9,6 @@ #include #include -#ifdef DK_MACH_DEBUGGER - /// @brief a terrible way to import globals. #include @@ -95,6 +93,5 @@ NECTAR_MODULE(DebuggerMachPOSIX) { return EXIT_SUCCESS; } -#endif #endif diff --git a/src/DebuggerKit/src/MachContractCLI.cpp b/src/DebuggerKit/src/MachContractCLI.cpp index 0cc9b99..9bdb5b1 100644 --- a/src/DebuggerKit/src/MachContractCLI.cpp +++ b/src/DebuggerKit/src/MachContractCLI.cpp @@ -6,7 +6,7 @@ #ifdef DK_MACH_DEBUGGER -#include +#include #include #ifdef DK_MACH_DEBUGGER @@ -84,7 +84,7 @@ NECTAR_MODULE(DebuggerMach) { std::getline(std::cin, cmd); if (kUserDebugger.BreakAt(cmd)) { - pfd::notify("Debugger Event", "Add BreakAt at: " + cmd); + pfd::notify("Debugger Event", "Add breakpoint at: " + cmd); } } } diff --git a/src/DebuggerKit/src/NeKernelContractCLI.cpp b/src/DebuggerKit/src/NeKernelContractCLI.cpp index 3680f6a..13144eb 100644 --- a/src/DebuggerKit/src/NeKernelContractCLI.cpp +++ b/src/DebuggerKit/src/NeKernelContractCLI.cpp @@ -82,7 +82,7 @@ NECTAR_MODULE(DebuggerNeKernel) { std::getline(std::cin, cmd); if (kKernelDebugger.BreakAt(cmd)) { - pfd::notify("Debugger Event", "Add BreakAt at: " + cmd); + pfd::notify("Debugger Event", "Add breakpoint at: " + cmd); } } } diff --git a/src/DebuggerKit/src/POSIXContractCLI.cpp b/src/DebuggerKit/src/POSIXContractCLI.cpp new file mode 100644 index 0000000..58aa4a1 --- /dev/null +++ b/src/DebuggerKit/src/POSIXContractCLI.cpp @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (See accompanying +// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) +// Official repository: https://github.com/ne-foss-org/nectar + +#ifdef DK_POSIX_DEBUGGER + +#include +#include + +#include + +/// @internal +/// @brief Handles CTRL-C signal on debugger. +static Void dbgi_ctrlc_handler(std::int32_t _) { + if (!kPID) { + return; + } + + kUserDebugger.Break(); + + pfd::notify("Debugger Event", "Breakpoint hit!"); + + kKeepRunning = false; +} + +NECTAR_MODULE(DebuggerPOSIX) { + pfd::notify( + "Debugger Event", + "Userland Debugger\n(C) 2025 Amlal El Mahrouss, licensed under the Apache 2.0 license."); + + if (argc >= 3 && std::string(argv[1]) == "-p" && argv[2] != nullptr) { + kPath = argv[2]; + kUserDebugger.SetPath(kPath); + + kStdOut << "[+] Image set to: " << kPath << "\n"; + } else { + kStdOut << "usage: " << argv[0] << " -p \n"; + kStdOut << "example: " << argv[0] << " -p \n"; + + return EXIT_FAILURE; + } + + CompilerKit::install_signal(SIGINT, dbgi_ctrlc_handler); + + while (YES) { + if (kKeepRunning) { + continue; + } + + CompilerKit::STLString cmd{}; + + if (!std::getline(std::cin, cmd)) break; + + if (cmd == "c" || cmd == "cont" || cmd == "continue") { + if (kUserDebugger.Continue()) { + kKeepRunning = true; + + kStdOut << "[+] Continuing...\n"; + pfd::notify("Debugger Event", "Continuing..."); + } + } + + if (cmd == "d" || cmd == "detach") kUserDebugger.Detach(); + + if (cmd == "start") { + kStdOut << "[?] Enter a argument to use: "; + std::getline(std::cin, cmd); + + kUserDebugger.Attach(kPath, cmd, kPID); + } + + if (cmd == "exit") { + if (kPID > 0) kUserDebugger.Detach(); + + break; + } + + if (cmd == "break" || cmd == "b") { + kStdOut << "[?] Enter a symbol to break on: "; + + std::getline(std::cin, cmd); + + if (kUserDebugger.BreakAt(cmd)) { + pfd::notify("Debugger Event", "Add breakpoint at: " + cmd); + } + } + } + + return EXIT_SUCCESS; +} + +#endif -- cgit v1.2.3