• SD讲师张银奎专访:谈调试器的威力
    时间:2008-11-05   作者:佚名   出处:互联网

    调试是一门实践性强涉及面广的综合技能。首先,学习时应该多动手实验,拳不离手,曲不离口。以我个人的经历为例,从业十多年以来,我几乎每天工作时都使用调试器。除了使用它调试程序、寻找代码中的问题,我还使用调试器认识其它软件、探索操作系统、观察硬件等等。

    2008年的SD大会,在“语言与工具”专场,邀请到来自Intel的张银奎先生,将做主题为“感受和思考调试器的威力”的讲座。本刊记者就调试话题做了专访,下面为采访内容。

    记者:《程序员》早期的特别策划中,有人讲调试是程序员的一个基本功,您有什么观点?

    张银奎:调试是大多数程序员几乎每天都面对的任务。调试能力是程序员的一项基本功。调试效率的高低直接关系到程序员的工作效率,甚至决定着软件项目的成败。但是很多人还没有意识到这些。

    记者:您是否可以谈谈,为什么说调试在编程中,起着如此重要的作用?甚至我们可以说,编程这件事,主要就是调试。

    张银奎:有很多个因素决定了调试在编程乃至整个计算机世界中的无比重要性。从根本上来说,是计算机系统的设计理念决定了调试的重要地位。现代计算机系统的一个重要设计原则是让硬件在软件的指挥下工作,把灵活性和智能留在软件中实现,这同时也把计算机系统的控制权交给了软件。让软件控制强大的计算机硬件是聪明的,运行不同的软件就可以让同一台机器做完全不同的事情也是冒险的,一条错误的指令就可能让系统崩溃甚至导致灾难。降低风险的方法是提高软件的质量和我们对软件的控制力。但对人类而言,无形的软件比有形的硬件更加难以驾驭!

    软件瑕疵总是存在但却难以寻找;病毒和恶意软件不请自来,而且挥之不去;CPU不堪重负,用户下达的命令却还得不到执行。相对于淳朴的硬件,软件更加复杂、多变、桀骜、事故和狡黠!何以应对?为了控制软件,计算机先驱在一开始设计计算机系统时就设计了各种调试设施,包括单步执行和中断执行等。今天我们将这些功能纳入到调试器工具中。一旦进了调试器,再狂野的软件都会变得服服帖帖,所有的宏观结构和微观细节任由我们审阅,大到整个地址空间和每个文件,小到每一个内存单元和每一条指令。如果静态的分析还不够,那么我们可以让它根据我们的要求来执行,执行一条指令,执行到下一个分支,执行到上一级函数,等等。总之,以调试器为核心的调试技术是征服软件和计算机世界的最强大工具,其用途很广。

    具体地讲,首先,调试是定位软件瑕疵的最直接和最有效的方法。没有哪个程序员能一下子写出没有错误的代码。而使用以调试器为主的调试工具进行调试是定位瑕疵的最直接方法,可以从问题的症状入手,正向跟踪或者反向追溯。对于大多数瑕疵,使用合适的调试方法可以大大提高定位到问题根源的效率。今天的软件环境在不断向着大型化、并行化、复杂化方向发展,定位瑕疵的难度也在随之不断提高。完全靠读源代码来寻找bug的方法已经很难适应今天的软件发展形势。另外,枚举和排除法通常也会因系统中的软硬件模块数量太多而难以实施,有时候,花了几天时间来做替换仍然找不到怀疑对象。

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

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

    记者:张先生,您现在在上海Intel工作,主要做的是什么方面的工作?或者你们部门的工作是关于什么的?您是从什么时候,开始比较关注调试技术的?

    张银奎:目前我在英特尔的CPG(Channel Platform Group)工作,主要做底层软件的开发工作,包括驱动程序、系统软件和少量应用软件。我每天做的主要工作除了设计和编写代码外,就是调试。调试的代码有自己编写的,但大多数时候都是调试别人写的代码,有时候是在汇编一级调试不知何人写的代码。

    我是在大学毕业后逐渐开始对调试技术产生兴趣,记得当时主要用的是Borland的开发工具和调试器,说起来已经是十多年前的事情了。也许是因为始终有调试器来帮忙,这么多年中,我一直享受着做技术的快乐,没有感觉得坚持做技术的压力。

    记者:下面一个问题,如果我想提高自己调试程序的水平,我准备自学,您有什么建议,也就是我应该怎样学习调试?应该采用怎样的步骤,和掌握哪些调试工具,在学习掌握这些工具时应该注意哪些问题?

    张银奎:调试是一门实践性强涉及面广的综合技能。首先,学习时应该多动手实验,拳不离手,曲不离口。以我个人的经历为例,从业十多年以来,我几乎每天工作时都使用调试器。除了使用它调试程序、寻找代码中的问题,我还使用调试器认识其它软件、探索操作系统、观察硬件等等。
    另外,学习调试时要多思考,多问为什么。这样就可以慢慢打通未知领域,使自己的理解不断深入,直到有一天,不同方向的探索纷纷会合,融汇贯通,那么功夫便学成了。因为调试技术的广泛关联性,所以一旦把调试技术都搞通了,那么对整个计算机系统的理解也会有一个质的飞跃。

    关于调试工具,在Windows平台上,我主要使用的是WinDBG。在Linux平台中,使用GDB。二者都是以命令方式为主的。对于习惯图形界面的很多初学者来说,可能觉得命令方式不好学,事实上,先学会一些常用的命令并不难,然后可以慢慢学习更多的命令。在入门后,应该学一些调试原理,这样才能深入了解不同调试功能的长处和短处,更好地应用它们。

    记者:您最近出了一本关于调试的书,这是怎样的一本书?请谈一谈,软件调试技术都包括哪些方面?

    张银奎:是的,书名叫《软件调试》。首先,这本书全面讨论了软件调试的一般原理,包括CPU、操作系统和编译器是如何支持软件调试的,内核态调试和用户态调试的工作模型,以及调试器的工作原理。软件调试是计算机系统中多个部件之间的一个复杂交互过程,要理解这个过程,必须要了解每个部件在其中的角色和职责,以及它们的协作方式。学习这些原理不仅对提高软件工程师的调试技能至关重要,而且有利于提高它们对计算机系统的理解,将计算机原理、编译原理、操作系统等多个学科的知识融会贯通在一起。

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

    另外,《软件调试》探讨了可调试性(Debuggability)的内涵、意义和实现软件可调试性的原则和方法。所谓软件的可调试性就是在软件内部加入支持调试的代码,使其具有自动记录、报告和诊断的能力,可以更容易调试。软件自身的可调试性对于提高调试效率、增强软件的可维护性,以及保证软件的如期交付都有着重要意义。软件的可调试性是软件工程中一个很新的领域,本书第一次对其进行了深入系统的探讨。
    总之,我希望通过这本书帮助读者学习软件调试的原理,思考软件可调试性的重要性,学会基本的软件调试方法和调试工具的使用,并能应用这些方法和工具解决问题和学习其他软硬件知识。

    基于以上目标,《软件调试》分6篇30章进行了讨论。第2、3、4篇侧重调试原理,第5篇讨论可调试性,第6篇介绍软件调试的核心工具——调试器。

    记者:我有一个问题,按您上面讲的主要是关于Windows 和Intel这个平台的,对于不是这个开发平台,是否会有帮助呢?

    张银奎:大体来说,基本调试功能的工作方式和工作原理是基本一致的,但对于不同的CPU架构和操作系统,其实现细节是有差异的。因此,对于使用其它平台的读者,可以学习原理部分,参考和借鉴与平台相关的部分。

    记者:最后,您能否介绍一些关于调试技术的书籍?

    张银奎:与编程语言和其它计算机技术书籍的数量相比,关于调试的书还很少。首先John Robbins所写的《Microsoft.NET 和Windows 应用程序调试》(Debugging Applications for Microsoft .NET and Microsoft Windows)很适合初学Windows用户态调试的读者阅读。
    其次,Matthew A. Telles, Yuan Hsieh所著的《程序调试思想与实践》(The Science of Debugging)(中国水利水电出版社)是较著名的探讨软件错误和调试方法学的专著。

    Advanced Windows Debugging是另一本讨论Windows调试的书,重点讨论了几类常见的调试问题,如内存、安全、进程间通信等。该书是2007年十月出版的,目前还没有中文版。再有就是我写的《软件调试》,有兴趣的朋友可以先通过以下链接来了解更详细的介绍和阅读样章:http://advdbg.org/books/swdbg/。

    网友留言/评论

    我要留言/评论