🔍 调试的哲学
世界上有一种痛苦叫"Skills不报错但也不工作"。凌晨4点17分,我和这个bug对视了整整一个时辰。我怀疑它是前世欠我的——直到我学会了正确的调试方法。
王家卫式调试哲学:不是所有的bug都需要立刻修复,有些bug需要你陪它坐一会儿,理解它为什么存在。
💡 调试的核心原则
- 复现第一:无法复现的bug不是bug,是玄学
- 分层定位:从Skill层→工具层→系统层逐层排查
- 日志为王:没有日志的调试就像盲人摸象
- 最小化复现:把复杂问题简化到最小可复现单元
80%
bug可通过日志定位
5x
调试效率提升
90%
问题可预防
🛠️ 快速调试指南
1. 本地调试模式
启动本地调试,实时查看Skill执行过程:
# 启动调试模式
openclaw debug skill my-skill --watch
# 输出
正在启动调试器...
✓ Skill已加载
✓ 断点设置在 line 42
✓ 等待触发事件...
→ 事件触发: user_message_received
→ 执行到断点,暂停
Variables: { intent: "weather_query", city: "北京" }
2. 常见错误修复
❌ 错误1:Skill未触发
症状:用户消息发送了,但Skill没反应
原因:触发条件配置错误
# 检查触发条件
openclaw skill inspect my-skill --show-triggers
# 修复:调整触发条件
triggers:
- pattern: "(天气|temperature|气温)" # 更宽松的正则
- threshold: 0.6 # 降低置信度阈值
❌ 错误2:参数解析失败
症状:Skill触发了,但参数总是undefined
修复:检查SKILL.md中的参数定义
# 参数定义示例
## 参数
| 参数名 | 类型 | 必填 | 描述 |
|--------|------|------|------|
| city | string | 是 | 城市名称,支持中文 |
# 调试参数解析
openclaw skill debug my-skill --trace-params
✅ 最佳实践
- 使用结构化日志,便于搜索和分析
- 为关键操作添加性能计时
- 捕获并记录完整的错误堆栈
- 使用调试器的条件断点功能
- 定期清理日志,避免磁盘占满
📊 性能剖析
找出Skill的性能瓶颈:
# 运行性能剖析
openclaw skill profile my-skill --duration 60
# 输出报告
性能报告:
- 总调用次数: 1,247
- 平均响应时间: 234ms
- P99响应时间: 1,203ms
- 热点函数:
1. api.fetchData() - 占用 45% 时间
2. parser.parse() - 占用 23% 时间
3. cache.get() - 占用 12% 时间
建议:
- 为 api.fetchData() 添加缓存
- 考虑使用批量查询减少API调用
🔧 高级调试技巧
远程调试
调试已部署的Skill:
// 1. 在Skill中启用远程调试
const skill = {
name: 'my-skill',
debug: {
enabled: true,
remote: true,
port: 9229
}
};
// 2. 使用Chrome DevTools连接
// 打开 chrome://inspect
// 添加目标: localhost:9229
// 开始调试!
💡 王家卫式哲理时刻
"世界上有一种调试叫耐心,你以为你在找bug,其实bug也在找你。4点17分,我和这个bug终于和解了。"