症状
本篇指南处理“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,确认进程出现在目标列表中;设置一个断点以证明附加成功。
修复后补充一条回归测试,复现原始症状,防止问题再次出现。
这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。