写代码时出问题再正常不过,就像做饭糊了锅一样常见。关键是怎么快速找到“糊”的地方。程序调试就是干这个活儿的,不同的场景适合不同的方法。
打印日志(Print Debugging)
最直接也最常用的方式,就是在代码里插入打印语句,看看变量值对不对,程序走到哪一步了。比如你在处理用户登录逻辑,发现密码总是验证失败,可以在判断前打印一下输入的密码和数据库取出的值:
print("输入密码:" + user_input_password)
print("数据库密码:" + db_password)
虽然土,但特别管用,尤其在没有调试器的环境,比如某些嵌入式系统或者线上日志排查。
使用调试器(Debugger)
现代开发工具基本都自带调试器,像 VS Code、PyCharm、Xcode 这些都能打断点、单步执行、查看调用栈。你可以在可疑的代码行设个断点,运行程序后它会停在那里,然后一步步看变量怎么变的。这就像录了一段视频,你可以暂停、快进、回放。
比如一个循环计算总金额,结果总是多算一块钱。用调试器逐行走一遍,很容易就能发现是循环多执行了一次。
单元测试辅助调试
写测试用例不只是为了防止出错,也能帮定位问题。当你改完一段代码,跑一下相关测试,如果某个用例失败,就知道影响范围在哪。比如你修改了订单价格计算逻辑,结果“满减优惠”测试不通过,那问题大概率就出在这块。
静态代码分析
有些错误不用运行就能发现,比如变量未定义、语法错误、潜在空指针。工具像 ESLint(JavaScript)、Pylint(Python)能在你写代码时就标红警告。这就像是拼写检查,提前把明显的坑填上。
远程调试与日志监控
线上服务出了问题不能随便重启,这时候得靠远程调试或集中式日志。比如用 Docker 部署的服务,可以通过日志平台(如 ELK)查某条请求的完整链路。发现某个接口频繁报超时,顺着日志往下追,可能发现是数据库查询没加索引。
利用浏览器开发者工具
前端调试离不开浏览器的 DevTools。网络面板看接口是否发出、返回数据对不对;元素面板查样式冲突;控制台看 JavaScript 错误。比如页面按钮点了没反应,打开控制台一看,原来是脚本加载失败报了 404。
二分法排查
当问题范围太大,可以尝试“砍半”缩小。比如一段 200 行的函数出错,先在中间打个日志,看程序是否走到这里。如果走了,说明问题在后半段,再继续拆。这种方法适合没有头绪的时候。
调试不是靠运气,而是有章法地缩小问题范围。选对方法,能省下大把熬夜的时间。