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