-
当我在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"
}
]
}
免责声明:这不是解决方案,这只是我尽力回答这个问题,因为它激发了我的好奇心,我觉得它很有趣。以下是事实,它不起作用的原因只是我的假设。
什么是断点,它们是如何工作的
我相信你知道调试器,因为你已经使用了调试器,或者至少在表面上,它们是如何全局工作的。
我不会详细介绍软件和硬件断点,它们是如何在细节中工作的,等等,因为其他人已经有了,而且我可以以更好的方式实现。
然而,简而言之,断点(调试器,事实上,断点只是调试器的一种功能(依赖于代码注入才能工作。
INT 3指令,顾名思义,中断注入程序的执行。
我们现在知道,在我们的例子中,断点将被注入到我们的代码中,这样我们的解释器Node将把它转换为INT3指令,调试器可以捕获它。
壳上的别名
别名通常只是一个长命令行的字符串。
通常,根据Bash手册(我相信其他shell也是如此(,在执行任何复合命令行之前,都会替换所有别名:
Bash在执行该行或复合命令上的任何命令之前,总是读取至少一行完整的输入,以及组成复合命令的所有行。别名在读取命令时展开,而不是在执行命令时展开。因此,与另一个命令出现在同一行的别名定义直到下一行输入被读取才生效
我不能保证zsh
就是这样,因为它们在后台的工作方式方面没有那么广泛。
因此,在正常情况下,任何东西都不应该影响注射。
VSCode及其终端
现在,您提到在VSCode终端下启动这些。我不能确定,因为我使用JetBrains IDE,但您必须使用此功能将调试器自动附加到任何与节点相关的项目,对吧?
如果是这种情况,我的假设是VSCode终端取代或增强了它在后台使用的shell,从某种意义上说,它是在zsh解析命令行之前执行的。
VSCode终端处理程序首先解析命令行,确认命令行中没有node
,因此,将执行委托给shell,在本例中使用zsh。如果您使用JavaScript,请将VSCode终端的此实例视为middleware
。
让我这样想的句子如下:
如果启用了自动附加功能,节点调试器会自动附加到从VS Code的集成终端启动的某些Node.js进程
。。。这意味着只有NodeJS进程会受到影响。
但这只是我的假设,我可能完全错了。
现在,有没有办法解决这个问题,保持相同的功能(自动附加、别名(?如果它像我认为的那样工作,恐怕不会。。