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】:

您的第一次尝试,带有preLaunchTaskattach 配置是正确的。你可能只需要一次调整。默认情况下,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工程调试配置

自己动手写一个操作系统——vscode工程调试配置

从 vscode 调试启动时,如何使 Firefox 正确恢复其状态?

VSCode Node.js 调试配置 (npm 脚本启动)

调试并重新启动更改 typescript vscode

有没有办法在用 Vite 启动的 VsCode 中调试代码?