Before?
在学习这篇文章之前,请先了解如何在 vscode
中调试一个 Node
程序,学会基础的调试参数配置和调试技能。详细请参考:在 VScode 中调试 NodeJS 程序
在此基础上,学习如何在 vscode
本地调试远程运行中的 Node
程序。
基于 vscode
本地进行远程调试
添加 debug
脚本命令
在 package.json
添加调试端口和脚本命令,如下,添加 9229 debug
监听端口:
{
"scripts": {
"start:debug": "nest start --debug 0.0.0.0:9229 --watch"
}
}
当程序打包成镜像后,通常会写入启动脚本,在启动脚本中执行npm run start:prod
。
那么我们需要在这个基础上,通过标识环境变量,区分是否执行npm run start:debug
例如:start.sh
中,通过 RUN_ENV = TEST
启动 debug 命令
#!/bin/sh
if [ "$RUN_ENV" != "" ] && [ $(echo $RUN_ENV | tr [a-z] [A-Z]) == "TEST" ];then
yarn --production=false
npm run start:debug
else
npm run start:prod
fi
ok
,本地项目配置完成…下面看 rancher
中又该如何配置?
Rancher
配置变更
如图:进入工作负载,先添加环境变量 RUN_ENV
,然后关闭健康检查,方便重新部署时执行上面配置的 npm run start:debug
.
关闭健康检查:在调试模式下,服务可能会进行一些非标准的操作或处于不稳定状态,这可能导致健康检查失败
然后打开服务发现,在高级选项中配置端口映射规则:注意服务端口和主机端口的区别:
服务端口:指在
Rancher
中定义的服务对外暴露的端口,主机端口:指在运行服务的主机上实际使用的端口
当容器内的服务监听特定的端口时,主机端口可以将外部请求映射到容器内的服务
然后重启容器服务,接着处理本地 vscode
配置:
配置 launch.json
在.vscode/launch.json
中添加调试配置项,如下所示:
{
"version": "0.2.0",
"configurations": [
{
"address": "172.16.148.25",
"localRoot": "${workspaceFolder}",
"name": "Attach to Remote - 172.16.148.25",
"port": 32145,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": ["<node_internals>/**"],
"type": "node",
"restart": true
}
]
}
注意配置的address、port、request
字段,因为是对远程已经运行中的程序追加调试,所以使用attach
,port
对应上面配置服务发现中的主机port
.
配置好后,记得先执行npm run build
,why?
构建生成的
map
文件包含代码映射信息的文件,用于帮助调试器在构建后的代码和源代码之间建立映射关系。
最后在本地源代码添加断点(断言、表达式、日志…)等等,启动和运行调试.
基于浏览器进行远程调试
点击
F12
或者鼠标右键打开控制台,控制台右侧有个设置按钮,点击选择源代码,启用javascript
源映射访问:
edge://inspect
,edge://
根据你使用的浏览器决定点击
Open dedicated DevTools for Node
- 添加连接
- 添加断点
当用户下次访问该服务时,效果如下:
这种方式虽然也能实现远程调试的效果,但是它是基于build
后的产物调试的,不方便阅读和定位.