使用 VSCode 远程调试 Node.js

通常在 VSCode 中调试 Node.js 只需要按下 F5 或是使用调试面板。这种方式对于调试本地代码非常方便,特别是对于脚本类的调试。不过实际工作中,开发代码往往部署在服务器上,如果想在本地调试的话就意味着本地也需要一套相同的环境。为了避免这种情况,就需要用到远程调试了。

配置 launch.json

Node.js 中包含的 Debug 模块支持远程调试。我们需要做的就是在 VSCode 中做好对应的配置就行。

VSCode 关于代码调试的配置都通过 launch.json 文件管理。我们可以通过 cmd + shift + p 输入 launch.json 打开配置,也可以通过调试面板上的设置按钮打开。

image-20200320210225047

VSCode 会自动提示 launch.json 中 的对应属性以及可选值,所以不用太担心配置。对于远程调试我们需要关注这些属性。

1
2
3
4
5
6
7
8
9
{
"type": "node", // node 调试
"request": "attach", // launch / attach。luanch 为本地调试,attach 为远程/跨进程调试
"name": "Remote server", // 启动配置的名称,在面板中可以选择
"address": "127.0.0.1", // 服务器地址
"port": 9229, // 服务器端口,默认为 9229
"localRoot": "${workspaceFolder}/node", // 本地程序所在的目录
"remoteRoot": "/root/workspace/node" // 服务器对应程序所在的目录
}

远程调试

配置完成后就可以进行远程调试了,这里以我对远程服务器调试为例。在启动服务前,需要添加 --inspect 参数来开启 node 服务。

首先我们先启动服务器上的脚本,注意别忘记添加 --inspect 参数。这个脚本会每隔一秒打印 log 信息。

1
node --inspect=0.0.0.0:9229 ./script.js

同时在 launch.json 中添加服务器的配置。

image-20200320224246780

配置好之后,我们在 VSCode 中对代码打上断点并开启调试。

在连接上远程服务器之后,VSCode 的控制台中也会同步输出 log 信息,并且会停在断点位置。此时服务器的 log 也会同时停止。这样便完成了本地与服务器上代码的同步调试。

没开 debug 模式?

上面的例子里,是我们可以对服务器为所欲为的情况。但实际工作中,可能并不允许我们去重启服务。这时我们就需要传入 SIGNAL 来控制 node 开启 debug 服务了。官方允许我们传入 SIGUSR1 这一信号来开启 debug 模式。

在传入信号前,我们需要找到 node 服务的进程。

1
ps -a | grep node

通过上面的命令,我们可以找到 node 服务所在的进程,然后再通过 kill -s 命令把信号传过去。以我服务器为例。

1
kill -s SIGUSR1 

可以看到在服务端的 log 中多了一段端 debug 模式开启的信息。

端口限制?

在做完上面一步之后其实还并不能进行远程调试。原因是通过 SIGUSR1 开启的 debug 模式的 ip 为 127.0.0.1 即外网无法访问(所以在上面我们使用的是 0.0.0.0)。

这是就需要使用到端口转发了。通过 ssh 命令将服务器的端口转发到本地之后,就同样可以进行远程调试了。关于端口转发可以参考阮一峰老师的文章

1
ssh -L 9229:127.0.0.1:9229 root@服务器 IP
参考资料

Node.js 官方文档


使用 VSCode 远程调试 Node.js
https://konta9.github.io/2020/03/21/2020/使用 VSCode 远程调试 Node.js/
作者
Konata
发布于
2020年3月21日
许可协议