From e5f7567bec01a88339900c4360278ebc806961be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Fri, 7 Jun 2024 18:06:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=90=AF=E6=B8=B8=E6=88=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/console/index.ts | 60 ++++++-------------------------------------- src/debug.ts | 40 +++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/src/console/index.ts b/src/console/index.ts index f474d34..84a4dd3 100644 --- a/src/console/index.ts +++ b/src/console/index.ts @@ -50,58 +50,6 @@ function registerAllMethods() { client.treeViewManager.refreshTreeNode(params.id); }); - interface startDebuggerParams { - delay?: number; - } - - registerMethod('startDebugger', async (client, params: startDebuggerParams) => { - if (await debug.getSession()) { - return { - suc: false, - err: '调试器已经启动', - }; - } - if (params.delay) { - await new Promise(resolve => setTimeout(resolve, params.delay! * 1000)); - } - try { - let suc = await debug.attach(); - if (suc) { - return { - suc: true, - }; - } else { - return { - suc: false, - err: '启动调试器失败', - }; - } - } catch(e) { - return { - suc: false, - err: (e instanceof Error) ? e.message : e!.toString(), - }; - } - }); - - registerMethod('stopDebugger', async (client) => { - try { - await debug.stop(); - return { - suc: true, - }; - } catch(e) { - return { - suc: false, - err: (e instanceof Error) ? e.message : e!.toString(), - }; - } - }); - - registerMethod('hasDebugger', async (client) => { - return debug.getSession() !== undefined; - }); - interface CommandParams { command: string; args?: any[]; @@ -111,6 +59,14 @@ function registerAllMethods() { let res = await vscode.commands.executeCommand(params.command, ...(params.args || [])); return res; }); + + interface PrepareForRestartParams { + debugger?: boolean; + } + + registerMethod('prepareForRestart', async (client, params: PrepareForRestartParams) => { + debug.prepareForRestart(params.debugger); + }); } export function init() { diff --git a/src/debug.ts b/src/debug.ts index 89f6cc9..24f8bb5 100644 --- a/src/debug.ts +++ b/src/debug.ts @@ -81,10 +81,40 @@ export async function attach() { return suc; } -export async function stop() { - await vscode.debug.stopDebugging(); -} +export async function prepareForRestart(needDebugger?: boolean) { + if (needDebugger === undefined) { + needDebugger = vscode.debug.activeDebugSession !== undefined; + } + if (!needDebugger) { + return; + } -export async function getSession() { - return vscode.debug.activeDebugSession; + let session = vscode.debug.activeDebugSession; + if (session) { + let trg = vscode.debug.onDidTerminateDebugSession((e) => { + if (e === session) { + trg.dispose(); + attach(); + } + }); + } else { + // 等待2秒,避免直接附加到当前的游戏中 + await new Promise((resolve) => setTimeout(resolve, 2000)); + await attach(); + // 但还是有一定几率会附加到当前的游戏中, + // 因此发现很快又断开后,再次附加 + session = vscode.debug.activeDebugSession; + if (!session) { + return; + } + let trg = vscode.debug.onDidTerminateDebugSession((e) => { + if (e === session) { + trg.dispose(); + attach(); + } + }); + setTimeout(() => { + trg.dispose(); + }, 5000); + } }