[ PROMPT_NODE_25542 ]
root-cause-tracing
[ SKILL_DOCUMENTATION ]
# 根本原因追踪
## 概述
Bug 通常在调用栈深处显现(例如在错误的目录中执行 git init、文件创建在错误的位置、数据库以错误的路径打开)。你的直觉是修复错误出现的地方,但这只是在处理症状。
**核心原则:** 沿着调用链向后追踪,直到找到原始触发点,然后在源头进行修复。
## 何时使用
dot
digraph when_to_use {
"Bug 是否出现在栈深处?" [shape=diamond];
"能否反向追踪?" [shape=diamond];
"在症状点修复" [shape=box];
"追踪到原始触发点" [shape=box];
"更好:同时添加纵深防御" [shape=box];
"Bug 是否出现在栈深处?" -> "能否反向追踪?" [label="是"];
"能否反向追踪?" -> "追踪到原始触发点" [label="是"];
"能否反向追踪?" -> "在症状点修复" [label="否 - 死胡同"];
"追踪到原始触发点" -> "更好:同时添加纵深防御";
}
**使用场景:**
- 错误发生在执行深处(而非入口点)
- 堆栈跟踪显示长调用链
- 不清楚无效数据源自何处
- 需要找出哪个测试/代码触发了问题
## 追踪流程
### 1. 观察症状
Error: git init 在 /Users/jesse/project/packages/core 失败
### 2. 找到直接原因
**什么代码直接导致了这一点?**
typescript
await execFileAsync('git', ['init'], { cwd: projectDir });
### 3. 询问:谁调用了它?
typescript
WorktreeManager.createSessionWorktree(projectDir, sessionId)
→ 被 Session.initializeWorkspace() 调用
→ 被 Session.create() 调用
→ 被 Project.create() 中的测试调用
### 4. 继续向上追踪
**传递了什么值?**
- `projectDir = ''`(空字符串!)
- 作为 `cwd` 的空字符串会解析为 `process.cwd()`
- 那是源代码目录!
### 5. 找到原始触发点
**空字符串从哪里来?**
typescript
const context = setupCoreTest(); // 返回 { tempDir: '' }
Project.create('name', context.tempDir); // 在 beforeEach 之前访问!
## 添加堆栈跟踪
当你无法手动追踪时,添加诊断工具:
typescript
// 在问题操作之前
async function gitInit(directory: string) {
const stack = new Error().stack;
console.error('DEBUG git init:', {
directory,
cwd: process.cwd(),
nodeEnv: process.env.NODE_ENV,
stack,
});
await execFileAsync('git', ['init'], { cwd: directory });
}
**关键:** 在测试中使用 `console.error()`(不要使用 logger - 可能会被拦截)