main loop

This commit is contained in:
Andre Heber
2023-11-25 13:09:16 +01:00
commit 0e3d59f447
9 changed files with 100 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
main
target
main.dSYM/
target.dSYM/

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "linenoise"]
path = linenoise
url = https://github.com/antirez/linenoise.git

5
compile.sh Normal file
View File

@ -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

4
compile_flags.txt Normal file
View File

@ -0,0 +1,4 @@
-std=gnu11
-I./include
-I./linenoise
ca

8
include/debugger.h Normal file
View File

@ -0,0 +1,8 @@
#include <sys/_types/_pid_t.h>
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);

1
linenoise Submodule

Submodule linenoise added at 93b2db9bd4

29
main.c Normal file
View File

@ -0,0 +1,29 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include "debugger.h"
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: %s <filename>\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);
}

39
src/debugger.c Normal file
View File

@ -0,0 +1,39 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/_types/_pid_t.h>
#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);
}

6
target.c Normal file
View File

@ -0,0 +1,6 @@
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("Hello, world!\n");
return 0;
}