软件在发布之前,应该没有错误,这样才能让用户满意。为了达到这个目的,在开发过程中,调试(debugging)是必不可少的——注意,调试不是测试,两者是有区别的。
什么是调试?
软件程序在开发过程中要经历大量的测试、更新、故障排除和维护,程序中有错误和缺陷,是正常现象,关键在于如何改正这些错误和缺陷。调试就是对软件进行错误修正的过程。
即识别、分析和消除错误。调试过程开始于软件无法正确执行之际,结束于解决问题并成功测试软件之时。调试过程是一项极其复杂和乏味的任务过程,因为在调试的所有阶段都需要解决错误。
为什么需要调试?
一旦开始写代码,调试过程就开始了。然后,当代码与其他编程单元结合形成软件产品时,调试将在后续的阶段中继续进行。调试有许多好处,例如:
- 它立即报告**错误状况。**这使我们更早地检测到错误,并使软件开发能顺利进行下去。
- 它还提供关于数据结构的最大限度的有用信息及简单解释。
- 调试帮助开发人员减少无用的和分散注意力的信息。
- 通过调试,开发人员可以避免复杂的一次性测试代码,节省软件开发的时间和精力。
调试步骤
调试过程的主要步骤:
1. 识别错误(Identify the Error):错误识别可能会导致浪费开发时间。由用户报告的错误是很难解释的,有时我们收到的信息也具有误导性。调试是用来识别实际错误的的最佳方式。
2. 定位错误( Find the Error Location):准确地识别错误后,需要遍历代码以找到错误所在的确切位置。在这个阶段,你需要集中精力去找,而不是去理解它。
3. 分析错误(Analyze the Error):在第三步中,你需要从错误位置使用自下而上的方法并分析代码。这有助于理解错误。分析bug有两个主要目标:检查错误周围是否有其他错误,以及避免在修复中输入任何风险代码。
4. 验证分析(Prove the Analysis):一旦完成了对原始bug的分析,你需要找到应用程序上可能出现的更多错误。这一步涉及到在测试框架的帮助下为这些区域编写自动化测试。
5. Cover Lateral Damage(如果有网友对这个标题有好的翻译,请留言。多谢。):在这个阶段,你需要为将要更改的代码创建单元测试。现在,如果运行这些单元测试,它们都应该通过。
6. 修复与验证(Fix & Validate): 最后一个阶段是修复所有错误并运行所有测试脚本,以检查它们是否都通过。
调试策略
- 必须要深入理解整个系统,这有助于开发者对调试的程序作出正确判断。
- 对问题进行“回溯分析”,即从错误的位置开始向前跟踪所有代码,以确定故障代码的区域。你需要彻底研究整个区域,以找到错误的原因。
- “前向分析”即在程序的不同位置打断点或打印语句来前向跟踪代码执行过程。重要的是关注获得错误区域的输出内容。
- 必须已经积累的开发经验来检查类似的问题。这种方法的成功取决于开发者的专业知识。
调试工具
调试工具是用来测试和调试其他程序的计算机程序,比如 gdb 和 dbx 等,也具备基于控制台的命令行界面。一些自动调试工具包括基于代码的跟踪器、探查器、解释器等。
以下是一些广泛使用的工具列表:
- Radare2
- WinDbg
- Valgrind
此外,IDE 也集成了一些调试工具,帮助开发者捉虫子。
参考文献
https://www.edureka.co/blog/what-is-debugging/