From 1fbfbf74ef5f3c5e8ea372cfb13dcb79cc32773a Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Thu, 22 Oct 2026 08:40:36 +0800 Subject: [PATCH] refactor(gdb): own command record snapshots and stream groups --- src/gdb/GdbCommandRecords.ts | 10 +++++ src/gdb/GdbSessionManager.ts | 75 ++++++------------------------------ 2 files changed, 22 insertions(+), 63 deletions(-) create mode 100644 src/gdb/GdbCommandRecords.ts diff --git a/src/gdb/GdbCommandRecords.ts b/src/gdb/GdbCommandRecords.ts new file mode 100644 index 0000000000..3ece5d2bdd --- /dev/null +++ b/src/gdb/GdbCommandRecords.ts @@ -0,0 +1,10 @@ +/** Snapshot ordered MI records and retain their raw stream encodings. */ +export const snapshotGdbCommandRecords = (records: readonly string[]) => { + const snapshot = [...records]; + return { + records: snapshot, + console: snapshot.filter((line) => line.startsWith("~")).join("\n"), + target: snapshot.filter((line) => line.startsWith("@")).join("\n"), + log: snapshot.filter((line) => line.startsWith("&")).join("\n"), + }; +}; diff --git a/src/gdb/GdbSessionManager.ts b/src/gdb/GdbSessionManager.ts index eaefcb914c..340926d20a 100644 --- a/src/gdb/GdbSessionManager.ts +++ b/src/gdb/GdbSessionManager.ts @@ -1,3 +1,4 @@ +import { snapshotGdbCommandRecords } from "./GdbCommandRecords.js"; import { randomUUID } from "node:crypto"; import { constants as fsConstants } from "node:fs"; import { isUtf8 } from "node:buffer"; @@ -958,16 +959,7 @@ export class GdbSessionManager { ? { command: "GDB startup", mi: "", - records: [...session.lines], - console: session.lines - .filter((line) => line.startsWith("~")) - .join("\n"), - target: session.lines - .filter((line) => line.startsWith("@")) - .join("\n"), - log: session.lines - .filter((line) => line.startsWith("&")) - .join("\n"), + ...snapshotGdbCommandRecords(session.lines), process_exit_observed: true, process_exit_code: session.exitCode, process_exit_signal: session.exitSignal, @@ -981,16 +973,7 @@ export class GdbSessionManager { ? { command: "GDB startup", mi: "", - records: [...session.lines], - console: session.lines - .filter((line) => line.startsWith("~")) - .join("\n"), - target: session.lines - .filter((line) => line.startsWith("@")) - .join("\n"), - log: session.lines - .filter((line) => line.startsWith("&")) - .join("\n"), + ...snapshotGdbCommandRecords(session.lines), output_truncated: session.recentRecordsTruncated, completion_status: "unknown" as const, } @@ -1641,18 +1624,11 @@ export class GdbSessionManager { clearTimeout(pending.timer); session.pending.delete(token); pending.cleanup(); - const records = [...pending.lines]; + pending.resolve({ command: "", mi: pending.terminalRecord ?? "", - records, - console: records - .filter((record) => record.startsWith("~")) - .join("\n"), - target: records - .filter((record) => record.startsWith("@")) - .join("\n"), - log: records.filter((record) => record.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), output_truncated: pending.outputTruncated, ...(pending.outputInvalidUtf8 ? { output_invalid_utf8: true as const } @@ -1677,14 +1653,11 @@ export class GdbSessionManager { clearTimeout(pending.timer); session.pending.delete(token); pending.cleanup(); - const records = [...pending.lines]; + pending.resolve({ command: "", mi: line, - records, - console: records.filter((record) => record.startsWith("~")).join("\n"), - target: records.filter((record) => record.startsWith("@")).join("\n"), - log: records.filter((record) => record.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), output_truncated: pending.outputTruncated, ...(pending.outputInvalidUtf8 ? { output_invalid_utf8: true as const } @@ -1723,15 +1696,12 @@ export class GdbSessionManager { for (const pending of session.pending.values()) { clearTimeout(pending.timer); pending.cleanup(); - const records = [...pending.lines]; + pending.reject( new GdbProtocolFailureError(message, { command: pending.command, mi: "", - records, - console: records.filter((line) => line.startsWith("~")).join("\n"), - target: records.filter((line) => line.startsWith("@")).join("\n"), - log: records.filter((line) => line.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), output_truncated: pending.outputTruncated, ...(pending.outputInvalidUtf8 ? { output_invalid_utf8: true as const } @@ -1915,14 +1885,7 @@ export class GdbSessionManager { new GdbCommandProcessExitError({ command: pending.command, mi: "", - records: [...pending.lines], - console: pending.lines - .filter((line) => line.startsWith("~")) - .join("\n"), - target: pending.lines - .filter((line) => line.startsWith("@")) - .join("\n"), - log: pending.lines.filter((line) => line.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), process_exit_observed: true, process_exit_code: code, process_exit_signal: signalCode, @@ -1991,14 +1954,7 @@ export class GdbSessionManager { const partial: GdbCommandResult = { command: pending.evidenceCommand, mi: "", - records: [...pending.lines], - console: pending.lines - .filter((line) => line.startsWith("~")) - .join("\n"), - target: pending.lines - .filter((line) => line.startsWith("@")) - .join("\n"), - log: pending.lines.filter((line) => line.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), output_truncated: pending.outputTruncated, ...(pending.outputInvalidUtf8 ? { output_invalid_utf8: true as const } @@ -2122,14 +2078,7 @@ export class GdbSessionManager { const partial: GdbCommandResult = { command: pending.evidenceCommand, mi: "", - records: [...pending.lines], - console: pending.lines - .filter((line) => line.startsWith("~")) - .join("\n"), - target: pending.lines - .filter((line) => line.startsWith("@")) - .join("\n"), - log: pending.lines.filter((line) => line.startsWith("&")).join("\n"), + ...snapshotGdbCommandRecords(pending.lines), output_truncated: pending.outputTruncated, ...(pending.outputInvalidUtf8 ? { output_invalid_utf8: true as const }