为什么调试在编程中很重要?
有很多因素决定了调试在编程乃至整个计算机世界中的无比重要性。从根本上来说,是计算机系统的设计理念决定了调试的重要地位。现代计算机系统的一个重要设计原则是让硬件在软件的指挥下工作,把灵活和智能留在软件中实现,这同时也把计算机系统的控制权交给了软件。让软件控制强大的计算机硬件是聪明的,运行不同的软件就可以让同一台机器做完全不同的事情也是冒险的,一条错误的指令就可能让系统崩溃甚至导致灾难。 降低风 险的方法是提高软件的质量和我们对软件的控 制力。 但对人 类而言 , 无形 的软件比有形 的硬件更加难以驾驭 ! 软件瑕疵 总是存在但却难以寻找 ; 病毒和恶意软件不请 自来 , 而且挥之不去 ; C P U 不堪重负 , 用 户下达的命令却还得不 到执行。 相对于淳朴的硬件 , 软件更 加复杂 、 多变、 柒鹜、 事故和狡黯 ! 何以应对? 为了控制软件 , 计算机先 驱在一开始设计计算机系统时就设计了各种调试设施 , 包括单步执行和 中 断执行等。 今天我们将这些 功能纳入 到调试器工具中。 一旦进 了调 试器 , 再狂野的软件都会变得服服帖帖 , 所有的宏观结构和微观 细节任由我们审 阅 , 大到整个地址空 间和每个文件 , 小到每一个内存单元和每一条指令 。 如果静态的分析还不够 , 那么我们可 以让 它根据我们的要求来执行 , 执行 一 条指令 , 执行到下一个分支 , 执行到上一级 函数 , 等等。 总之 , 以调试 器 为核心的调 试技术是征服软件和计算机世界的最强大工具 , 其用途很广。
具 体地讲 , 首先 , 调试是 定位软件瑕疵的最直接和最 有效的方法 。 没 有哪个程序员能一下子 写出没有错误 的代码。 而使用 以调试器 为主的调试 工具进行调试是定位瑕疵的最直接方法 , 可以从 问题 的症状入手 , 正 向跟 踪或者反 向追 溯。 对于大多数瑕疵 , 使用合适的调试方法可 以大大提高定 位到问题根源 的效率 。 今天的软件环境在不断向着大型化 、 并行化、 复杂 化 方向发展 , 定位瑕疵的难度也在随之不 断提高。 完全靠读源代码来寻找 b u g 的方法已经很难适应今天的软件发展形势 。 另外 , 枚举和排除法通常 也会因系统中的软硬件模块数量太 多而难 以实施 , 有时候 , 花了几天时间 来做替换仍然找不 到怀疑对 象。
第二 , 调 试可 以帮助程序员提高编写代码 的能力。 因 为调试可 以让程 序员彻底了解程 序的实际执行过程 , 检查与自己设计时的预想是 否一致 , 如果 不一致 , 那 么很可能预示 着有问题存在 , 应该引起重视 。 另外 , 调试 过程可 以让 程序员更好的认识到 提高代码可调试性和代码质量 的重要性 。 从此 , 自觉的改进编码方式 , 合理 添加用来支持调 试的代码 。 编码 和调 试 是程序员 日常工作中的两个最 主要任务 , 这两个任务是相辅相成的 , 编写 具有可 调试性的高质量代码 , 可 以明显提高调试效率 , 节约调试时间。 另 一方面 , 调试可 以让程 序员真切感受程序的实际执行过程 , 反思编码和 设 计中的问题 , 加深对软件和 系统的理解 , 提高对代码的感知力和控制力。
第三 , 调试工具是学习计算机系统和其它软硬件知识 的好帮手 。 通过 软件调试技术的强大观察能力和 断点、 栈回溯 、 跟踪等功能可 以快速的了 解一个软件和系统的模块 、 架构 、 和工 作流程 , 因此是学习 其它软硬件技 术的一 个快速而有效的方 法 。