← 中文资源

简体中文版本

Node 调试端口被占用 — 调试器无法附加

通过找出占用 9229 端口的进程并改用其他 inspector 端口,解决 “address already in use” 与调试器无法附加的问题。

阅读英文原文

症状

本篇指南处理“Node 调试端口被占用 — 调试器无法附加”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • Node 打印 “Starting inspector on 127.0.0.1:9229 failed: address already in use”
  • IDE 调试器连到错误的进程或根本连不上
  • 此前崩溃的运行仍占着调试端口

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

lsof -i :9229 || ss -ltnp | grep 9229

PID 与命令能说明是遗留的 Node 进程还是无关工具。

步骤 2

node --inspect=127.0.0.1:9230 app.js

任何未占用端口都可用;同步更新 IDE 的附加目标。

步骤 3

curl http://127.0.0.1:9230/json/list

返回含 webSocketDebuggerUrl 的 JSON 列表,说明 inspector 可达,附带即可成功。

常见诱因(按出现频率排序):

  • 此前调试会话遗留的 Node 进程仍在监听 9229
  • 其他工具或 IDE 已绑定同一 inspector 端口
  • 在 –inspect-brk 会话运行时又启动了 node –inspect

根因

Node inspector 会绑定一个 TCP 端口(默认 9229)。同一地址端口只能被一个进程绑定,因此当遗留调试会话仍占用时,新的 inspector 启动失败,调试器无法附加。

修复

结束遗留进程或使用 –inspect-port/–inspect 指定不同端口;在脚本与 CI 中可加入自动选取空闲端口的逻辑以避免冲突。

注意:绑定到 0.0.0.0 的 inspector 会把调试器暴露到网络;除本地开发外应始终绑定 127.0.0.1。

# find and stop the stale debug session
lsof -ti :9229 | xargs -r kill

# start on an explicit free port
node --inspect=127.0.0.1:9230 --inspect-brk ./server.js

# verify the target is listed
curl -s http://127.0.0.1:9230/json/list | head

验证

用新端口启动应用,打开 inspector URL,确认进程出现在目标列表中;设置一个断点以证明附加成功。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。