1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/***
DebuggerKit
(C) 2025 Amlal El Mahrouss
File: NeKernelContract.cc
Purpose: NeCTI Debugger
*/
#ifdef DK_NEKERNEL_DEBUGGER
/// @author Amlal El Mahrouss
/// @brief Kernel Debugger Protocol
#include <CompilerKit/Defines.h>
#include <DebuggerKit/NeKernelContract.h>
#include <DebuggerKit/Platform.h>
#include <ThirdParty/Dialogs.h>
using namespace DebuggerKit::NeKernel;
using namespace DebuggerKit::NeKernel::Detail;
NeKernelContract::NeKernelContract() = default;
NeKernelContract::~NeKernelContract() = default;
Bool NeKernelContract::Attach(CompilerKit::STLString path, CompilerKit::STLString argv,
ProcessID& pid) noexcept {
if (path.empty() || argv.empty()) return NO;
m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (m_socket == -1) return NO;
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(kDebugPort);
if (::inet_pton(AF_INET, argv.c_str(), &server_addr.sin_addr) <= 0) return NO;
auto ret = (::connect(m_socket, (struct sockaddr*) &server_addr, sizeof(server_addr)) == -1);
if (ret) return NO;
CompilerKit::STLString pkt = Detail::kDebugMagic;
pkt += ";\r";
ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
return ret;
}
Bool NeKernelContract::BreakAt(CompilerKit::STLString symbol) noexcept {
CompilerKit::STLString pkt = Detail::kDebugMagic;
pkt += ";SYM=";
pkt += symbol;
pkt += ";\r";
if (pkt.size() > kDebugCmdLen) return NO;
auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
return ret;
}
Bool NeKernelContract::Break() noexcept {
CompilerKit::STLString pkt = Detail::kDebugMagic;
pkt += ";BRK=1;\r";
auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
return ret;
}
Bool NeKernelContract::Continue() noexcept {
CompilerKit::STLString pkt = Detail::kDebugMagic;
pkt += ";CONT=1;\r";
auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
return ret;
return NO;
}
Bool NeKernelContract::Detach() noexcept {
CompilerKit::STLString pkt = Detail::kDebugMagic;
pkt += ";DTCH=1;\r";
auto ret = ::send(m_socket, pkt.data(), pkt.size(), 0) > 0;
if (ret) ::close(m_socket);
return ret;
}
#endif // DK_NEKERNEL_DEBUGGER
|