软件调试在软件开发中占有很大比重,有时候调试比写代码占用了更多的时间。软件项目的延期大多不是因为功能需求没有完全实现,而是到了deadline还存在很多Bug需要调试解决,这让软件团队的大部分人加班,十分痛苦。软件调试的目的多是为了确保业务流程正确、发现软件的性能瓶颈、定位并解决软件的Bug等。本文主要讲几种定位Bug的常用方式,解决了定位Bug这个最核心、最难的问题,接着对Bug对症下药就有Bug的解决方案了。
先确定Bug对应的软件和代码版本,再进行调试分析解决。
当遇到一个Bug的时候,依靠自己的直觉和想象定位可能出现Bug的原因,在脑海中对可能造成Bug的代码进行静态分析,找出Bug的根因并给出解决方案。
这个方法算是一个神级操作,看起来什么都没有做就把问题解决了。通常这需要你对软件代码足够的熟悉,能在脑海中模拟软件的执行过程。只能用来解决你自己编写代码,或者你深度阅读过的代码。
脑海中对代码进行静态分析的能力,可以通过大量阅读代码,大脑持续模拟软件执行来加强。
Code Review(代码审查)略逊于直觉和想象的方式,用于处理你不太熟悉的代码:别人写的、时间长了记不清的代码。打开开发工具查看代码,结合Bug现象分析,确定Bug的原因。
如果早期进行了比较好的Code Review,可以减少很多不必要的Bug,事半功倍,软件发布后就省下很多解决Bug时间。
断点调试可以一步一步的查看软件的执行过程,直接定位到Bug的代码位置。
断点调试是比较常用的调试方式,十分有效,对学习编程有很大好处。但是也有不少缺点:基本上只能在开发环境上断点调试;调试的上下文是一次性的,不能保存,如果需要只能进行二次调试;当项目较大时断点调试可能需要花费大量的时间。
对于偶发性的Bug,断点调试不知道需要调试多少遍才能定位大Bug的原因。
日志记录下软件的执行过程,能直接记录Bug发生的原因,可以供程序员进行分析。
日志记录在开发环境和生产环境同样有效。日志记录的是持久化内容,可以多次查看、共享(邮件发送)等。更好的日志可以通过软件读取日志记录数据,作为软件的输入数据再次模拟软件运行,重新复现Bug,可结合断点调试找到产生Bug的原因。
我曾排斥为软件增加日志,原因是浪费性能、破坏代码的优美,最终还是妥协了,优点就是上面讲的。浪费性能是必然的,尤其是输出比较多的详细日志,可以通过设置日志的等级,减少或增加日志记录;代码的优美只能适当的破坏了,当然拥有良好的代码风格也不会写出太难看的代码。
首先确保软件版本和运行的环境及相关模块正确。生产环境中的Bug多是由使用人员发现,因为他们是非软件专业人员,往往看到的只是表面现象,提供的生产环境信息可能不正确,因此一定要先确认运行环境正确,再去判断是否是代码逻辑问题。
生产环境中的Bug,受限于生产环境,不能在生产环境中接直调进行试代码,这时需使用构造生产环境的条件进行模拟复现。用最小的成本和时间定位到软件问题并及时处理。模拟输入数据、监测软件执行过程、核对输出结果基本能定位到问题原因。构造的条件可能要构造多种情况,才能确定和生产环境中条件一致那种情况。有点类似单元测试的过程,但是范围更广,可能涉及到多个方法、模块、多个网络终端运行的进程。
调试工具是采用一些辅助工具进行调试,用不编程的方式发现和解决软件Bug。
C# 开发常用工具中提及了一部分工具。
以上是软件生命周期中,几种比较常用的调试方式,不同的场景下采用不同的调试方式或组合。如果方法使用得当,一般人需要几个小时甚至几天才能解决的Bug,你只需要花比较少的时间就能够解决了,游刃有余。