main loop
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
main
|
||||
target
|
||||
|
||||
main.dSYM/
|
||||
target.dSYM/
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "linenoise"]
|
||||
path = linenoise
|
||||
url = https://github.com/antirez/linenoise.git
|
||||
5
compile.sh
Normal file
5
compile.sh
Normal 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
4
compile_flags.txt
Normal file
@ -0,0 +1,4 @@
|
||||
-std=gnu11
|
||||
-I./include
|
||||
-I./linenoise
|
||||
ca
|
||||
8
include/debugger.h
Normal file
8
include/debugger.h
Normal 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
1
linenoise
Submodule
Submodule linenoise added at 93b2db9bd4
29
main.c
Normal file
29
main.c
Normal 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
39
src/debugger.c
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user