VSCode - 如何使用启动配置调试启动自己的调试器的节点程序?
Posted
技术标签:
【中文标题】VSCode - 如何使用启动配置调试启动自己的调试器的节点程序?【英文标题】:VSCode - How to debug a Node program that starts its own debugger, using a launch configuration? 【发布时间】:2018-03-29 18:35:39 【问题描述】:(注意:我的具体用例可能看起来很复杂,但基本思想并不复杂!)
我有一个启动 Docker 容器的 Gulp 脚本,该容器本身包含并启动另一个 Gulp 脚本,该脚本使用 Nodemon
在调试模式下启动最终节点脚本!在 Docker 容器中运行的 Nodemon Gulp 脚本如下所示:
nodemon(
"script": `start.js`,
"nodeArgs": [`--debug=0.0.0.0:5858`, "-nolazy"],
"ext": "js",
"restartable": true
);
我希望能够在 Visual Studio Code 中按 [F5]
,启动最终脚本并附加 VSCode 的调试器!
有什么作用:
如果我手动启动第一个 Gulp 脚本,则在终端中启动 Docker 容器,执行带有 Nodemon 的另一个嵌入式 Gulp 脚本并启动最终脚本。我可以然后在 VSCode 中按 [F5]
来启动 attach
启动配置,然后我就可以调试了! 5858
端口被 Docker 暴露,一切正常。
我想要什么:
我希望能够跳过在终端中手动启动脚本。我想要一个 VSCode 启动配置,它自己做所有事情 => 在 VSCode 的集成终端中启动脚本,并将调试器附加到由脚本本身启动的调试过程中。
我试过了:
一个带有 preLaunchTask
任务的 "request": "attach"
启动配置。该任务是启动第一个 Gulp 脚本。这种方法的问题是 preLaunchTask
任务永远不会结束:它启动终端中的第一个脚本(任务有一个:“"_runner": "terminal"
”)但最终的脚本是监听并且不退出(它实际上是在监听请求)...这似乎阻止了 VSCode 调试器启动,因为 preLaunchTask
任务永远不会退出。
一个 "request": "launch"
启动配置,用于启动第一个脚本。但是在这里,即使它看起来可以工作(橙色调试栏出现),调试实际上也不会工作。如果我理解正确,这是因为 launch
启动配置会自行启动 Node 调试器(在指定端口上),因此调试器由 Docker 容器内的 Nodemon 启动,永远不会被监听到。
换句话说:我只是想点击[F5]
,所以在集成终端中启动一个脚本,没有调试器,然后VSCode会将调试器附加到生成的127.0.0.1:5858
调试过程中,不管这个过程实际上是如何开始了。
更新:我在 Github 上也有关于尝试使用 compound
启动配置的建议,但它也不起作用:https://github.com/Microsoft/vscode/issues/36685
【问题讨论】:
【参考方案1】:您的第一次尝试,带有preLaunchTask
的attach
配置是正确的。你可能只需要一次调整。默认情况下,vscode 将等待任务终止,因此您需要通过添加"isBackground": true
告诉它任务将在后台运行。然后,您需要告诉它在任务的输出中要注意哪些模式,以了解任务何时完成。这有点烦人,因为您必须使用problemMatcher 来执行此操作,但此任务不应该产生问题,因此您需要给它一个不会匹配任何内容的正则表达式。例如:
"problemMatcher":
"pattern":
"regexp": "__________"
,
"background":
"activeOnStart": false,
"beginsPattern": "Some pattern when the debugging process is about to start",
"endsPattern": "Ready for attach"
任务运行程序正在观察程序输出以匹配endsPattern
- 当某些输出匹配时,它将知道程序已准备好供调试器附加。如果您的脚本没有产生任何输出,您应该在调用nodemon
之后添加一些console.log。
problemMatcher 通常用于匹配构建任务输出的问题,正则表达式可以匹配文件名、行和错误消息。但是这里我们只是将它用于“背景”模式,所以我们给它一个虚拟的正则表达式。这是一个描述此解决方法的线程,以及将来如何通过将“背景”模式移出 patternMatcher 来更容易: https://github.com/Microsoft/vscode/issues/6209#issuecomment-289411630
这里是关于监视任务的文档,更多详细信息:https://code.visualstudio.com/docs/editor/tasks#_background-watching-tasks
【讨论】:
调试器仍然没有启动...我的launch configuration
:pastebin.com/raw/RBSJu0kx和我的tasks.json
:pastebin.com/raw/WnacJZp5。应用程序正常启动,但调试器只有在我在终端中手动退出应用程序时才会启动......知道吗?感谢您的帮助!
我让它运行起来了! :-) 你的例子的问题似乎是"beginsPattern"
。如果我使用"activeOnStart": false
然后"beginsPattern": "Some pattern when the debugging process is about to start"
,它确实有效!请修改您的答案,我会接受!
我唯一剩下的问题是,如果发生更改并且 Nodemon 重新加载在 Docker 中运行的应用程序,VSCode 的调试器会停止但在尝试重新连接时超时过快("restart": true
)...它在调试过程实际上是在 Docker 中重新启动的。如果您有任何解决此问题的想法,我会全力以赴!
我不确定您为什么需要更改 beginPattern/activeOnStart,但我编辑了答案。我正在使用任务 2.0 而不是 0.1.0 对此进行测试,这可能会有所不同。对于超时问题,如果它没有在您的启动配置中应用超时,您可以在 github 上为此打开一个问题。
我现在使用的是“2.0.0”版本,但我仍然需要进行更改。再次感谢您的帮助 Rob,我很感激。以上是关于VSCode - 如何使用启动配置调试启动自己的调试器的节点程序?的主要内容,如果未能解决你的问题,请参考以下文章
从 vscode 调试启动时,如何使 Firefox 正确恢复其状态?