add breakpoint command to debugger

This commit is contained in:
2026-06-03 08:50:47 +10:00
parent 0671c10aa1
commit 4a5ff92154
3 changed files with 56 additions and 18 deletions

View File

@@ -1,21 +1,14 @@
func add(int a, int b) -> int {
return a + b
}
func main() -> int {
mut big a = 0
mut big b = 1
int n = 92
mut int i = 0
mut big temp = 0
while i != n {
temp = a + b
a = b
b = temp
i = i + 1
}
breakpoint
return a != 7540113804746346429
mut int x = 25
mut int y = 30
x = add(x, y)
y = x
return x
}

View File

@@ -91,6 +91,16 @@ Range getRangeNearIP(CometDebugger* dbgr) {
};
}
CometSerializedFunc* getFuncByName(CometDebugger* dbgr, char* name) {
for (size_t i = 0; i < dbgr->vm->numFunctions; i++) {
if (strcmp(dbgr->vm->functions[i].name, name) == 0) {
return &dbgr->vm->functions[i];
}
}
return NULL;
}
ResultType(voidPtr, charptr) continueHandler(CometDebugger* dbgr, int argc, char** argv) {
dbgr->vm->instructionsLeftToExec = UINT64_MAX;
dbgr->running = false;
@@ -100,6 +110,38 @@ ResultType(voidPtr, charptr) continueHandler(CometDebugger* dbgr, int argc, char
ResultType(voidPtr, charptr) breakHandler(CometDebugger* dbgr, int argc, char** argv) {
if (argc < 1)
return Error(voidPtr, charptr, "1 arg required");
errno = 0;
char* end;
unsigned long address = strtoul(argv[0], &end, 0);
bool isNumber =
errno == 0 &&
end != argv[0] &&
*end == '\0';
if (!isNumber) {
CometSerializedFunc* func = getFuncByName(dbgr, argv[0]);
if (!func) {
Estr errMsg = CREATE_ESTR("Could not find a function with the name \"");
APPEND_ESTR(errMsg, argv[0]);
APPEND_ESTR(errMsg, "\"");
return Error(voidPtr, charptr, errMsg.str);
}
dbgr->vm->breakpoints[func->startIdx] = 1;
printf("break: added breakpoint on function %s.\n", func->name);
return Success(voidPtr, charptr, NULL);
}
dbgr->vm->breakpoints[address] = 1;
printf("break: added breakpoint on address 0x%04lx.\n", address);
return Success(voidPtr, charptr, NULL);
}

View File

@@ -232,6 +232,9 @@ ResultType(voidPtr, charptr) vmMainLoop(CometVM* vm) {
return Success(voidPtr, charptr, NULL); \
} \
\
if (vm->breakpoints[vm->currentFrame->ip] == 1) { \
startDebugger(vm, false); \
} \
if (vm->instructionsLeftToExec == 0) { \
startDebugger(vm, true); \
} \