本地调试

单个文件调试

  1. // 根目录/node/demo1.js
  2. var http = require("http");
  3. const { compileFunction } = require("vm");
  4. http
  5. .createServer((req, res) => {
  6. res.writeHead(200, { "Content-Type": "text/plain" });
  7. res.end("Hello Node.js\n");
  8. })
  9. .listen(3000, "127.0.0.1");
  10. console.log("Serve running at http://127.0.0.1:3000/");

1. 设置断点

image.png

2. 打开调试

按F5键,或者 vscode 左侧工具栏 调试按钮 image.png

此时vscode 中的 launch.json 中配置应该为:

  1. {
  2. "type": "node",
  3. "request": "launch",
  4. "name": "启动程序", // vscode 调试方式的名称
  5. "skipFiles": ["<node_internals>/**"],
  6. "program": "${file}" , // 表示调试运行的是当前文件
  7. }

image.png
此处的名称 和 launch.json 中的 name 一致

3. 通过curl 发送请求

  1. curl http://127.0.0.1:3000

4. 开始调试

image.png

固定文件的调试

调试步骤同上,不同地方是 launch.json 配置

    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program", // vscode 调试方式的名称
      "program": "${workspaceFolder}/app.js", // 表示调试运行的是当前工作目录下的 app.js
      "skipFiles": ["<node_internals>/**"]
    },

跨进程调试

将调试程序 附加在某个已经打开的端口(其他进程)

1. 启动远程代码

$ node --inspect node/demo1.js

Debugger listening on ws://127.0.0.1:9229/7b6c8d77-5dc3-42ad-9489-e1481fb719db
For help, see: https://nodejs.org/en/docs/inspector
Serve running at http://127.0.0.1:3000/

启动一个可以用于远程调试的进程,此时 Debugger 监听的端口是 9229,不同场景下也有可能不一样

2. 此时launch.json配置

    {
      "type": "node",
      "request": "attach",
      "name": "附加到进程",
      "address": "localhost",
      "port": 9229
    }

3. vscode 中打开调试

image.png
此时启动Node.js调试服务,如果看到调试按钮最右边有一个 连接 按钮,表示已经和远程Node.js 线程连接成功,剩下的就和本地调试一样

远程调试

类似于跨进程调试,只需要在lanuch.json 文件中增加address等对远程机器的配置信息

    {
      "type": "node",
      "request": "attach",
      "name": "Attach to Remote",
      "address": "TCP/IP address of process to be debugged",
      "port": 9229,
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "Absolute path to the remote directory containing the program",
      "skipFiles": [
        "<node_internals>/**"
      ]
    }
  • address 是IP 地址或 域名
  • port 是远程端口
  • localhost 是本地的代码根目录
  • remoteRoot 是远程代码的相对目录