教程 08 · 故障诊断流:从症状到根因#
目标: 三个最常见的故障场景:CC hook 不触发 / MCP 工具不出现 / 搜索返回空,每个走一遍完整诊断流,知道遇到新问题用什么思路。
通用诊断三板斧#
无论什么症状,先跑这三步排除环境问题:
# 1. 命令在 PATH 里?
which memoryd
which memoryd-mcp
# 2. 版本是不是预期?
memoryd --help | head -3
# 3. 数据目录在哪?里面有东西?
echo $MEMORYD_DATA_ROOT
ls -la ~/.local/share/memoryd/scopes/ 2>/dev/null | head -5
如果第 1 步找不到 → 没激活 venv 或没加 alias。看 详细安装 的"验证安装"节。
场景 1:CC hook 不触发#
症状#
跑了一段 Claude Code 会话退出后,memoryd list --limit=5 没有新的 session。
诊断#
# 1. hook 是否注册到了 ~/.claude/settings.json?
cat ~/.claude/settings.json | python3 -c 'import json,sys; print(json.load(sys.stdin).get("hooks",{}).get("SessionEnd"))'
期望:
如果是 None → 没装。跑 memoryd setup install-cc-hook。
期望: 大小非零、可读。
# 3. 看 hook 日志
ls -la ~/.local/share/memoryd/logs/cc-session-end.log 2>/dev/null
tail -30 ~/.local/share/memoryd/logs/cc-session-end.log
情况判断:
| 日志状态 | 含义 |
|---|---|
| 文件不存在 | hook 根本没被 CC 触发;CC 设置可能没生效,重启 CC |
| 文件有但全是错误 | 脚本内部出错,看错误堆栈 |
文件有正常 captured -> ... 行 |
hook 跑了,去 memoryd list 找对应 slug |
# 4. 手工模拟 hook 跑一遍
echo '{"session_id":"diag-test","transcript_path":"","cwd":"'"$(pwd)"'"}' \
| memoryd capture --source=claude-code
期望: captured -> /Users/<you>/.local/share/memoryd/scopes/.../sessions/2026-XX-XX-diag-test.md
如果这一步报错 → memoryd 本体有问题,跟 hook 无关。
# 5. memoryd 在 hook 看得到的 PATH 里?
which memoryd
# hook 是用 python3 调脚本,脚本里再调 memoryd
# 如果 memoryd 只在 venv 里,脚本需要绝对路径
如果 venv 不激活找不到 memoryd → 改 hook 命令为绝对路径:
python3 << 'EOF'
import json
from pathlib import Path
p = Path.home() / ".claude/settings.json"
d = json.loads(p.read_text())
d["hooks"]["SessionEnd"][0]["hooks"][0]["command"] = (
'PATH="$HOME/memory-system/memoryd/.venv/bin:$PATH" '
'python3 "/Users/<you>/memory-system/plugins/claude-code/session-end.py"'
)
p.write_text(json.dumps(d, indent=2, ensure_ascii=False))
EOF
场景 2:MCP 工具不出现#
症状#
CC 里 /mcp 命令看不到 memoryd 这一行;或者列出来但工具列表是空。
诊断#
# 1. memoryd-mcp 能起来?
memoryd-mcp --verbose &
# stderr 应该输出 "memoryd-mcp ready: transport=stdio tools=13 admin=False"
kill %1
如果起不来 → 看错误。常见:MEMORYD_DATA_ROOT 路径不可写、缺依赖(如 milvus-lite Windows 不支持)。
# 2. 配置在对的位置?
cat ~/.claude.json | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d.get("mcpServers",{}).get("memoryd"),indent=2))'
期望:
注意: 必须是 ~/.claude.json,不是 ~/.claude/.mcp.json 或 ~/.claude/settings.json。CC 只读前者作为 user-level MCP server 来源。
如果还是不行,开 CC 的 MCP 日志:
场景 3:搜索返回空#
症状#
memoryd search "<明明存在的词>" 返回 0 行。
诊断#
如果 list 也空 → 数据目录变了或没 capture。看 $MEMORYD_DATA_ROOT。
memoryd search 全文路要 rg。没装 → 装。
# 3. SQLite 索引和 markdown 同步?
sqlite3 ~/.local/share/memoryd/index.db "SELECT COUNT(*) FROM memories"
find ~/.local/share/memoryd/scopes/ -name '*.md' | wc -l
两个数差别大 → 索引漂了。修:
不存在或 0 字节 → 向量路没起,可能 milvus-lite 装失败(Windows)。这种情况搜索只走全文 + 知识图谱,准确度打折但不至于全空。
你掌握了#
- 三板斧前置环境检查
- 三个典型故障的完整诊断分支
- 通用思路:从配置 → 日志 → 内部状态 一层层往里挖
- 几个关键索引(
index.db、vector.db、logs/)的位置
接下来#
遇到没见过的故障,套同样的思路:
- 先确认环境(PATH / venv / 数据目录)
- 看相关日志(
~/.local/share/memoryd/logs/*.log) - 手工跑最小复现命令
- 对比 SQLite 索引 vs markdown 真相
完整故障速查表:操作 · 故障排查。