调试的重要地位

来源:互联网 发布:天猫魔盒安装软件排行 编辑:程序博客网 时间:2024/05/17 07:51
计算机系统的设计理念决定了调试的重要地位。现代计算机系统的一个重要设计原则是让硬件在软件的指挥下工作,把灵活性和智能留在软件中实现,这同时也把计算机系统的控制权交给了软件。让软件控制强大的计算机硬件是聪明的,运行不同的软件就可以让同一台机器做完全不同的事情也是冒险的,一条错误的指令就可能让系统崩溃甚至导致灾难。降低风险的方法是提高软件的质量和我们对软件的控制力。但对人类而言,无形的软件比有形的硬件更加难以驾驭!
软件瑕疵总是存在但却难以寻找;病毒和恶意软件不请自来,而且挥之不去;CPU不堪重负,用户下达的命令却还得不到执行。相对于淳朴的硬件,软件更加复杂、多变、桀骜、事故和狡黠!何以应对?为了控制软件,计算机先驱在一开始设计计算机系统时就设计了各种调试设施,包括单步执行和中断执行等。今天我们将这些功能纳入到调试器工具中。一旦进了调试器,再狂野的软件都会变得服服帖帖,所有的宏观结构和微观细节任由我们审阅,大到整个地址空间和每个文件,小到每一个内存单元和每一条指令。如果静态的分析还不够,那么我们可以让它根据我们的要求来执行,执行一条指令,执行到下一个分支,执行到上一级函数,等等。总之,以调试器为核心的调试技术是征服软件和计算机世界的最强大工具,其用途很广。
首先,调试是定位软件瑕疵的最直接和最有效的方法。没有哪个程序员能一下子写出没有错误的代码。而使用以调试器为主的调试工具进行调试是定位瑕疵的最直接方法,可以从问题的症状入手,正向跟踪或者反向追溯。对于大多数瑕疵,使用合适的调试方法可以大大提高定位到问题根源的效率。今天的软件环境在不断向着大型化、并行化、复杂化方向发展,定位瑕疵的难度也在随之不断提高。完全靠读源代码来寻找bug的方法已经很难适应今天的软件发展形势。另外,枚举和排除法通常也会因系统中的软硬件模块数量太多而难以实施,有时候,花了几天时间来做替换仍然找不到怀疑对象。

第二,调试可以帮助程序员提高编写代码的能力。因为调试可以让程序员彻底了解程序的实际执行过程,检查与自己设计时的预想是否一致,如果不一致,那么很可能预示着有问题存在,应该引起重视。另外,调试过程可以让程序员更好的认识到提高代码可调试性和代码质量的重要性。从此,自觉的改进编码方式,合理添加用来支持调试的代码。编码和调试是程序员日常工作中的两个最主要任务,这两个任务是相辅相成的,编写具有可调试性的高质量代码,可以明显提高调试效率,节约调试时间。另一方面,调试可以让程序员真切感受程序的实际执行过程,反思编码和设计中的问题,加深对软件和系统的理解,提高对代码的感知力和控制力。

第三,调试工具是学习计算机系统和其它软硬件知识的好帮手。通过软件调试技术的强大观察能力和断点、栈回溯、跟踪等功能可以快速的了解一个软件和系统的模块、架构、和工作流程,因此是学习其它软硬件技术的一个快速而有效的方法。我经常使用这种方法来学习新的开发工具、硬件、应用软件和操作系统。

。学习这些原理不仅对提高软件工程师的调试技能至关重要,而且有利于提高它们对计算机系统的理解,将计算机原理、编译原理、操作系统等多个学科的知识融会贯通在一起。

《软件调试》的第二个目标是交流软件调试的方法和技巧。包括调试用户态程序和系统内核模块的基本方法,如何诊断系统崩溃(BSOD)和应用程序崩溃、如何调试缓冲区溢出等与栈有关的问题,如何调试内存泄漏等与堆有关的问题。特别是,我们非常全面介绍了WinDBG调试器的使用方法,给出了大量使用这个调试器的实例。

另外,《软件调试》探讨了可调试性(Debuggability)的内涵、意义和实现软件可调试性的原则和方法。所谓软件的可调试性就是在软件内部加入支持调试的代码,使其具有自动记录、报告和诊断的能力,可以更容易调试。软件自身的可调试性对于提高调试效率、增强软件的可维护性,以及保证软件的如期交付都有着重要意义。软件的可调试性是软件工程中一个很新的领域,本书第一次对其进行了深入系统的探讨。



原创粉丝点击