我试图让VSCode 1.20.1在我的项目中断点,但它只是拒绝中断(至少使用检查器协议)。我已将其提炼为3行Node.js示例项目,可以找到here on GitHub,我将粘贴下面的相关部分。
index.js
程序是一个简单的Hello World,可以避免任何调试器附加竞争(稍后会详细介绍)。
setTimeout(() => {
console.log('Hello'); //Breakpoint is set here
}, 5000);
launch.json如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Normal Run",
"runtimeExecutable": "${workspaceFolder}/bin/node",
"runtimeArgs": [
"--nolazy",
"--inspect-brk=0.0.0.0:5858"
],
"program": "${workspaceFolder}/index.js",
"args": [],
"env": {
"DOCKER_ARGS": "-p5858:5858"
},
"address": "127.0.0.1",
"port": 5858,
"timeout": 60000,
"console": "integratedTerminal",
"smartStep": true,
"stopOnEntry": false,
"protocol": "inspector",
"autoAttachChildProcesses": true,
"localRoot": "${workspaceFolder}",
"remoteRoot": "/src"
}
]
}
请注意,Node.js在标准node:8
容器中的Docker中运行,并且具有本地源目录的卷装入(这是runTimeExecutable的用途,请参阅GitHub)。如果我使用Wireshark监视端口5858,我可以看到调试器附加并解码所有消息。奇怪的是,VSCode立即发出Runtime.runIfWaitingForDebugger
,然后发出似乎被Node.js接受的Debugger.setBreakpointByURL
消息(它成功返回断点的位置)。我在代码中有5秒的超时,以防万一这种竞争导致问题(它似乎不是)。
顺便说一句,如果我使用我的主机Node.js(6.11.4),协议为legacy
(或auto
选择legacy
)并注释掉{{ 1}},runtimeArgs
等.VSCode命中断点。如果我将协议强制为runtimeExecutable
(这在6.11.4中是实验性的)并添加回运行时执行(但不是可执行)调试器附加但没有命中断点,基本上与Docker节点的行为相同:8上方。
我在这里做错了什么?这个问题最初是在一个使用sourcemaps和mocha等的新TypeScript项目中开始的,但我把它归结为此。