【问题标题】:VScode debugger is not stopping at breakpoint when executing aliased names for node scripts为节点脚本执行别名时,VScode 调试器不会在断点处停止
【发布时间】:2021-11-24 01:43:49
【问题描述】:
  • 当我在 VSCode 终端中使用 node examples/js/cli alias1 arg2 启动脚本时,我的调试器会在我在 VSCode 中设置的断点处停止

  • 我在~/.zshrc 中定义了一些别名,看起来像

alias alias1="node /path/to/examples/js/cli alias1 arg2"
alias alias2="node /path/to/examples/js/cli alias2 arg2"
  • 当我运行 alias1 arg1 时,程序运行,但 VSCode 调试器不会在我设置的断点处停止

如何让 VSCode 调试器在使用别名时设置的断点处停止?


我的launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
          "type": "pwa-node",
          "request": "launch",
          "name": "Launch Program",
          "program": "${workspaceRoot}/examples/js/cli.js"
        }
    ]
  }

【问题讨论】:

  • 实用问题:当你在 node 项目中工作时,为什么要使用跨平台不兼容的别名而不是普遍支持的 npm 脚本?
  • @Mike'Pomax'Kamermans 我想我需要更新 package.json 并将其推送到公共仓库才能做到这一点,而且我希望它们可以从任何目录访问
  • 第一部分有点“嗯,当然,这就是管理 repo 的工作方式”,但对于第二部分:npm 脚本可从 repo 内的任何位置获得。您不需要与 package.json 位于同一目录中
  • 当你说:“但是 VSCode 调试器不会在我设置的断点处停止”......这是什么意思?你得到了什么?
  • @AhmadMOUSSA 程序在使用别名时一直运行到完成,但在完成之前不会运行,并在我运行node /path/to/examples/js/cli时在断点处暂停@

标签: node.js shell visual-studio-code alias vscode-debugger


【解决方案1】:

免责声明:这不是一个解决方案,这只是我试图尽我所能回答这个问题,因为它激发了我的好奇心,我发现它非常有趣。以下是事实,它不起作用的原因是只是我的假设


什么是断点,它们是如何工作的?

我相信您了解调试器,因为您已经使用过一种调试器,或者至少从表面上了解它们是如何在全球范围内工作的。

我不会详细介绍 softwarehardware 断点,它们是如何工作的,等等,因为others 已经有了并且以更好的方式我永远无法实现的目标。

不过,简而言之,断点(调试器,实际上,断点只是调试器的一种功能)依赖于代码注入才能工作。

INT 3 指令,顾名思义,中断它被注入的程序的执行。

我们现在知道,在我们的例子中,断点将被注入到我们的代码中,以便我们的解释器 Node 将其转换为可以被我们的调试器捕获的 INT 3 指令。

shell 上的别名

别名通常只是字符串,alias,一个很长的命令行。

通常,根据Bash manual(我相信其他shell也是如此),在执行任何复合命令行之前都会替换所有别名:

在执行该行上的任何命令或复合命令之前,Bash 总是读取至少一个完整的输入行以及构成复合命令的所有行。别名在读取命令时扩展,而不是在执行命令时扩展。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效

但我不能保证 zsh 就是这种情况,因为关于它在后台的工作方式,它们不是 as extensive

所以,在正常情况下,没有什么会影响注射。

VSCode 及其终端

现在,您提到在 VSCode 终端下启动这些。我无法确定,因为我使用的是 JetBrains IDE,但您必须使用 this feature 自动将调试器附加到任何与节点相关的项目,对吧?

如果是这样,我的假设是 VSCode 终端取代或增强了它在后台使用的 shell,从某种意义上说,它在 之前 zsh 解析你的命令行。

VSCode 终端处理程序首先解析您的命令行,确认您的命令行中没有 node,因此将执行委托给它使用的 shell,在这种情况下为 zsh。如果您使用 JavaScript,请将此 VSCode 终端实例视为middleware

让我产生这种想法的句子如下:

如果启用了自动附加功能,Node 调试器会自动附加到已从 VS Code 的集成终端启动的某些 Node.js 进程

...暗示只有 NodeJS 进程会受到影响。

但这只是我的假设,我可能完全错了。

现在,有没有办法解决这个问题,保持相同的功能(自动附加、别名)?如果它像我认为的那样有效,恐怕不会..

【讨论】:

  • 实际上我以前使用过别名,但我的 launch.json 设置或其他东西弄乱了一些东西,而不是它们没有
猜你喜欢
  • 2019-04-11
  • 2021-04-16
  • 2021-07-21
  • 2023-03-12
  • 2019-12-12
  • 1970-01-01
  • 2016-11-19
  • 2015-06-30
  • 2010-11-25
相关资源
最近更新 更多