凌晨4点17分,你的Agent执行失败。但日志只显示「任务执行失败」,没有具体原因。你不知道它在哪里出错、为什么出错、当时在想什么。
Agent调试的核心难点:
调试工具 功能 OpenClaw支持
───────────────────────────────────────────────────────
时间旅行调试 回溯任意执行节点 ✅ Snapshots
状态快照 捕获Agent完整状态 ✅ Agent Snapshots
日志追踪 工具调用链路分析 ✅ Tool Logs
Session历史 查看对话记录 ✅ sessions_history
推理过程 LLM思考过程 ⚠️ 需开启reasoning
断点调试 在指定点暂停 ⚠️ 手动注入
实时监控 执行过程可视化 ✅ OpenClaw Gateway
时间旅行调试允许你「回到」Agent执行过程中的任意节点,查看当时的完整状态,理解Agent为什么做出了某个决策。
// OpenClaw时间旅行调试
// 1. 启用快照记录
const session = await sessions_spawn({
task: "复杂分析任务",
runtime: "subagent",
recordSnapshots: true, // 启用快照
snapshotInterval: "every_step" // 每步记录
});
// 2. 任务完成后,查看执行轨迹
const snapshots = await session.getSnapshots();
// 3. 回溯到特定步骤
const step5 = snapshots.find(s => s.step === 5);
console.log(step5.state);
console.log(step5.decision);
console.log(step5.toolCalls);
// 4. 从特定点重新执行(修正分支)
const correctedResult = await session.resumeFrom(step5.id, {
modification: "改变参数设置"
});
// 单个快照内容
{
"snapshotId": "snap_abc123",
"step": 5,
"timestamp": "2026-05-14T01:05:17Z",
"state": {
"context": "当前对话上下文...",
"memory": {
"active": [...],
"retrieved": [...]
},
"toolsAvailable": ["web_search", "write", "exec"],
"variables": {
"query": "OpenClaw教程",
"results": [...]
}
},
"decision": {
"nextAction": "web_fetch",
"reasoning": "已获得搜索结果,需要获取详细内容",
"confidence": 0.85
},
"toolCalls": [
{
"tool": "web_search",
"args": {"query": "OpenClaw教程"},
"result": {...},
"success": true
}
],
"outputPreview": "当前生成内容..."
}
日志层级 内容 用途
───────────────────────────────────────────────────
L1 任务日志 任务开始/结束/结果 任务跟踪
L2 工具调用日志 每个工具的调用详情 工具问题定位
L3 推理日志 LLM的思考过程 决策分析
L4 状态变化日志 上下文/记忆变化 状态追踪
L5 错误日志 异常和错误详情 问题定位
// 获取Session历史日志
const history = await sessions_history({
sessionKey: "agent_session_key",
limit: 50,
includeTools: true // 包含工具调用详情
});
// 分析日志
for (const msg of history) {
if (msg.type === "tool_call") {
console.log(`工具: ${msg.tool}`);
console.log(`参数: ${JSON.stringify(msg.args)}`);
console.log(`结果: ${JSON.stringify(msg.result)}`);
}
}
// 诊断方法
// 1. 检查工具是否可用
const tools = session.getAvailableTools();
// 2. 检查Prompt是否明确引导
const prompt = session.getCurrentPrompt();
// 3. 检查推理日志
const reasoning = session.getReasoningLog();
// 可能发现:Agent认为当前不需要调用工具
// 诊断方法
// 1. 检查是否设置了输出格式要求
const formatSpec = session.getOutputFormat();
// 2. 检查Agent是否理解了格式要求
const lastReasoning = session.getLastReasoning();
// 3. 检查是否有格式验证步骤
const validations = session.getValidations();
// 解决方案:添加格式示例或验证步骤
// 诊断方法
// 1. 检查执行时间线
const timeline = session.getTimeline();
// 2. 找到耗时最长的步骤
const slowest = timeline.sortBy('duration').last();
// 3. 分析该步骤
if (slowest.type === 'llm_call') {
// 可能:Prompt太长或模型响应慢
} else if (slowest.type === 'tool_call') {
// 可能:工具执行慢或网络问题
}
# SKILL.md - 调试配置
debugging:
enabled: true
logging:
level: debug # 详细日志
include:
- reasoning_process
- tool_calls
- state_changes
snapshots:
enabled: true
interval: every_step
breakpoints:
- condition: "tool_call_failed"
action: pause_and_notify
- condition: "output_format_invalid"
action: log_and_continue
replay:
enabled: true
max_history: 100