半夜三点线上崩了,AI替我背了锅——用AI排错,五分钟定位三年老bug
凌晨三点,手机狂震。用户说“下单就报错”,群里产品、测试、后端轮番@我。我爬起来开电脑,翻日志、复现、打断点,眼看天要亮了,还没找到原因。第二天又被老板骂“效率低”。我一怒之下,让AI帮我盯着错误日志。现在线上崩了,AI先替我查一遍,直接告诉我:“第87行,变量拼写错误。” 我只需要回个“好的”,翻身继续睡。
前言
程序员最怕什么?不是需求变更,不是产品经理,是线上bug自己找不到。尤其那种偶发、只在特定环境出现、本地死活复现不了的幽灵bug。你只能靠加日志、猜、靠经验。有时候花几个小时,最后发现是少了个?或者多打了个空格。
AI 来了之后,我发现它特别适合干这种事:读错误堆栈、理解上下文、推测原因、甚至给出修复代码。今天我就用真实案例,带你用 AI 当“线上排错助手”,让机器替你熬夜。
一、为什么 AI 比人更适合排错?
- 读得快:几千行日志,AI 几秒读完,人得滚半天。
- 记得全:它记得你之前犯过的类似错误,人不一定。
- 不困:凌晨三点,人眼瞎,AI 照样清醒。
- 有联想:报错
TypeError: Cannot read property 'map' of undefined,它能猜出“上游数据可能为空,建议加可选链”。
缺点:它不知道业务上下文(比如这个字段就是不该为空),但能帮你缩小范围。
二、实战:用 ChatGPT / Copilot Chat 分析线上错误
假设你的 Node 后端报了这个错误:
TypeError: Cannot read property 'userId' of undefined at /app/order.js:42:23 at processTicksAndRejections (internal/process/task_queues.js:95:5)你直接把堆栈、相关代码段、甚至几行上下文贴给 AI:
这段代码报错,说
userId是 undefined,但理论上req.user应该由鉴权中间件注入。帮我分析可能的原因。
AI 可能给出几种猜测:
- 鉴权中间件没有正确挂载或被跳过。
- 某些请求(如 OPTIONS 预检)没有经过中间件。
- 异步错误导致
req.user被清空。
它会顺带问你要不要看中间件代码。你贴给它,它可能一眼看出:app.use('/order', authMiddleware)写在了app.use(express.json())之前,导致 body 没解析,authMiddleware 拿不到 token。这破事,人可能看一小时,AI 十秒。
三、进阶:用自动化工具做实时错误分析
光靠手动贴代码不够快。你可以用Sentry + AI 集成或者写个脚本,每次错误产生,自动把堆栈发给 AI,然后把分析结果发到钉钉/飞书。
这里给出一个简化版脚本(Node.js + OpenAI):
import{OpenAI}from'openai';constopenai=newOpenAI({apiKey:process.env.OPENAI_KEY});asyncfunctionanalyzeError(errorMessage,stackTrace,codeSnippet){constprompt=`线上报错:${errorMessage}堆栈:${stackTrace}相关代码:${codeSnippet}请分析可能的原因,并按优先级列出修复建议。最多3条。`;constresponse=awaitopenai.chat.completions.create({model:'gpt-4',messages:[{role:'user',content:prompt}],});returnresponse.choices[0].message.content;}// 假设你从日志系统拿到错误信息constreport=awaitanalyzeError("TypeError: Cannot read property 'userId' of undefined","at /app/order.js:42","const userId = req.user.userId; // 上一行没有判断 req.user");console.log('AI 分析结果:',report);// 然后通过 webhook 发到钉钉你甚至可以把它挂在 CI 上,或者让错误日志系统自动调用。以后半夜报错,AI 先帮你分析一轮,你把结果往群里一贴,说“已定位,明天修”,继续睡。
四、真实故事:AI 帮我找出三年前埋的坑
有一次,一个功能偶尔报ECONNRESET,只在生产环境、高峰期出现。我看了两天,以为网络问题。后来我把完整的错误日志和相关代码(十几个文件)打包发给 GPT-4,问它:“什么情况下会频繁连接重置?” 它看了一会儿,指出:“你的http.Agent没有设置maxSockets,默认无穷,但某些第三方服务限制了单个 IP 的连接数。高峰期超过限制,直接掐断连接。”
我查了文档,果然。加了一行maxSockets: 10,问题消失。这个 bug 躺了三年,AI 十分钟破案。
五、让 AI 更懂你的业务:提供上下文
AI 排错的准确率取决于你给的上下文。你可以先把项目的大致架构、常见错误、已知边界条件写成一段“项目 profile”,然后每次排错时让 AI 参考。例如:
我的项目是一个 Next.js + Prisma 的电商网站,用户登录后
session.user.id一定存在,除非 session 过期。过期时中间件会重定向到登录页,不会执行到下单逻辑。请基于这个背景分析下面的错误。
这样 AI 就不会瞎猜“也许用户没登录”,而是直接去检查 session 是否在某个环节被意外清除。
六、局限性:AI 也会翻车
- 幻觉:它可能编造一个不存在的函数或字段。
- 过度自信:明明不确定,却说“这就是原因”。
- 环境依赖:它不知道你服务器上的特殊配置。
所以我的策略:AI 给建议,我来验证。它说“可能是 X”,我就去查 X;它给修复代码,我先在测试环境跑一遍。永远不要让 AI 直接往生产发代码。
七、总结:AI 排错是“辅助驾驶”,不是“自动驾驶”
- 用 AI 快速分析错误堆栈、推测原因、提供修复方向。
- 结合自动化工具,让 AI 在线上错误发生时第一时间介入。
- 提供足够的上下文(架构、已知问题),提升准确率。
- 人做最终决策,AI 负责熬夜。
自从我用上这套流程,半夜被叫醒的次数减少了 80%。现在报警来了,我先看 AI 的分析,十有八九直接点出问题。我可以回一句“知道了,明天处理”,然后关灯继续睡。第二天到公司,五分钟修好。老板还夸我“反应快”。
评论区聊聊:你被线上 bug 折腾过最久的一次是多久?后来怎么发现的?
