三亩地 三亩地SAN MU DI · CODE DIARY
DEBUG FLOW

代码调试思路

报错不可怕,可怕的是盯着屏幕瞎改。这一页教你把"改不动"的崩溃,变成"按流程排查"的肌肉记忆。

PROCESS · 通用流程

五步把报错变成修复

调试有标准动作。按这个顺序走,能解决 80% 的问题,剩下 20% 才需要更深的工具。

STEP 01 · 复现

稳定复现 bug

不能稳定复现的 bug 几乎无法修。先找最小复现路径:哪些步骤、哪些数据、哪个环境下必出。

STEP 02 · 隔离

二分法缩小范围

注释掉一半代码看是否还报错,逐步缩小到出问题的具体行。比逐行读快十倍。

STEP 03 · 观察

用断点或日志看真实值

不要靠脑补,要看真实运行时的变量值。80% 的 bug 在你看清变量值的瞬间就明白了。

STEP 04 · 假设

提出根因假设

把"为什么会这样"写成一句话假设,再用断点验证。猜对了再动手改,避免无效修改。

STEP 05 · 验证

修复并回归测试

改完先跑复现路径,再跑一遍完整测试。确认 bug 没了,且没引入新的问题。

代码调试流程与工具示意 DEBUG · 流程

报错是机器在跟你说话,先把它的句子读完

—— 三亩地 · 调试守则

读报错信息技巧示意图 TIP · 读报错
SKILL · 读报错

报错信息的三个关键字

新手看到一长串红字就懵。其实只要抓三个关键字:错误类型、出错文件、出错行号。剩下的多半是调用栈,按需往下读。

// 典型报错示例
TypeError: Cannot read properties of undefined
    at renderUser (app.js:42)
    at init (app.js:18)

/* 三关键字拆解:
   1. 错误类型:TypeError(类型错误)
   2. 出错位置:app.js 第 42 行
   3. 关键描述:读取 undefined 的属性
   → 去第 42 行看,哪个变量是 undefined */

技巧:报错第一行最重要,先看它。第二行起的调用栈,是从出错点往上回溯的执行路径——离出错点最近的通常在最上面。

BISECTION · 二分法

不知道哪里错了?砍一半试试

面对几百行代码不知道哪里出错,二分法是最快的定位手段——每次砍掉一半,看 bug 还在不在。

二分法定位 bug 示意图 METHOD · 二分
EXAMPLE · 二分法步骤

四步定位一个隐藏 bug

假设某个页面 200 行代码出问题,按下面四步走,最多四轮就能定位到具体行。

// 第一轮:注释掉后 100 行
// bug 消失 → 问题在后 100 行
// bug 还在 → 问题在前 100 行

// 第二轮:在剩下的 100 行里再砍一半
// 第三轮:剩下 50 行砍成 25 行
// 第四轮:25 行砍成 ~12 行

// 200 行 → 4 轮二分 → 锁定到 ~12 行
// 比一行一行读快 16 倍

console.log('🔍 二分法无敌');
TOOLS · 断点 vs 日志

什么时候打断点,什么时候打日志

两个调试手段各有所长。选错工具会让你事倍功半。

断点 · 适合本地

能逐步执行、查看调用栈、监视变量。适合开发环境排查复杂逻辑,但需要 IDE 支持与可重现的场景。

日志 · 适合线上

记录关键节点的变量值与执行路径。适合无法断点的生产环境,事后翻日志即可复盘。

取舍原则

本地能复现用断点,线上偶发用日志;逻辑复杂用断点,跨服务用日志。开发期多打日志,上线前清理。

调试不是和 bug 拔河,是和它下棋。每一步都要先想"为什么这样改",而不是"也许这样改就行"。

— 三亩地 · 调试心法