🐛 OpenClaw 调试技巧与排错指南

为什么你的Agent不工作了?从日志分析到性能追踪,带你走出调试地狱

OpenClaw 调试 Agent调试 错误排查 日志分析

😱为什么你的Agent不工作了?

💥 真实故事:消失的Agent

那是一个平静的周二下午,我正在测试一个新的OpenClaw Agent。代码看起来完美无缺,配置文件也检查了三遍。但是当我运行openclaw run时,什么都没有发生。

没有错误提示,没有日志输出,就像Agent从未存在过一样。我花了整整4个小时,最后发现是因为config.yaml里的一个缩进错误——少了两个空格。

教训:调试OpenClaw就像侦探破案,每一个细节都可能是关键线索。

OpenClaw是一个强大的Agent平台,但正因为强大,调试起来也充满挑战:

🔧调试技巧大揭秘

💡 调试第一定律

1. 日志级别配置:你的第一道防线

🔍 DEBUG级别

最详细的日志,包括所有内部通信、API调用细节、变量值。

OPENCLAW_LOG_LEVEL=debug openclaw run # config.yaml永久配置 logging: level: debug file: /var/log/openclaw/debug.log format: json

ℹ️ INFO级别

默认级别,显示正常操作信息、重要事件。适合日常监控。

⚠️ WARN级别

显示潜在问题,但不影响正常运行。比如Skills加载失败。

❌ ERROR级别

只显示错误,适合生产环境。但当问题发生时可能已错过关键线索。

✅ 分级日志策略

开发环境:DEBUG级别,捕获所有细节。测试环境:INFO级别,平衡信息量和性能。生产环境:WARN级别,但保留DEBUG开关以便随时启用。

# 运行时动态切换日志级别 export OPENCLAW_LOG_LEVEL=debug openclaw restart # DEBUG日志会膨胀很快,配好logrotate # /etc/logrotate.d/openclaw: # /var/log/openclaw/*.log { # daily; rotate 7; compress; copytruncate # }

2. OpenClaw Inspector:可视化调试

OpenClaw Inspector是一个内置Web调试工具,实时查看Agent执行状态、Skills调用链、MCP通信。

🚀 快速启动

$ openclaw inspector
# Inspector running at
# 浏览器访问即可看到实时调试界面

主要功能:

  • 执行流程图:可视化展示Agent的思考过程和决策路径
  • Skills调用链:追踪每个Skill的调用顺序和参数传递
  • MCP通信监控:实时显示消息收发
  • Memory Inspector:查看Agent记忆内容和检索过程

3. Node.js远程调试:深入内核

OpenClaw基于Node.js,可以使用Chrome DevTools进行远程调试。

# 启动并开启调试端口 node --inspect-brk=9229 $(which openclaw) run # 在Chrome中打开 chrome://inspect/ # 添加 localhost:9229 # 点击 "inspect" 进入调试界面

💡 远程调试技巧

  • 条件断点:右键断点输入条件,如error.code === 'TIMEOUT'
  • 异步追踪:启用Async call stack追踪Promise链
  • 内存快照:对比两个时间点的快照找出泄漏
  • 日志断点:不暂停执行,只在控制台输出日志

4. Skills调用链追踪

🎭 真实故事:俄罗斯套娃

Agent执行"发送邮件"时报"附件上传失败"。但我代码里根本没附件!

追踪2小时发现调用链:send-email → attach-file → resize-image → sharp库缺少libvips。

教训:错误在调用链最底层,表象在最顶层。需要一层层剥洋葱。

# 启用追踪 OPENCLAW_TRACE_SKILLS=1 openclaw run # 输出示例: # [Skill Trace] -> send-email (args: {to: ""}) # [Skill Trace] -> attach-file (args: {path: "/tmp/report.pdf"}) # [Skill Trace] -> resize-image (args: {width: 800}) # [Skill Trace] -> Error: sharp: Missing dependency libvips

5. MCP通信日志:看透Agent内心

MCP是OpenClaw与AI模型通信的协议。理解MCP日志,就理解了Agent的"语言"。

# 启用MCP日志 OPENCLAW_LOG_MCP=1 openclaw run # 精简版(推荐) OPENCLAW_LOG_MCP=summary openclaw run

🏆最佳实践

日志分析:从海量日志中提取价值

📈 步骤1:集中化收集

使用Filebeat+ELK或Grafana Loki集中管理日志。配置JSON格式输出便于解析。

🔍 步骤2:结构化查询

# 查找所有错误 cat app.log | jq 'select(.level=="error")' # Skills调用频率排名 cat app.log | jq -r 'select(.skill)|.skill' | \ sort | uniq -c | sort -rn # 最慢的10个请求 cat app.log | jq 'select(.duration)|.duration' | sort -n | tail -10

性能追踪:为什么这么慢?

✅ 性能优化清单

  • ✅ 增加Node.js内存:--max-old-space-size=4096
  • ✅ 启用Skills缓存(复用结果省一半时间)
  • ✅ 优化Prompt长度(每少100 token≈省0.3秒)
  • ✅ 使用流式响应(体验提升100%)
  • ✅ 并行执行不相关的Skills(Promise.all)
  • ✅ 选择更快的模型(Haiku比Opus快5倍)
# 使用Node.js性能分析 node --prof $(which openclaw) run node --prof-process isolates-*.log > profile.txt # 查看profile.txt找耗时最多的函数

💣常见错误Top 10

错误/现象原因解决方案
ECONNREFUSED MCP Server未启动 检查config.yaml中的serverUrl,运行openclaw mcp status
429 Too Many Requests API限流 指数退避重试、申请提高配额、多个API Key轮询
MODULE_NOT_FOUND Skills依赖缺失 检查package.json,运行npm install
YAMLException 配置文件语法错误 用yamllint检查,缩进只能用空格
Agent无响应 死循环/阻塞IO 启用超时:--skill-timeout 30000
ContextLengthExceeded 超过上下文窗口 精简Prompt、实现历史摘要、换Claude 200K
ToolNotFound Skill未注册 运行openclaw skills list确认
Invalid JSON 模型返回格式错误 Prompt加"只返回JSON"、用parser兜底
Permission denied 权限不足 检查日志/缓存目录写权限
ENOSPC 磁盘空间不足 find /var/log -name "*.log" -mtime +7 -delete

⚠️ Agent卡死紧急恢复

  1. kill -3 $(pgrep -f openclaw) — 打印线程堆栈
  2. kill -9 $(pgrep -f openclaw) — 强制杀戮
  3. strace -p PID -e trace=network — 看卡在哪个调用
  4. 添加config.globalTimeout: 60000防止再次卡死

🧠Agent行为分析

🤖 故事:Agent的"创意"解释

我让Agent"找最新的AI论文"。它给了我一堆2020年的论文,还附注"这些是经典论文,历久弥新"。

我没定义"最新"的含义,Agent自己选择了解释。这不是bug,是Prompt的问题。

教训:Agent不是读心术大师。Prompt必须精确、无歧义、有约束。

调试5步流程

  • 1. 检查Promptopenclaw prompt inspect查看实际发送的Prompt
  • 2. 分析工具选择:Agent选对了工具吗?看MCP日志
  • 3. 追踪决策:Inspector看Agent思考链
  • 4. 验证IO:每个Skill的输入输出是否正常?
  • 5. A/B测试:改Prompt措辞,对比行为差异

Prompt调试

# 不好的Prompt "帮我分析这个数据" # 好的Prompt "分析CSV文件(/data/sales.csv): 1. 计算总销售额、平均订单金额 2. 找出销售TOP 10产品 3. 生成月度销售趋势图(matplotlib) 4. 输出到 /reports/sales_analysis.md ⚠️ 数据>10000行时先采样10%"

📞社区排错渠道

✅ 求助渠道

  • Discord:实时聊天,推荐#help频道
  • GitHub Issues:报告bug,搜索已知问题
  • 官方文档:docs.openclaw.ai有Troubleshooting章节
  • Stack Overflow:用openclaw标签提问

⚠️ 提问的智慧

  1. 搜索现有资料(很可能已被问过)
  2. 创建最小可复现示例(MRE)
  3. 提供日志+配置文件+环境信息(OS/Node版本)
  4. 清晰描述:期望行为 vs 实际行为

好问题示例:"Ubuntu 22.04, OpenClaw 2.3.1, MCP连接超时。日志ECONNREFUSED 127.0.0.1:8080。端口未被占用,防火墙已关,config.yaml正确。求帮助!"

💻代码示例

示例1:带错误处理的Skill调用

const { OpenClaw } = require('openclaw'); async function safeExecuteSkill(skillName, args) { try { console.log(`[DEBUG] Calling skill: ${skillName}`, args); const result = await openclaw.skills.execute(skillName, args); console.log(`[DEBUG] Result:`, result); return result; } catch (error) { if (error.code === 'TIMEOUT') { console.error(`[ERROR] ${skillName} timed out`); if (error.retryable) return safeExecuteSkill(skillName, args); } else if (error.code === 'INVALID_ARGS') { console.error(`[ERROR] Invalid args:`, error.details); } else { console.error(`[ERROR] Unexpected:`, error); } throw error; } } safeExecuteSkill('web-search', { query: 'OpenClaw tutorial' }) .then(r => console.log('Success:', r)) .catch(e => console.error('Failed:', e));

示例2:自定义调试类

class OpenClawDebugger { constructor(opts = {}) { this.enabled = opts.enabled ?? process.env.DEBUG === 'true'; this.logFile = opts.logFile || '/tmp/openclaw-debug.log'; } log(level, msg, data = null) { if (!this.enabled && level !== 'error') return; const ts = new Date().toISOString(); console.log(`[${level.toUpperCase()}] ${ts} - ${msg}`); if (data) console.log(' Data:', JSON.stringify(data, null, 2)); require('fs').appendFileSync(this.logFile, JSON.stringify({ts,level,msg,data})+'\n'); } async measure(name, fn) { const start = Date.now(); this.log('info', `Starting: ${name}`); try { const r = await fn(); this.log('info', `✓ ${name} (${Date.now()-start}ms)`); return r; } catch (e) { this.log('error', `✗ ${name} (${Date.now()-start}ms): ${e.message}`); throw e; } } } const dbg = new OpenClawDebugger({ enabled: true }); await dbg.measure('search', () => openclaw.skills.execute('web-search', {query:'test'}));

🔗相关链接

🎯 总结

调试OpenClaw Agent就像侦探破案:

  • 收集线索:日志、错误栈、MCP通信
  • 分析推理:找到根本原因,而非表面现象
  • 验证假设:改配置 → 测试 → 观察结果
  • 记录经验:下次遇到就能秒杀

每个错误都是学习的机会。今天的bug,明天的feature。 🚀

💡 调试心态

1. 保持冷静:bug不会因为你着急就自己消失。

2. 二分法排查:注释掉一半代码,看问题是否还在。再注释掉一半,直到找到问题代码。

3. 休息一下:盯屏幕2小时没思路?去喝杯咖啡,回来可能就看出问题了。

4. 请教别人:有时候别人的一句话就能点醒你。别死磕!