From 0742db18d821af9e2b3d6b13ea612acafe40b067 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Wed, 12 Mar 2025 20:46:49 +0100 Subject: [PATCH] Print expanded source --- debugus.c | 85 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/debugus.c b/debugus.c index 0610aee..00d35ce 100644 --- a/debugus.c +++ b/debugus.c @@ -54,6 +54,51 @@ int msleep(long msec) #define INIT_SCRIPT ".debugusrc.js" #define MAX_JS_FUNCS 100 +void print_source(const char *file, size_t line) +{ + FILE *src = fopen(file, "r"); + if (src == NULL) { + LOG_ERR("No source file found\n"); + return; + } + fseek(src, 0L, SEEK_END); + long sz = ftell(src); + rewind(src); + + char *srcbuf = malloc(sz+1); + fread(srcbuf, sz, 1, src); + srcbuf[sz] = '\0'; + + const int expand = 4; + + char *p = srcbuf; + size_t i = 0; + while (p) { + char *next = strchr(p, '\n'); + if (next) { + *next = '\0'; + } + + int lo = line - expand; + int hi = line + expand; + if (i >= (lo < 0 ? 0 : lo) && i <= hi ) { + char prefix[20]; + snprintf(prefix, sizeof(prefix), "%2s %6zu", i == line ? "->" : "", i); + printf("%s %s\n", prefix, p); + } + + if (next) { + *next = '\n'; + } + + p = next ? (next + 1) : NULL; + i++; + } + + free(srcbuf); + fclose(src); +} + // Registers // Taken from da goat https://source.winehq.org/source/dlls/dbghelp/cpu_x86_64.c @@ -219,46 +264,6 @@ void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info) } } -void print_source(const char *file, size_t line) -{ - FILE *src = fopen(file, "r"); - if (src == NULL) { - LOG_ERR("No source file found\n"); - return; - } - fseek(src, 0L, SEEK_END); - long sz = ftell(src); - rewind(src); - - char *srcbuf = malloc(sz+1); - fread(srcbuf, sz, 1, src); - srcbuf[sz] = '\0'; - - char *p = srcbuf; - size_t i = 0; - while (p) { - char *next = strchr(p, '\n'); - if (next) { - *next = '\0'; - } - - if (i == line) { - LOG_INF("Source:\n"); - printf("%6zu %s\n", line, p); - } - - if (next) { - *next = '\n'; - } - - p = next ? (next + 1) : NULL; - i++; - } - - free(srcbuf); - fclose(src); -} - void dbg_handle_sigtrap(Dbg *dbg, siginfo_t info) { void dbg_set_rip(Dbg *dbg, uint64_t v);