# 如何在 VS Code 调试器扩展中实现单进程调试

在开发 VS Code 调试器扩展时,除了传统的分叉进程(External Executable)方式外,开发者还可以利用 `DebugAdapterDescriptorFactory` 和 `InlineImplementation` 将调试适配器直接嵌入扩展进程中。这种方式允许在一个调试会话内同时调试扩展代码和调试适配器代码,从而简化开发流程。

## VS Code 调试架构概述

VS Code 的调试架构基于抽象协议(DAP)构建,通常需要一个中间件(Debug Adapter, DA)来适配不同调试器。传统模式下,DA 作为一个独立进程运行,通过标准输入/输出与 VS Code 通信。然而,这种模式在开发阶段需要维护两个并行进程(扩展主机和 DA),增加了调试复杂度。

## 单进程调试的实现原理

VS Code 提供了三种运行调试适配器的方式,其中 `DebugAdapterInlineImplementation` 支持将 DA 作为 JavaScript/TypeScript 对象直接嵌入扩展进程中实现。

### DebugAdapterDescriptorFactory

当扩展注册了 `DebugAdapterDescriptorFactory` 时,VS Code 会在启动调试会话时调用其 `createDebugAdapterDescriptor` 方法。该方法返回一个 `DebugAdapterDescriptor` 对象,描述如何运行 DA。

若将运行模式设置为 `inline`,则 VS Code 不会启动外部进程,而是直接实例化由工厂返回的 DA 实现对象。

### InlineImplementation 的作用

通过 `InlineImplementation`,调试器逻辑被编译为扩展主机的一部分。这意味着:
- **单进程执行**:扩展代码和调试适配器代码在同一个进程中运行。
- **联合调试**:开发者可以在 VS Code 的调试会话中同时设置断点、查看变量和堆栈,覆盖范围包括扩展逻辑和 DA 逻辑。

## 实现步骤

### 1. 定义工厂类

创建一个继承自 `DebugAdapterDescriptorFactory` 的类,并在其中实现 `createDebugAdapterDescriptor` 方法。该方法应返回一个 `DebugAdapterInlineImplementation` 实例。

```typescript
import { DebugAdapterDescriptor, DebugAdapterInlineImplementation } from 'vscode-debugadapter';

export class MyInlineDAFactory extends DebugAdapterDescriptorFactory {
createDebugAdapterDescriptor(_config: any): DebugAdapterDescriptor {
return new DebugAdapterInlineImplementation(this.createDebugAdapter());
}

private createDebugAdapter(): vscode.DebugAdapter {
// 在此处实现实际的调试逻辑,需遵循 DAP 协议
return new MyCustomDebugAdapter();
}
}
```

### 2. 注册工厂

在扩展的 `activate` 函数中注册该工厂,并指定运行模式为 `inline`。

```typescript
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
const factory = new MyInlineDAFactory();

// 注册调试器类型
vscode.debug.registerDebugAdapterDescriptorFactory('my-debugger', factory);
}
```

### 3. 配置 launch.json

在用户的 `launch.json` 中,将 `debugServer` 属性设置为空或移除(因为不需要连接外部端口),并确保运行模式为 inline。

```json
{
"type": "my-debugger",
"request": "launch",
"name": "Single Process Debug",
"program": "${workspaceFolder}/main.js"
}
```

## 优势与注意事项

- **开发效率**:无需启动额外进程,断点设置和变量查看更加直观。
- **性能考虑**:单进程模式减少了进程间通信开销,但在高负载场景下需注意内存占用。
- **兼容性**:此方法要求 DA 实现基于 `vscode-debugadapter` npm 模块(版本 1.38-pre.4 或更高),该模块自动实现了 `DebugAdapter` 接口。

通过上述方式,开发者可以构建轻量级、易调试的 VS Code 调试器扩展,充分利用单进程调试的优势提升开发体验。

信息来源