summaryrefslogtreecommitdiffhomepage
path: root/dev/LibDebugger/src/POSIX.cc
blob: 89ee5723eb8336c79cb61357d72c0258db86a269 (plain)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/***
	(C) 2025 Amlal El Mahrouss
 */

#include <LibCompiler/Defines.h>
#include <LibDebugger/vendor/Dialogs.h>
#include <LibDebugger/POSIX.h>
#include <cstdint>
#include <string>

#ifndef _WIN32

static bool					 kKeepRunning = false;
LibDebugger::POSIX::Debugger kDebugger;

static void DebuggerCtrlCHandler(std::int32_t _)
{
	auto list = kDebugger.Get();

	LibDebugger::POSIX::CAddr addr = (LibDebugger::POSIX::CAddr)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)
{
	if (argc < 1)
	{
		return EXIT_FAILURE;
	}

	pid_t pid = 0L;

	if (argc >= 3 && std::string(argv[1]) == "-p" &&
		argv[2] != nullptr)
	{
		pid = std::stoi(argv[2]);
		kDebugger.Attach(pid);
	}

	::signal(SIGINT, DebuggerCtrlCHandler);

	while (YES)
	{
		if (kKeepRunning)
		{
			continue;
		}

		std::string cmd;
		std::getline(std::cin, cmd);

		if (cmd == "c" ||
			cmd == "cont")
		{
			kDebugger.Continue();
			kKeepRunning = true;
		}

		if (cmd == "d" ||
			cmd == "detach")
			kDebugger.Detach();

		if (cmd == "attach")
		{
			std::cout << "[?] Enter a PID to attach on: ";

			std::getline(std::cin, cmd);
			pid = std::stoi(cmd.c_str());

			pfd::notify("Debugger Event", "Attach process: " + std::to_string(pid));

			kDebugger.Attach(pid);
		}

		if (cmd == "exit")
		{
			if (pid > 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::POSIX::CAddr breakpoint_addr = reinterpret_cast<LibDebugger::POSIX::CAddr>(addr);

			if (breakpoint_addr)
				kDebugger.Break(breakpoint_addr);
		}
	}

	return EXIT_SUCCESS;
}

#endif