温馨提示×

Ubuntu Nodejs应用如何调试

小樊
36
2025-12-06 06:03:34
栏目: 编程语言

Ubuntu 上调试 Node.js 的高效方法

一 内置调试与 Chrome DevTools

  • 启动方式
    • 普通启动:node --inspect app.js(程序继续运行,等待调试器连接,默认调试端口为 9229
    • 首行暂停:node --inspect-brk app.js(在第一行自动中断,便于从入口处逐步调试)
  • 连接与调试
    • Chrome 打开:chrome://inspect,在 Remote Target 中点击 inspectOpen dedicated DevTools for Node,即可使用熟悉的 Sources/Console/Network/Memory/Profiler 面板进行断点、单步、观察表达式与性能分析。
    • 也可直接访问 http://127.0.0.1:9229/json 获取 DevTools 前端地址并打开。
  • 原理提示
    • Node 通过 Chrome DevTools Protocol(CDP) 与 DevTools 建立 WebSocket 通信;在 Console 中展开深层对象时,Node 会向 V8 查询对象信息,因此更适合在存在阻塞/等待的场景(如 HTTP 监听)下进行交互式调试。

二 使用 VS Code 调试

  • 快速开始
    • 在 VS Code 中打开项目,点击左侧 运行与调试,创建 .vscode/launch.json,选择 Node.js 环境。
  • 常用配置
    • 直接启动
      • 配置示例:
        • {
          • “version”: “0.2.0”,
          • “configurations”: [
            • {
              • “type”: “node”,
              • “request”: “launch”,
              • “name”: “Launch Program”,
              • “program”: “${workspaceFolder}/app.js”,
              • “console”: “integratedTerminal”,
              • “env”: { “NODE_ENV”: “development” }
            • }
          • ]
        • }
    • 附加到已运行进程
      • 先在应用中启动:node --inspect-brk app.js
      • 配置示例:
        • {
          • “version”: “0.2.0”,
          • “configurations”: [
            • {
              • “type”: “node”,
              • “request”: “attach”,
              • “name”: “Attach to Process”,
              • “port”: 9229
            • }
          • ]
        • }
  • 调试能力
    • 支持断点、条件断点、函数断点、监视表达式、调用栈查看、变量面板与实时求值,适合日常开发闭环调试。

三 进阶场景与技巧

  • 调试 npm 包或 CLI
    • 在 package.json 中新增脚本,显式指向可执行脚本并开启调试,例如调试 webpack
      • “scripts”: { “build:debug”: “node --inspect --inspect-brk ./node_modules/webpack/bin/webpack.js” }
      • 运行:npm run build:debug,再用 VS Code attachchrome://inspect 连接。
  • 监听文件变更自动重启并调试
    • 使用 Node.js 实验性 watch:node --watch --inspect-brk app.js
    • 使用 nodemon:在 VS Code 配置
      • {
        • “type”: “node”,
        • “request”: “launch”,
        • “name”: “Debug with nodemon”,
        • “runtimeExecutable”: “nodemon”,
        • “program”: “${workspaceFolder}/app.js”,
        • “restart”: true,
        • “console”: “integratedTerminal”,
        • “env”: { “NODE_ENV”: “development” }
      • }
  • 已运行进程“无侵入”附加
    • 查找进程 PID:ps aux | grep app.js
    • 方式一:node -e ‘process._debugProcess(PID)’
    • 方式二:kill -SIGUSR1 PID(Node.js ≥8 支持,将进程切换到调试模式)
  • 选择性日志
    • 代码:const debug = require(‘debug’)(‘myapp:server’); debug(‘start’);
    • 启用:DEBUG=myapp:* node app.js(或 DEBUG=myapp:server node app.js)
  • TypeScript 调试
    • 使用 tsx(对 node 的封装,支持 –inspect–watch):
      • npm i -D tsx
      • tsx --inspect server.ts

四 常见问题与排查

  • 看不到目标进程
    • 确认启动时包含 –inspect–inspect-brk,并检查端口 9229 是否被占用或被防火墙拦截;必要时显式指定地址:–inspect=127.0.0.1:9229。
  • 无法展开深层对象或数据不完整
    • DevTools Console 中展开对象时,Node 会通过 CDPV8 拉取信息;若程序不阻塞(立即退出或无等待),对象可能来不及序列化。建议在 HTTP 请求处理定时任务 等会等待的事件中查看,或使用 –inspect-brk 从断点处逐步检查。
  • 附加失败
    • 确认目标进程已以 –inspect 启动并监听 9229,且本机访问未被限制;必要时改用 127.0.0.1 回环地址进行本地调试。

0