commit 0e3d59f4471fa4567cee8f913cda910430af36e4 Author: Andre Heber Date: Sat Nov 25 13:09:16 2023 +0100 main loop diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f8c2ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +main +target + +main.dSYM/ +target.dSYM/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5db2103 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "linenoise"] + path = linenoise + url = https://github.com/antirez/linenoise.git diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..15ad5f6 --- /dev/null +++ b/compile.sh @@ -0,0 +1,5 @@ +# Compile the debugger +gcc -g -o main -I./include -I./linenoise main.c src/debugger.c linenoise/linenoise.c + +# Compile the test program +gcc -g -o target target.c diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..ca8525b --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,4 @@ +-std=gnu11 +-I./include +-I./linenoise +ca \ No newline at end of file diff --git a/include/debugger.h b/include/debugger.h new file mode 100644 index 0000000..cc97a30 --- /dev/null +++ b/include/debugger.h @@ -0,0 +1,8 @@ +#include + +typedef struct debugger_s debugger_t; + +debugger_t *debugger_create(char *program_name, pid_t pid); +void debugger_destroy(debugger_t *debugger); + +void debugger_run(debugger_t *debugger); \ No newline at end of file diff --git a/linenoise b/linenoise new file mode 160000 index 0000000..93b2db9 --- /dev/null +++ b/linenoise @@ -0,0 +1 @@ +Subproject commit 93b2db9bd4968f76148dd62cdadf050ed50b84b3 diff --git a/main.c b/main.c new file mode 100644 index 0000000..2e97bc3 --- /dev/null +++ b/main.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +#include "debugger.h" + +int main(int argc, char* argv[]) { + if (argc < 2) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + char * prog = argv[1]; + + int pid = fork(); + if (pid == 0) { + // child + ptrace(PT_TRACE_ME, 0, NULL, 0); + execl(prog, prog, NULL); + } else { + // parent + printf("Started debugging %s with pid %d\n", prog, pid); + debugger_t *dbg = debugger_create(prog, pid); + debugger_run(dbg); + } + + exit(0); +} \ No newline at end of file diff --git a/src/debugger.c b/src/debugger.c new file mode 100644 index 0000000..15cc423 --- /dev/null +++ b/src/debugger.c @@ -0,0 +1,39 @@ +#include +#include +#include + +#include "linenoise.h" + +typedef struct debugger_s { + char * program_name; + pid_t pid; +} debugger_t; + +debugger_t *debugger_create(char *program_name, pid_t pid) { + debugger_t *debugger = malloc(sizeof(debugger_t)); + debugger->program_name = program_name; + debugger->pid = pid; + return debugger; +} + + +static void debugger_handle_command(debugger_t *debugger, char *line) { + printf("Command: %s\n", line); +} + +void debugger_run(debugger_t *debugger) { + int wait_status; + int options = 0; + waitpid(debugger->pid, &wait_status, options); + + char *line = NULL; + while ((line = linenoise("dbg> ")) != NULL) { + debugger_handle_command(debugger, line); + linenoiseHistoryAdd(line); + linenoiseFree(line); + }; +} + +void debugger_destroy(debugger_t *debugger) { + free(debugger); +} \ No newline at end of file diff --git a/target.c b/target.c new file mode 100644 index 0000000..3953f59 --- /dev/null +++ b/target.c @@ -0,0 +1,6 @@ +#include + +int main(int argc, char* argv[]) { + printf("Hello, world!\n"); + return 0; +} \ No newline at end of file