SuperAPI AI 工具集

openclaw-test-heap-leaks

测试与质量

查看项目

更新于 10-16 09:35

技能介绍

用途:该技能面向 OpenClaw 测试内存问题排查,不依赖 RSS 单指标臆断,强调在有堆快照时以快照差值作为分诊证据,而非直接定性为泄漏。

主要能力与工作流:先复现失败形态,尽量匹配真实入口;分析前先识别真实 lane 名称(如 unit-fast-batch-*),至少取同一 lane、同一 PID 的两个快照区间;用 scripts/heapsnapshot-delta.mjs 对比两个文件或某 lane 目录内每 PID 的最早/最新一对。根据主导增长对象分类:若为 Vite/Vitest 转换源码字符串、Module、system/Context、字节码、描述符数组或属性映射,倾向共享 worker 中保留的模块图增长;若为应用对象、缓存、缓冲区、服务句柄、定时器、mock 状态、sqlite 状态等,倾向清理或生命周期泄漏;名称模糊时需在 DevTools 查看 retainers/dominators 再下结论。

修复层选择:对疑似模块增长,优先时序与热点调度修复,检查 test/fixtures/test-timings.unit.json 与 scripts/test-update-memory-hotspots.mjs,必要时改 test/fixtures/test-parallel.behavior.json 将热点文件移出共享 lane,安全单跑文件用 singletonIsolated。对真实泄漏,修补测试或运行时清理路径,检查缺失的 afterEach/afterAll、模块重置缺口、全局状态、未释放 DB 句柄、监听器与定时器。

验证:重跑目标 lane 并开堆快照;若快照开销导致 Vitest 超时,则回退无快照确认 RSS 趋势或 OOM 降低。运行时闭包泄漏验证用独立 harness:pnpm leak:embedded-run,模式含 closure-extracted、closure-inline、synthetic-leak,快照落在 .tmp/embedded-run-abort-leak/。

常用命令示例:pnpm canvas:a2ui:bundle && OPENCLAW_TEST_MEMORY_TRACE=1 OPENCLAW_TEST_HEAPSNAPSHOT_INTERVAL_MS=60000 OPENCLAW_TEST_HEAPSNAPSHOT_DIR=.tmp/heapsnap OPENCLAW_TEST_WORKERS=2 OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB=6144 pnpm test;node .agents/skills/openclaw-test-heap-leaks/scripts/heapsnapshot-delta.mjs --lane-dir .tmp/heapsnap/unit-fast-batch-2,可用 --top、--min-kb、--pid。

输出期望:报告复现命令、对比的 lane 与 PID、主导保留对象族、判断倾向及是否经 retainer 确认、具体修复或降影响补丁、已验证与因快照开销未验证的部分。

限制:不将一切增长称为泄漏;RSS 不足以定性;快照名称差值仅为分诊证据;运行时修复验证须用专用 harness,新泄漏应新增 harness 而非改造现有。