VS代码扩展调试器无法附加



我正在为VS Code编写一个扩展,它基于sirmspencer的AutoHide,并且>我试着调试它的90%都失败了
它启动并工作,但调试器似乎没有连接:

  • 断点永远不会被命中,即使扩展主机正在运行超过它们
  • 控制台输出未发送到调试控制台(非常烦人(
  • 当我关闭测试窗口,终止进程时,调试器不会收到通知,而是继续运行
  • 当我停止调试器时,测试窗口不会得到通知,而是保持打开状态

可能是什么问题
[视频]

以下是..vscode:
launch.json:中的文件

// A launch configuration that compiles the extension and then opens it inside a new window
{
"version": "0.1.0",
"configurations": [
{
"name": "Launch Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
"preLaunchTask": "npm"
},
{
"name": "Launch Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
"preLaunchTask": "npm"
}
]
}

settings.json:

// Place your settings in this file to overwrite default and user settings.
{
"files.exclude": {
"out": false // set this to true to hide the "out" folder with the compiled JS files
},
"search.exclude": {
"out": true // set this to false to include "out" folder in search results
}
}

tasks.json:

// A task runner that calls a custom npm script that compiles the extension.
{
"version": "0.1.0",
// we want to run npm
"command": "npm",
// the command is a shell script
"isShellCommand": true,
// show the output window only if unrecognized errors occur.
"showOutput": "silent",
// we run the custom script "compile" as defined in package.json
"args": ["run", "compile", "--loglevel", "silent"],
// The tsc compiler is started in watching mode
"isWatching": true,
// use the standard tsc in watch mode problem matcher to find compile problems in the output.
"problemMatcher": "$tsc-watch"
}

和我的package.json:

{
"name": "vscode-hideEmptyErrors",
"displayName": "Hide Empty Problems Panel",
"description": "Hide the 'Problems' panel when there are no relevant errors",
"version": "1.0.0",
"publisher": "Black Platypus",
"repository": {
"url": "https://example.com"
},
"icon": "Images/Icons/Logo_512.png",
"engines": {
"vscode": "^1.43.0"
},
"extensionKind": [
"ui",
"workspace"
],
"categories": [
"Other"
],
"keywords": [
"problems",
"panel",
"hide",
"auto"
],
"activationEvents": [
"*"
],
"main": "./out/src/extension",
"contributes": {
"configuration": {
"type": "object",
"title": "hideEmptyErrors",
"properties": {
"hideEmptyErrors.autoHidePanel": {
"type": "boolean",
"default": true,
"description": "Hide the 'Problems' panel when there are no relevant errors."
},
"hideEmptyErrors.noEditorBehavior": {
"type": "string",
"description": "What should happen when there is no active editor or the active editor has no document while the Problems panel is active?",
"default": "No change",
"enum": [
"No change",
"Hide panel",
"Show Panel"
],
"enumDescriptions": [
"Keeps the panel's current state (visible/hidden)",
"Always hides the panel",
"Always shows the panel"
]
},
"hideEmptyErrors.onlyCountErrorsForCurrentFile": {
"type": "boolean",
"default": true,
"description": "Only count errors for the currently active editor's file."
}
}
},
"commands": [
{
"command": "hideEmptyErrors.toggleHidePanel",
"category": "Auto Hide",
"title": "Toggle Auto Hide Panel for Current Workspace"
}
]
},
"scripts": {
"compile": "tsc -watch -p ./",
"#test": "node ./node_modules/vscode/bin/test",
"vscode:prepublish": "tsc -p ./",
"#postinstall": "node ./node_modules/vscode/bin/install",
"publish": "vsce publish"
},
"devDependencies": {
"@types/mocha": "^2.2.32",
"@types/node": "7.0.7",
"mocha": "^7.2.0",
"typescript": "^2.9.2",
"vscode": "^1.1.36"
}
}

我有同样的问题,症状完全相同,一直到"找不到用于调试的空闲端口";开发工具控制台中的警告。我怀疑这是由于严格的防火墙/防病毒软件造成的。扩展开发主机似乎试图为自己找到一个TCP端口来与调试器客户端通信,但由于某种原因失败了。这是localProcessExtensionHost.ts:中的相关代码段

/**
* Find a free port if extension host debugging is enabled.
*/
private async _tryFindDebugPort(): Promise<number> {
if (typeof this._environmentService.debugExtensionHost.port !== 'number') {
return 0;
}
const expected = this._environmentService.debugExtensionHost.port;
const port = await findFreePort(expected, 10 /* try 10 ports */, 5000 /* try up to 5 seconds */);
if (!this._isExtensionDevTestFromCli) {
if (!port) {
console.warn('%c[Extension Host] %cCould not find a free port for debugging', 'color: blue', 'color:');
} else {
if (port !== expected) {
console.warn(`%c[Extension Host] %cProvided debugging port ${expected} is not free, using ${port} instead.`, 'color: blue', 'color:');
}
if (this._isExtensionDevDebugBrk) {
console.warn(`%c[Extension Host] %cSTOPPED on first line for debugging on port ${port}`, 'color: blue', 'color:');
} else {
console.info(`%c[Extension Host] %cdebugger listening on port ${port}`, 'color: blue', 'color:');
}
}
}
return port || 0;
}

事实证明,findFreePort中的端口搜索只尝试从this._environmentService.port中给定的端口开始的大约十个TCP端口,默认值为5870,如果我相信environmentService.test.ts:中environmentService的单元测试,您可以用命令行参数覆盖它

assert.deepStrictEqual(parse([]), { port: 5870, break: false, debugId: undefined });
assert.deepStrictEqual(parse(['--debugPluginHost']), { port: 5870, break: false, debugId: undefined });
assert.deepStrictEqual(parse(['--debugPluginHost=1234']), { port: 1234, break: false, debugId: undefined });
assert.deepStrictEqual(parse(['--debugBrkPluginHost']), { port: 5870, break: false, debugId: undefined });
assert.deepStrictEqual(parse(['--debugBrkPluginHost=5678']), { port: 5678, break: true, debugId: undefined });
assert.deepStrictEqual(parse(['--debugPluginHost=1234', '--debugBrkPluginHost=5678', '--debugId=7']), { port: 5678, break: true, debugId: '7' });

总之,使用5870以外的端口将--debugPluginHost=PORT添加到启动配置中似乎可以进行调试。这里有一个端口为1234的示例,它最终为我修复了hello-world示例:

{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"args": [
"--debugPluginHost=1234",
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
"preLaunchTask": "${defaultBuildTask}"
},

您可能需要对端口号进行实验,才能找到一个适合您的端口号。

最新更新