本文目录导读:

- 核心原则:先分段,再定位
- 前端调试(浏览器 - 以 Chrome DevTools 为例)
- 后端调试(以 VS Code + Node.js/Python 为例)
- 通用调试技巧与思维
- 总结:遇到 Bug 时,系统性地思考
排查 bug 是软件开发中最核心的技能之一,使用调试工具(Debugger)而不是凭空猜测,能让你更快、更准地找到问题根源。
下面是针对主流场景(前端、后端、移动端、通用)的调试工具使用指南,按步骤说明。
核心原则:先分段,再定位
- 复现:稳定复现 bug 的步骤。
- 分段:确认 bug 出现在哪个环节(输入、处理、输出、存储?)。
- 定位:用调试工具逐步缩小范围,找到精确的代码行。
- 修复 & 验证。
前端调试(浏览器 - 以 Chrome DevTools 为例)
这是最常见、功能最强大的调试环境之一。
必用功能与排查步骤:
断点(Breakpoints)—— 最核心
- 场景:某个函数执行结果不对,或点击按钮后没反应。
- 操作:
- 打开 F12 -> Sources(源代码)面板。
- 找到要调试的 JS 文件,点击行号旁边的数字,设置红色断点。
- 刷新页面或触发操作,代码会在断点处暂停。
- 高阶技巧:
- 条件断点:右键点击行号 -> “Add conditional breakpoint”,输入条件,如
i > 100或user.name === 'admin',只在条件成立时暂停,避免几千次循环。 - DOM 断点:在 Elements 面板,右键某个 HTML 元素 -> Break on -> 选择“子节点变动”、“属性修改”或“节点移除”,当对应的 DOM 被脚本修改时,自动定位到修改它的代码行,非常适合排查“某个元素为什么突然消失了/变了”的 bug。
- 事件监听器断点:在 Sources 面板右侧,有一个 “Event Listener Breakpoints” 列表,勾选
click或keydown等事件,页面任何元素触发该事件时都会暂停,适合排查“点击没反应”或“误触发了事件”的问题。
- 条件断点:右键点击行号 -> “Add conditional breakpoint”,输入条件,如
控制台(Console)—— 快速验证与日志
console.log():虽然原始,但很有效,在疑似出错的代码前后打印变量值。console.table():打印数组或对象时,用表格形式展示,一目了然。console.assert(条件, '错误信息'):只在条件为false时打印错误,避免大量无用的输出。console.trace():打印调用堆栈,当你不知道当前函数是被谁调用时,加上这一句。- Sources 面板的 Console:当代码暂停在断点时,控制台的作用域(Scope)就是当前暂停处的变量上下文,你可以在控制台直接输入变量名查看值,甚至可以执行
x = 10这样的赋值来临时修改数据,然后恢复运行看效果,这是活调试的精髓。
网络(Network)—— 排查 API 请求与资源
- 场景:页面数据加载不出来,或提交表单后没反应。
- 操作:打开 Network 面板,刷新页面。
- 查看请求是
pending、200还是404/500。 - 点击具体请求,看 Headers(请求头、参数)、Payload(发送的数据)、Preview 或 Response(服务器返回的数据)。
- 关键:用 “Initiator”(发起者)列,可以直接跳转到发起该网络请求的那一行 JS 代码。
- 查看请求是
React/Vue 开发者工具
- React DevTools:可以查看组件的
props、state、hooks值,当组件渲染不对时,点一下就能看到所有状态,比console.log一堆好用很多,还能查看组件高亮和性能火焰图。 - Vue DevTools:类似,可以修改组件数据,实时观察页面更新。
后端调试(以 VS Code + Node.js/Python 为例)
VS Code 自带强大的调试器,集成度高,是后端调试的首选。
核心操作:配置 launch.json
- 设置断点:在代码行号左侧点击,出现红色圆点。
- 启动调试:按
F5,选择对应的环境(Node.js、Python、Java 等)。 - 调试工具栏:代码暂停后,顶部的控制条:
F10单步跳过:一行一行执行当前函数,不看函数内部细节。F11单步进入:进入当前行调用的函数内部,仔细看它是怎么执行的(非常关键)。Shift+F11单步跳出:快速执行完当前函数,回到调用它的上一级。F5继续(恢复):执行到下一个断点。
- 变量面板(左侧):可以看到所有局部变量、全局变量、闭包的实时值,还可以在“监视”(Watch)里添加
this、x+y这样的表达式。 - 调用堆栈(Call Stack):展示了函数调用链,点击堆栈的层级,可以看到当时那一层的变量值。这是“回放”执行流程、理解代码逻辑的利器。
典型场景:Web 应用后端
- 排查请求处理:
- 在 API 处理函数的第一行设置断点。
- 用 Postman 或浏览器发送请求。
- VS Code 自动暂停,你可以在变量面板看到
req.body,req.params,确认请求数据是否正确到达了后端。 F10逐行执行,看业务逻辑,看数据库查询的结果是否正确。- 如果数据库查询失败,可能是 SQL 写错了,或数据库连接断了,在查询语句处设置断点,复制出查询语句,直接在数据库客户端里跑一下,看是否真的能查到数据。
通用调试技巧与思维
二分法定位
- 如果一个很长的函数崩了,或数据错了。
- 不要从头到尾逐行看代码,而是在代码的中间位置(比如第 50 行,总共 100 行)设一个断点。
- 如果运行到中间断点时,数据已经错了,说明 bug 在前 50 行,否则在后 50 行。
- 重复此过程,可以非常快地(log₂N 步)缩小范围。
使用“日志点”(Logpoints)
- 不想修改代码加
console.log,又不想设断点暂停? - 在 Sources 面板(浏览器)或 VS Code 里,右键行号 -> “Add Logpoint”(添加日志点)。
- 输入一个表达式,
"user id is: " + userId,程序运行到这里时不会暂停,但会在控制台输出这条信息。非常适合在高频循环或大量请求中做标记。
异常断点(Break on Caught/Uncaught Exceptions)
- 程序静默地崩溃(Uncaught exception),没有报错,但功能失效了。
- 操作:在 VS Code 的调试面板或 Chrome Sources 面板中,有一个暂停图标/选项,可以勾选“所有异常”(Pause on Caught Exceptions)或“未捕获的异常”(Pause on Uncaught Exceptions)。
- 这样只要代码抛出异常(即使被
try-catch捕捉了),调试器自动暂停在抛出异常的那一行,这是定位“奇怪崩溃”的终极手段。
条件断点 + 日志点 组合拳
- 假设你发现
processOrder()函数在处理订单 ID 为 10032 的订单时算错了价格。 - 可以设置一个条件断点:
order.id === 10032,这样程序运行时会直接停在此处,其他订单正常执行,然后用F10慢慢走,看是哪个变量计算出了意想不到的值。
遇到 Bug 时,系统性地思考
- 复现:能不能稳定复现?
- 现象:预期结果是什么?实际结果是什么?两者之间的具体差异是什么(比如值不同、颜色不对、报错了、没反应)?
- 分段:bug 在前端、后端、网络传输、还是数据存储?
打开浏览器 Network,看 API 返回的数据对不对?如果对,是前端渲染或状态管理的问题;如果不对,是后端接口或数据库的问题。
- 定位:如果是代码逻辑问题,设置断点 + 单步调试。
- 修复:修改代码,运行测试,再次复现确认。
最后建议:下决心花一天时间专门学习你所用工具的调试器(Chrome DevTools 的“调试器”教程,或你 IDE 的调试入门视频)。掌握调试工具后,排查 bug 的时间至少能减少 80%。
标签: 排查
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。