关于 node-inspect-debugger
面向 Node.js 开发者的 Inspector 调试 Skill,提供交互式检查及 Chrome DevTools Protocol 编程工作流的指导。涵盖断点、进程附加以及 CPU 和堆分析。
主要功能
- 01使用 node inspect 交互调试
- 02附加到现有进程
- 03通过 CDP 设置脚本断点
- 04采集堆快照和 CPU 分析
- 05调试测试及子进程
适用场景
- 01调查异步卡住或不稳定的测试
- 02附加到长期运行的 Node.js 进程
- 03分析 CPU 热点或内存增长
- 04自动采集断点状态
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ openclaw/ openclaw --skill node-inspect-debugger安装后在 Claude Code 中输入/node-inspect-debugger确认已加载。
详细介绍
Node Inspect 调试器
用于需要检查器访问权限的 Node.js 调试:隐藏的局部变量、异步卡死、不稳定测试、子进程、启动竞态、内存增长或 CPU 热点路径。
默认优先使用 node inspect。仅在需要脚本化断点、自动状态捕获、堆快照或 CPU 分析时,才使用 Chrome DevTools Protocol。
快速开始
- 在入口处暂停:
node inspect path/to/script.js - TypeScript:
node --inspect-brk --import tsx path/to/script.ts - 现有 PID:先执行
kill -SIGUSR1 <pid>,然后执行node inspect -p <pid> - 查看目标列表:
curl -s http://127.0.0.1:9229/json/list | jq - OpenClaw 命令行路径:
node --inspect-brk openclaw.mjs ... - OpenClaw 测试路径:
OPENCLAW_VITEST_MAX_WORKERS=1 node --inspect-brk scripts/run-vitest.mjs <file>
调试器 REPL
- 继续/单步执行:
cont、next、step、out、pause - 断点:
sb('file.js', 42)、sb(42)、sb('functionName')、breakpoints、cb('file.js', 42) - 检查:
bt、list(8)、watch('expr')、exec expr - 当前作用域:输入
repl,然后直接对局部变量求值;Ctrl+C退出 repl 模式。 - 安全退出:如果进程应继续运行,退出前执行
cont;否则执行kill。
OpenClaw 提示
- 优先将检查器绑定到
127.0.0.1。除非网络已隔离,否则不要暴露--inspect=0.0.0.0。 - 对于 Vitest,使用一个工作线程调试一个文件。单步执行时避免使用工作线程池。
- 对于 TS 源代码断点,在有用时使用
--enable-source-maps;node inspect仍可能显示编译输出路径。 - 对于子进程,
NODE_OPTIONS=--inspect-brk可以传播检查器,但每个子进程都需要自己的端口。 - 对于长时间运行的网关或开发进程,先通过
/json/list确认目标,再按 PID 附加。
程序化 CDP
除非项目已经依赖相关工具,否则请在仓库之外安装工具:
mkdir -p /tmp/cdp-tools
npm --prefix /tmp/cdp-tools i chrome-remote-interface
NODE_PATH=/tmp/cdp-tools/node_modules node /tmp/cdp-debug.cjs
最小驱动代码:
const CDP = require("chrome-remote-interface");
(async () => {
const client = await CDP({ port: 9229 });
const { Debugger, Runtime } = client;
Debugger.paused(async ({ callFrames, reason }) => {
const top = callFrames[0];
console.log("paused", reason, top.url, top.location.lineNumber + 1);
const { result } = await Debugger.evaluateOnCallFrame({
callFrameId: top.callFrameId,
expression: "JSON.stringify({ pid: process.pid })",
});
console.log(result.value ?? result.description);
await Debugger.resume();
});
await Runtime.enable();
await Debugger.enable();
await Debugger.setBreakpointByUrl({ urlRegex: ".*target\\.js$", lineNumber: 41 });
await Runtime.runIfWaitingForDebugger();
})();
性能分析
- CPU:启用
Profiler,调用start,等待,调用stop,写入/tmp/profile.cpuprofile,然后在 Chrome DevTools 中打开。 - 堆:启用
HeapProfiler,收集addHeapSnapshotChunk,调用takeHeapSnapshot,写入/tmp/heap.heapsnapshot。
常见陷阱
--inspect不会暂停;如果必须在代码运行前完成设置,请使用--inspect-brk。- 默认端口是
9229;对于并行目标,请使用--inspect=0或唯一端口。 - 如果断点未命中,请确认文件路径、源映射行为,以及执行是否已经越过该行。
- 如果分离后进程看似冻结,它可能仍处于调试器的暂停状态。
评论
支持 Markdown