2008年的sd大会,在“语言与工具”专场,邀请到来自intel的张银奎先生,将做主题为“感受和思考调试器的威力”的讲座。本刊记者就调试话题做了专访,下面为采访内容。 记者:《程序员》早期的特别策划中,有人讲调试是程序员的一个基本功,您有什么观点? 张银奎:调试是大多数程序员几乎每天都面对的任务。调试能力是程序员的一项基本功。调试效率的高低直接关系到程序员的工作效率,甚至决定着软件项目的成败。但是很多人还没有意识到这些。 记者:您是否可以谈谈,为什么说调试在编程中,起着如此重要的作用?甚至我们可以说,编程这件事,主要就是调试。 张银奎:有很多个因素决定了调试在编程乃至整个计算机世界中的无比重要性。从根本上来说,是计算机系统的设计理念决定了调试的重要地位。现代计算机系统的一个重要设计原则是让硬件在软件的指挥下工作,把灵活性和智能留在软件中实现,这同时也把计算机系统的控制权交给了软件。让软件控制强大的计算机硬件是聪明的,运行不同的软件就可以让同一台机器做完全不同的事情也是冒险的,一条错误的指令就可能让系统崩溃甚至导致灾难。降低风险的方法是提高软件的质量和我们对软件的控制力。但对人类而言,无形的软件比有形的硬件更加难以驾驭! 软件瑕疵总是存在但却难以寻找;病毒和恶意软件不请自来,而且挥之不去;cpu不堪重负,用户下达的命令却还得不到执行。相对于淳朴的硬件,软件更加复杂、多变、桀骜、事故和狡黠!何以应对?为了控制软件,计算机先驱在一开始设计计算机系统时就设计了各种调试设施,包括单步执行和中断执行等。今天我们将这些功能纳入到调试器工具中。一旦进了调试器,再狂野的软件都会变得服服帖帖,所有的宏观结构和微观细节任由我们审阅,大到整个地址空间和每个文件,小到每一个内存单元和每一条指令。如果静态的分析还不够,那么我们可以让它根据我们的要求来执行,执行一条指令,执行到下一个分支,执行到上一级函数,等等。总之,以调试器为核心的调试技术是征服软件和计算机世界的最强大工具,其用途很广。 具体地讲,首先,调试是定位软件瑕疵的最直接和最有效的方法。没有哪个程序员能一下子写出没有错误的代码。而使用以调试器为主的调试工具进行调试是定位瑕疵的最直接方法,可以从问题的症状入手,正向跟踪或者反向追溯。对于大多数瑕疵,使用合适的调试方法可以大大提高定位到问题根源的效率。今天的软件环境在不断向着大型化、并行化、复杂化方向发展,定位瑕疵的难度也在随之不断提高。完全靠读源代码来寻找bug的方法已经很难适应今天的软件发展形势。另外,枚举和排除法通常也会因系统中的软硬件模块数量太多而难以实施,有时候,花了几天时间来做替换仍然找不到怀疑对象。 第二,调试可以帮助程序员提高编写代码的能力。因为调试可以让程序员彻底了解程序的实际执行过程,检查与自己设计时的预想是否一致,如果不一致,那么很可能预示着有问题存在,应该引起重视。另外,调试过程可以让程序员更好的认识到提高代码可调试性和代码质量的重要性。从此,自觉的改进编码方式,合理添加用来支持调试的代码。编码和调试是程序员日常工作中的两个最主要任务,这两个任务是相辅相成的,编写具有可调试性的高质量代码,可以明显提高调试效率,节约调试时间。另一方面,调试可以让程序员真切感受程序的实际执行过程,反思编码和设计中的问题,加深对软件和系统的理解,提高对代码的感知力和控制力。 第三,调试工具是学习计算机系统和其它软硬件知识的好帮手。通过软件调试技术的强大观察能力和断点、栈回溯、跟踪等功能可以快速的了解一个软件和系统的模块、架构、和工作流程,因此是学习其它软硬件技术的一个快速而有效的方法。我经常使用这种方法来学习新的开发工具、硬件、应用软件和操作系统。 记者:张先生,您现在在上海intel工作,主要做的是什么方面的工作?或者你们部门的工作是关于什么的?您是从什么时候,开始比较关注调试技术的? 张银奎:目前我在英特尔的cpg(channel platform group)工作,主要做底层软件的开发工作,包括驱动程序、系统软件和少量应用软件。我每天做的主要工作除了设计和编写代码外,就是调试。调试的代码有自己编写的,但大多数时候都是调试别人写的代码,有时候是在汇编一级调试不知何人写的代码。 我是在大学毕业后逐渐开始对调试技术产生兴趣,记得当时主要用的是borland的开发工具和调试器,说起来已经是十多年前的事情了。也许是因为始终有调试器来帮忙,这么多年中,我一直享受着做技术的快乐,没有感觉得坚持做技术的压力。 记者:下面一个问题,如果我想提高自己调试程序的水平,我准备自学,您有什么建议,也就是我应该怎样学习调试?应该采用怎样的步骤,和掌握哪些调试工具,在学习掌握这些工具时应该注意哪些问题? 张银奎:调试是一门实践性强涉及面广的综合技能。首先,学习时应该多动手实验,拳不离手,曲不离口。以我个人的经历为例,从业十多年以来,我几乎每天工作时都使用调试器。除了使用它调试程序、寻找代码中的问题,我还使用调试器认识其它软件、探索操作系统、观察硬件等等。 关于调试工具,在windows平台上,我主要使用的是windbg。在linux平台中,使用gdb。二者都是以命令方式为主的。对于习惯图形界面的很多初学者来说,可能觉得命令方式不好学,事实上,先学会一些常用的命令并不难,然后可以慢慢学习更多的命令。在入门后,应该学一些调试原理,这样才能深入了解不同调试功能的长处和短处,更好地应用它们。 记者:您最近出了一本关于调试的书,这是怎样的一本书?请谈一谈,软件调试技术都包括哪些方面? (责任编辑:admin) |