核心方法
- 假设驱动
- 二分查找
- 控制变量
investigate 是 GStack 中用于深度调查的技能。当遇到复杂问题、不确定问题所在、或需要根本原因分析时,使用这个技能。
它的核心是:不猜测,用实验和数据找到真相。
作为一个程序员,你一定遇到过:
investigate 就是解决这些的。
❌ 乱试:这个不对,试试那个✅ 假设驱动:提出假设 → 设计实验 → 验证❌ 整个代码库乱找✅ 二分查找:一半一半排除❌ 同时改很多地方✅ 一次只改一个变量问题描述:用户提交表单后显示"服务器错误"
不是:- "有个 bug"
应该是:- 什么操作触发的?- 错误信息是什么?- 100% 复现还是偶发?- 是所有用户还是部分用户?# 1. 查看错误日志tail -f logs/error.log
# 2. 查看请求curl -v form/submit
# 3. 查看数据库SELECT * FROM submissions WHERE id = ?
# 4. 查看监控基于收集的信息,提出假设:- 假设1:数据库连接池满了- 假设2:API 超时- 假设3:数据验证失败验证假设1:- 检查连接池使用情况- 如果 > 80%,假设成立实验结果支持假设 → 修复实验结果不支持假设 → 形成新假设 → 重复背景:用户偶尔报告 500 错误,但日志里看不到
1. 定义问题 - 间歇性,不是 100% - 只有部分用户 - 无规律
2. 收集信息 - 查看 APM - 统计错误时间分布 - 对比成功请求
3. 形成假设 - 假设:某个 API 超时
4. 设计实验 - 加长超时时间 - 观察是否还出现
5. 验证 - 错误消失 → 假设成立 - 修复超时配置背景:服务运行一段时间后内存越来越高
1. 定义问题 - 每次请求后内存增长 - 不请求时稳定
2. 收集信息 - heap snapshot - memory timeline
3. 形成假设 - 假设:缓存没有清理 - 假设:事件监听器累积
4. 设计实验 - 用 Chrome DevTools 追踪 - 看哪个对象在增长
5. 验证 - 发现事件监听器累积 - 修复unload逻辑背景:某个查询突然变慢
1. 定义问题 - 之前不慢 - 现在 5 秒
2. 收集信息 - EXPLAIN 查询 - 查看索引 - 查看表大小
3. 形成假设 - 假设:索引失效 - 假设:数据量变大
4. 设计实验 - REINDEX - 添加更合适的索引
5. 验证 - 查询时间 5s → 50ms# 实时查看错误tail -f app.log | grep ERROR
# 统计错误次数grep ERROR app.log | wc -l
# 查看某个时间段的日志sed -n '/10:00/,/10:30/p' app.log# Node.jsnode --inspect app.js# Chrome DevTools > Memory
# Pythonpython -m cProfile app.py
# 数据库EXPLAIN ANALYZE SELECT * FROM ...# curl 详细输出curl -v http://api/example
# 抓包tcpdump -i eth0 port 3000核心方法
工作流
不要
查看源文件: GitHub原始文件