From b0a0fca8ee9bd913cb8653e28495d6594186de55 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Thu, 22 Jan 2026 10:43:22 +0100 Subject: [PATCH] SelfAttachDebugger command --- src/text_editor/plugin_remedybg.cpp | 69 +++++++++++++++++++---------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/src/text_editor/plugin_remedybg.cpp b/src/text_editor/plugin_remedybg.cpp index 4955dc7..52574b4 100644 --- a/src/text_editor/plugin_remedybg.cpp +++ b/src/text_editor/plugin_remedybg.cpp @@ -2097,7 +2097,8 @@ uint8_t command_buf[COMMAND_BUF_SIZE]; uint8_t reply_buf[REPLY_BUF_SIZE]; ClientContext RDBG_Ctx; -bool RDBG_InitConnection(mco_coro *co) { +bool RDBG_InitConnection(mco_coro *co, bool create_session = true) { + ReportConsolef("Remedybg: InitConnection"); enum rdbg_CommandResult res; if (RDBG_Ctx.command_pipe_handle != NULL) { enum rdbg_TargetState state; @@ -2107,30 +2108,9 @@ bool RDBG_InitConnection(mco_coro *co) { } } - String file = ""; - if (BinaryUnderDebug.len) { - Window *window = GetWindow(PrimaryWindowID); - ResolvedOpen res = ResolveOpen(CoCurr->arena, window, BinaryUnderDebug, ResolveOpenMeta_DontError | ResolveOpenMeta_DontExec); - if (res.kind == OpenKind_Goto) { - file = Intern(&GlobalInternTable, res.path); - } - } - - if (file.len == 0) { - Scratch scratch; - for (FileIter it = IterateFiles(scratch, ProjectDirectory); IsValid(it); Advance(&it)) { - if (EndsWith(it.filename, ".rdbg")) { - file = Intern(&GlobalInternTable, it.absolute_path); - } - } - } - - if (file.len == 0) { - file = QueryUserFile(co); - } - String session_name = Format(CoCurr->arena, "te%llu", GetTimeNanos()); String remedy_string = Format(CoCurr->arena, "%S --servername %S", RemedyBGPath, session_name); + ReportConsolef("Remedybg: %S", remedy_string); Exec(LogViewID, true, remedy_string, GetPrimaryDirectory()); MemoryZero(&RDBG_Ctx, sizeof(RDBG_Ctx)); RDBG_Ctx.cmd.data = command_buf; @@ -2157,9 +2137,37 @@ bool RDBG_InitConnection(mco_coro *co) { } MemoryZero(RDBG_Ctx.last_error, sizeof(RDBG_Ctx.last_error)); + if (create_session == false) { + return true; + } + + String file = ""; + if (BinaryUnderDebug.len) { + Window *window = GetWindow(PrimaryWindowID); + ResolvedOpen res = ResolveOpen(CoCurr->arena, window, BinaryUnderDebug, ResolveOpenMeta_DontError | ResolveOpenMeta_DontExec); + if (res.kind == OpenKind_Goto) { + file = Intern(&GlobalInternTable, res.path); + } + } + + if (file.len == 0) { + Scratch scratch; + for (FileIter it = IterateFiles(scratch, ProjectDirectory); IsValid(it); Advance(&it)) { + if (EndsWith(it.filename, ".rdbg")) { + file = Intern(&GlobalInternTable, it.absolute_path); + } + } + } + + if (file.len == 0) { + file = QueryUserFile(co); + } + if (EndsWith(file, ".rdbg")) { + ReportConsolef("Remedybg: OpenSession %S", file); OpenSession(&RDBG_Ctx, file.data, &res); } else { + ReportConsolef("Remedybg: CreateSession %S", file); rdbg_Id cfg_id; char *exe = file.data; char *args = NULL; @@ -2179,7 +2187,6 @@ bool RDBG_InitConnection(mco_coro *co) { return true; } } - return true; } @@ -2270,6 +2277,20 @@ void CO_AddBreakpoint(mco_coro *co) { } } RegisterCoroutineCommand(CO_AddBreakpoint, "f9", "Add a breakpoint at filename + line"); +void CO_SelfAttachDebugger(mco_coro *co) { + bool conn = RDBG_InitConnection(co, false); + if (!conn) { + return; + } + enum rdbg_CommandResult res; + AttachToProcessById(&RDBG_Ctx, GetCurrentProcessId(), true, &res); + if (res != RDBG_COMMAND_RESULT_OK) { + ReportErrorf("Remedy error: %s", RDBG_Ctx.last_error); + MemoryZero(RDBG_Ctx.last_error, sizeof(RDBG_Ctx.last_error)); + return; + } +} RegisterCoroutineCommand(CO_SelfAttachDebugger, "f9", "Spawn and self attach the debugger to the text editor"); + void QuitDebugger() { if (RDBG_Ctx.command_pipe_handle == NULL) { return;