您的浏览历史

软件调试 (china-pub 全国首发)(08年度畅销榜NO.10)

  • 定价 : ¥128.00
  • 会员价 : ¥98.56
促销活动
精彩评论

基本信息

  • 作者: 张银奎   
  • 出版社:电子工业出版社
  • ISBN:9787121064074
  • 上架时间:2008-6-5
  • 出版日期:2008 年6月
  • 开本:16开
  • 页码:1006
  • 版次:1-1
  • 所属分类: 计算机 > 软件工程及软件方法学 >

    软件质量、软件测试及维护


编辑推荐

2008以书会友有奖活动

ACM院士和调试技术先驱Jack B.Dennis教授做历史回顾.
计算机和操作系统领域资深专家David A. Solomon作序推荐
深入剖析软件调试原理..
全方位展示调试技术的威力和魅力
我多么希望这本书是用英文写的!——David Solomon ...

推荐阅读

内容简介回到顶部↑

围绕如何实现高效调试这一主题,本书深入系统地介绍了以调试器为核心的各种软件调试技术。本书共30章,分为6篇。第1篇介绍了软件调试的概况和简要历史。第2篇以英特尔架构(IA)的CPU为例,介绍了计算机系统的硬件核心所提供的调试支持,包括异常、断点指令、单步执行标志、分支监视、JTAG和MCE等。第3篇以Windows操作系统为例,介绍了计算机系统的软件核心中的调试设施,包括内核调试引擎、用户态调试子系统、异常处理、验证器、错误报告、事件追踪、故障转储、硬件错误处理等。第4篇以Visual C/C++编译器为例,介绍了生产软件的主要工具的调试支持,重点讨论了编译期检查、运行期检查及调试符号。第5篇讨论了软件的可调试性,探讨了如何在软件架构设计和软件开发过程中加入调试支持,使软件更容易被调试。在前5篇内容的基础上,第6篇首先介绍了调试器的发展历史、典型功能和实现方法,然后全面介绍了WinDBG调试器,包括它的模块结构、工作模型、使用方法和主要调试功能的实现细节。
本书是对软件调试技术在过去50年中所取得成就的全面展示,也是对作者本人在软件设计和系统开发第一线奋战10多年的经验总结。本书理论与实践紧密结合,选取了大量具有代表性和普遍意义的技术细节进行讨论,是学习软件调试技术的宝贵资料,适合每一位希望深刻理解软件和自由驾驭软件的人阅读,特别是从事软件开发、测试、支持的技术人员和有关的研究人员。

目录回到顶部↑

第1篇 绪论
第1章 软件调试基础
  1.1 简介
  1.2 基本特征
  1.3 简要历史
  1.4 分类
  1.5 调试技术概览
  1.6 错误与缺欠
  1.7 与软件工程的关系
  1.8 本章总结
第2篇 CPU的调试支持
 第2章 CPU基础
  2.1 指令和指令集
  2.2 IA-32处理器
  2.3 CPU的操作模式
  2.4 寄存器
  2.5 理解保护模式
  2.6 段机制
  2.7 分页机制(Paging)
  2.8 系统概貌

前言回到顶部↑

现代计算机是从20世纪40年代开始出现的。当时的计算机比今天的要庞大很多,很多部件也不一样,但是有一点是完全相同的,那就是靠执行指令而工作。.
一台计算机认识的所有指令被称为它的指令集(Instruction Set)。按照一定格式编写的指令序列被称为程序(Program)。在同一台计算机上,执行不同的程序,便可以完成不同的任务,因此,现代计算机在诞生之初常被冠以“通用”字样,以突出其通用性。在获得通用性带来好处的同时,人们也很快意识到了两个严峻的问题:首先是编写程序需要很多时间;其次是程序在执行时很可能出现意料之外的怪异行为。
程序对计算机的重要性和编写程序的复杂性让一些人看到了商机。大约在20世纪50年代中期,专门编写程序的公司出现了。几年后,模仿硬件(Hardware)一词,人们开始使用软件(Software)这个词来称呼计算机程序和它的文档,并把将用户需求转化为软件产品的整个过程称为软件开发(Software Development),将大规模生产软件产品的社会活动称为软件工程(Software Engineering)。
如今,几十年过去了,我们看到的是一个繁荣而庞大的软件产业。但是前面描述的两个问题依然存在:一是编写程序仍然需要很多时间;二是编写出的程序在运行时仍然会出现意料外的行为。而且后一个问题的表现形式越来越多,可能突然报告一个错误,可能给出一个看似正确却并非需要的结果,可能自作聪明地自动执行一大堆无法取消的操作,可能忽略用户的命令,可能长时间没有反应,可能直接崩溃或者永远僵死在那里……而且总是可能有无法预料的其他意外情况出现。这些“可能”大多是因为隐藏在软件中的设计失误而导致的,即所谓的软件臭虫(bug),或者称软件缺陷(defect)。
计算机是在软件指令的控制下工作的,让存在缺陷的软件控制硬件是件危险的事,可能导致惊人的损失和灾难。2003年8月14日发生的北美大停电(Northeast Blackout of 2003)使50万人受到影响,直接经济损失60亿美元,其主要原因是软件缺陷导致报警系统没有报警。1999年9月23日,美国的火星气象探测船因为没有进入预定轨道而受到大气压力和摩擦被摧毁,其原因是不同模块使用的计算单位不同,使计算出的轨道数据出现严重错误。1990年1月15日,AT&T公司的100多台交换机崩溃并反复重新启动,导致6万用户在9个小时中无法使用长途电话,其原因是新使用的软件在接收到某一种消息后会导致系统崩溃,并把这种症状传染给与它相邻的系统。1962年7月22日,水手一号太空船发射293秒后因为偏离轨道而被销毁,其原因也与软件错误有直接关系。类似的故事还有很多,尽管我们不希望它们发生。
一方面,软件缺陷难以避免;另一方面其危害又很大,这使得消除软件缺陷成为软件工程中的一项重要任务。消除软件缺陷的前提是要找到导致缺陷的根本原因。我们把探索软件缺陷的根源并寻求其解决方案的过程称为软件调试(Software Debugging)。
本书的写作目的
在复杂的计算机系统中寻找软件缺陷的根源不是一个简单的任务,需要对软件和计算机系统有深刻的理解,选用科学的方法,并使用强有力的工具。这些正是作者写作本书的初衷。具体来说,写作本书有三个主要目的。
第一,论述软件调试的一般原理,包括CPU、操作系统和编译器是如何支持软件调试的,内核态调试和用户态调试的工作模型,以及调试器的工作原理。软件调试是计算机系统中多个部件之间的一个复杂交互过程,要理解这个过程,必须要了解每个部件在其中的角色和职责,以及它们的协作方式。学习软件调试原理不仅对提高软件工程师的调试技能至关重要,而且有利于提高它们对计算机系统的理解,将计算机原理、编译原理、操作系统等多个学科的知识融会贯通在一起。
第二,探讨可调试性(Debuggability)的内涵和实现软件可调试性的原则和方法。所谓软件的可调试性就是在软件内部加入支持调试的代码,使其具有自动记录、报告和诊断的能力,从而更容易被调试。软件自身的可调试性对于提高调试效率、增强软件的可维护性,以及保证软件的如期交付都有着重要意义。
第三,交流软件调试的方法和技巧。尽管论述一般原理是本书的重点,本书仍穿插了许多实践性很强的内容。包括调试用户态程序和系统内核模块的基本方法,如何诊断系统崩溃(BSOD)和应用程序崩溃,如何调试缓冲区溢出等与栈有关的问题,如何调试内存泄漏等与堆有关的问题。特别是,本书非常全面地介绍了WinDBG调试器的使用方法,给出了大量使用这个调试器的实例。
总之,笔者希望通过本书让读者懂得软件调试的原理,意识到软件可调试性的重要性,学会使用基本的软件调试方法和调试工具,并能应用这些方法和工具解决问题和掌握更多软硬件知识。
本书的读者
首先,本书是写给所有程序员的。程序员是软件开发的核心力量。他们花大量的时间来调试他们所编写的代码,有时为此工作到深夜。笔者希望程序员朋友们读过本书后能提高调试能力,并自觉地在代码中加入调试支持,使调试效率大大提高,减少因为调试程序而加班的次数。本书中关于CPU、中断、异常和操作系统的介绍,是很多程序员需要补充的知识,因为对硬件和系统底层的深刻理解有利于写出更好的应用程序,对于程序员的职业发展也是非常有帮助的。之所以说写给“所有”程序员是因为本书主要讨论的是一般原理和方法,没有限定某种编程语言和某个编程环境,也没有局限于某个特定的编程领域。
第二,本书是写给从事测试、验证、系统集成、客户支持、产品销售等工作的软件工程师或IT工程师的。他们的职责不是编写代码,因此软件缺陷与他们不直接相关,但是他们也经常受累于软件缺陷。他们不负责解决问题,但他们需要知道找谁来解决。因此,他们需要把错误定位到某个模块,或者至少定位到某个软件。本书介绍的工具和方法对于实现这个目标是非常有益的。另外,他们也可以从关于软件可调试性的内容中得到启发。本书关于CPU、操作系统和编译器的内容对于提高他们的综合能力,巩固软硬件知识也是有益的。
第三,本书适合从事反病毒、网络安全、版权保护等工作的技术人员阅读。他们经常面对各种怪异的代码,需要在没有代码和文档的情况下做跟踪和分析。这是计算机领域中最富挑战性的工作之一。关于调试方法和WinDBG的内容有利于提高他们的效率。很多恶意软件故意加入了阻止调试和跟踪的机制,本书介绍的软件调试原理有助于理解这些机制。
第四,本书也适合计算机、软件、自动控制、电子学等专业的研究生或高年级本科生来研读。他们已经学习了程序设计、操作系统、计算机原理等课程,阅读本书可以帮助他们把这些知识联系起来,并深入到一个新的层次。学会使用调试器来跟踪和分析软件,可以让他们在指令一级领悟计算机软硬件的工作方式,深入核心,掌握本质,把学到的书本知识与计算机系统的实际情况结合起来;同时,可以提高他们的自学能力,使他们养成乐于专研和探索的良好习惯。软件调试是从事计算机软硬件开发等工作的一项基本功,在学校里就掌握了这门技术,对于以后快速适应工作岗位是大有好处的。
第五,本书是写给勇于挑战软件问题的硬件工程师和计算机用户的。他们是软件缺陷的受害者。除了要忍受软件缺陷带来的不便之外,有时软件设计者还可能将责任推卸给他们,推诿是硬件问题或使用不当。使用本书的工具和方法,他们可以找到充足的证据来证明这是软件的问题。本书的大多数内容不需要很深厚的软件背景,有基本的计算机知识就可以读懂。
最后,或许还有不属于上面5种类型的读者也可能会阅读本书。比如,软件公司或软件团队的管理者、软件方面的咨询师和培训师、大学和研究机构的研究人员、非计算机专业的学生、自由职业者、编程爱好者、黑客等等。
前面说过,本书的大多数内容不需要深厚的软件开发背景,但如果读者具备以下基础,将更容易读懂和领会本书的内容:

序言回到顶部↑

2007年,我和Raymond(张银奎)第一次在上海见面。他对Windows操作系统的浓厚兴趣给我留下了深刻的印象,他的兴趣遍及有关Windows的所有细节,包括这个产品背后的人们及其演变过程。.
Raymond已经在软件开发岗位工作了十几年。现在他把多年的经验和对Windows操作系统的深刻理解结合起来,创作了这本关于调试的惊世之作。调试是计算机领域中最耗费时间和充满挑战的任务之一,也是许多软件工程师都需要提高的一个领域。
这本书所覆盖主题的广度是惊人的。从最低层硬件对调试的支持落笔,Raymond带你遍历了系统中支持调试的所有层面——从用户态到内核态。此外,他还全面深入地介绍了编译器的调试支持、调试工具和各种基础设施。..
据我多年在VMS操作系统开发团队工作的经验,我发现有些工程师掌握调试技术,而有些工程师并不具备这样的能力。利用可用工具插入合适的断点和分析追踪信息都需要很特殊的技巧。
细细品味这本书,会帮助你获得这些重要的软件开发技巧,增强你控制软件和编写代码的能力。...
我多么希望这本书是用英文写的!
— David Solomon
co-author, Windows Internals (Microsoft Press)
President, David Solomon Expert Seminars, Inc.
www.solsem.com

媒体评论回到顶部↑

Writing software is one thing.Being sure it works as intended is another.Raymond Zhang's new book on software debugging enables us to make that next step with confidence. It will prove invaluable to software engineers. .
-- Professor David J. Hand, Imperial College London
Raymond Zhang has written a thorough and comprehensive guide to software debugging, perhaps the most critical step in any successful software project. He demystifies the subject, moving from essential basics to advanced techniques. This book should be part of every working programmer's library.
-- G. Pascal Zachary, author of " Showstopper: Windows NT and the Next Generation at Microsoft"
In my experience, Raymond Zhang is an extremely accomplished individual who has most graciously provided feedback to me on several of my books, occasionally pointing out instances where I was in error (also very graciously). I'm quite sure that his monumental new book on debugging techniques will prove of great value to the engineering community.
-- Tom Shanley, President of Mindshare
Indeed, a debugger is an essential tool to master if you're going to do any sort of system programming.
-- Matt Pietrek, Under the Hood columnist for MSDN Magazine
调试程序比编写程序更像一门艺术。程序员在调试程序时,想象力的基础是各种调试技术,张银奎先生的这本书系统地介绍了各个层次上的程序调试技术,我相信每一位阅读这本书的程序员都可以丰富自己的调试知识库,从而在实践中碰到程序问题时有更丰富的想象力,快速地“逮”到程序代码中的“臭虫(Bug)”。 ..
——潘爱民,研究员,微软亚洲研究院
感谢张银奎给Syser Debugger开发提供了指导性的意见。张先生这本调试巨著详细介绍了关于软件调试的方方面面,是目前为止软件调试方面的最权威著作之一。相信这本书一定能让各位读者在软件调试和开发方面受益匪浅。这本书应该成为每个软件开发人员的必备宝典。
——吴岩峰、陈俊豪,Syser调试器设计者
调试技术是成为高素质软件开发人员必备的一项关键技术,可惜在中国技术界却没有得到应有的重视。本书秉承了Raymond一贯的技术传播特点与风格:循循善诱,深入底层,切中肯綮,酣畅淋漓。相信本书会成为国内调试技术领域的扛鼎之作,每一位严肃程序员之案头必备。
——李建忠,IT技术作译者,祝成科技培训讲师

书摘回到顶部↑

第1篇 绪论
 第1章 软件调试基础
1955年,一个名叫Computer Usage Corporation(CUC)的公司诞生了,它是世界上第一个专门从事软件开发和服务的公司。CUC公司的创始人是Elmer Kubie和John w Sheldon,他们都在IBM工作过。从当时计算机硬件的迅速发展中,他们看到了软件方面所潜在的机遇。CUC的诞生标志着一个新兴的产业正式起步了。
与其他产业相比,软件产业的发展速度是惊人的。短短50几年后,我们已经难以统计世界上共有多少个软件公司,只知道一定是一个很庞大的数字,而且这个数量还在不断增大。同时,软件产品的数量也达到了难以统计的程度,各种各样的软件已经渗透到人类生产和生活的各个领域,越来越多的人开始依赖软件工作和生活。
与传统的产品相比,软件产品具有根本的不同,其生产过程也有着根本的差异。在开发软件的整个过程中,存在非常多的不确定性因素。在一个软件真正完成之前,很难预计它的完成日期。很多软件项目都经历了多次的延期,还有很多中途夭折。直到今天,人们还没有找到一种有效的方法来控制软件的生产过程。导致软件生产难以控制的根本原因是来源于软件本身的复杂性。一个软件的规模越大,它的复杂度也越高。
简单来说,软件是程序(program)和文档(document)的集合,程序的核心内容便是按一定顺序排列的一系列指令(instruction)。如果把每个指令看作一块积木,那么软件开发就是使用这些积木修建一个让CPU(中央处理器)在其中运行的交通系统。这个系统中有很多条不同特征的道路(函数)。有些道路只允许一辆车在上面行驶,一辆车驶出后另一辆才能进入,有些道路可以让无数辆车同时在上面飞奔。这些道路都是单行道,只可以沿一个方向行驶。在这些道路之间,除了明确的入口(entry)和出口(exit)之外,还可以通过中断和异常等机制从一条路飞越到另一条,另一条又可以飞转到第三条或直接飞回到第一条。在这个系统中行驶的车辆也很特殊,它们速度很快,而且“无人驾驶”,完全不知道会跑到哪里,唯一的原则就是上了一条路便沿着它向前跑……
如果说软件的执行过程就好像是CPU在无数条道路(指令流)间飞奔,那么开发软件的过程就是设计和构建这个交通网络的过程。其基本目标是要让CPU在这个网络中奔跑时可以完成需求(requirement)中所定义的功能。对这个网络的其他要求通常还有可靠(reliable)、灵活(flexible)、健壮(robust)、易于维护(maintainable),可以简单地改造就能让其他类型的车辆(CPU)在上面行驶(portable)……
开发一个满足以上要求的软件系统不是一件简单的事,通常需要经历分析(analysis)、设计(design)、编码(code)和测试(test)等多个环节。通过测试并发布(release)后,还需要维护(maintain)和支持(support)工作。在以上环节中,每一步都可能遇到这样那样的技术难题。
在软件世界中,螺丝刀、万用表等传统的探测和修理工具都不再适用了,取而代之的是以调试器为核心的各种软件调试(Software Debugging)工具。
软件调试的基本手段有断点、单步执行、栈回溯等,其初衷就是跟踪和记录CPU执行软件的过程,把动态的瞬间凝固下来供检查和分析。
软件调试的基本目标是定位软件中存在的设计错误(bug)。但除此之外,软件调试技术和工具还有很多其他用途。比如,分析软件的工作原理,分析系统崩溃,辅助解决系统和硬件问题等。
概而言之,软件是通过指令的组合来指挥硬件,既简单,又复杂,充满神秘与挑战。而软件调试是帮助人们探索和征服这个神秘世界的有力工具。
  第1章 软件调试基础
著名的计算机科学家Brian Kernighan曾经说过,软件调试要比编写代码困难一倍,如果你发挥出了最佳才智编写代码,那么你的智商便不足以调试这个代码。
另一方面,软件调试是软件开发和维护中非常频繁的一项任务,几乎在软件生命周期的每个阶段,都有很多这样那样的问题需要进行调试。
一方面是难度很高,另一方面是任务很多。因此,在一个典型的软件团队中,花费在软件调试上的人力和时间通常是很可观的。据不完全统计,一半以上的软件工程师把一半以上的时间用在软件调试上。很多时候,调试一个软件问题可能就需要几天乃至几周的时间。从这个角度来看,提高软件工程师的调试效率对于提高软件团队的工作效率有着重要意义。
本书旨在从多个角度和多个层次解析软件调试的原理、方法和技巧。在分别深入介绍这些内容之前,本章将做一个概括性的介绍,使读者了解一个简单的全貌,为阅读后面的章节做准备。
  1.1 简介
这一节我们首先给出软件调试的解释性定义,而后介绍软件调试的基本过程。
  1.1.1 定义

【插图】

chatu
评论交流

共有155人开贴评论  344人参与评论  111人参与打分 查看

61人
 54%
用户平均打分
我要写评论 help如何参与评论和打分
23人
 20%
8人
 7%
6人
 5%
13人
 11%

woodhead001

专家级评论员
该会员在china-pub购买过此书 精彩书评
  
该作者发表于:2009-12-23 13:06:00
绝对的一本好书,看了之后对应用程序的运行机理以及其与操作系统的交互都有一个深入的理解,除此之外,还有很多很多平时你的模糊或者灰色地带都会被清除,读过此书你的技术能力会到达一个新的高度,相信看过这本书和正在看这本书的人都会有这样子的感觉,本书的作者是我认为华人圈里最牛B的少数几个人之一,如果非要排名的话应该是执牛耳了。作者对于系统有深入的了解,有深厚的调试功底,但是书的厚度太厚,很难有耐心全部读完,只能便用边看吧。
回复 ( 1条评论-- 点击查看讨论 )
您觉得呢? 送鲜花 (得1支)  扔鸡蛋 (得0个)

dingzhenhhy
一级评论员
该会员在china-pub购买过此书
评价等级:  
发表于:2009-10-9 12:55:00
我是来学习的,作为windows开发人员,这本书教的是如何揪出程序bug;此书教授的调试手段是发现程序bug的最后一道保障。仅此而已!
个人读书的观点:只要从一本本书上学到一点儿(哪怕是一丁点儿而已)值得学的东西就不枉读此书!
回复 ( 1条评论-- 点击查看讨论 )
您觉得呢? 送鲜花 (得2支)  扔鸡蛋 (得1个)

vxer
一级评论员
评价等级:  
发表于:2008-12-14 23:29:00
本书应该改名为 因特尔&微软平台下使用调试工具进行伪调试!!!
软件不等于微软,软件也不等于因特尔。
仅仅介绍了微软操作系统,因特尔32位处理器 使用调试工具进行的所谓调试,严格来说是伪调试,就命名为 软件调试,是否太言过其实了。
另外 调试不等于使用调试工具,就算是调试工具,调试工具也不等于Windbg,难道Softice倒闭了就不值得作者提了?难道TRW就那么烂?
David作序是因为你介绍的是微软吧。

本书深度也不够,比如硬件对调试的支持之类,本书含糊其词。
价格方面不做评价,不过作者频繁将其作品打为满分,缺乏中国人应有的谦虚精神!!!

再接再历!!!!
回复 ( 26条评论-- 点击查看讨论 )
您觉得呢? 送鲜花 (得13支)  扔鸡蛋 (得13个)

yyzjp
一级评论员
该会员在china-pub购买过此书
评价等级:  
发表于:2009-9-10 10:00:00
我还没看完,呵呵,但是其中如何通过WinDBG查看从虚拟内存地址到真实内存地址的小实验很有意思, 简洁易懂,深入浅出。

说什么查MSDN就可以,这书没价值的人很可笑,不懂得尊重别人的人,也得不到别人的一丁点尊重。

我对于作者的一点要求可能就是行文上可以再幽默风趣一点,我感觉侯捷的书就很考究,序做得很吸引人,文风很生动:)
您觉得呢? 送鲜花 (得3支)  扔鸡蛋 (得0个)

junglegq
一级评论员
该会员在china-pub购买过此书 精彩书评
评价等级:  
发表于:2009-6-24 10:52:00
相当全面的一本书,因为是中国人自己写的,语法使用得当,比之大多译作好不知道多少。新版已经把勘误都补了,不错。
内容涵盖丰富,讲解细致,一看就懂。
回复 ( 3条评论-- 点击查看讨论 )
您觉得呢? 送鲜花 (得2支)  扔鸡蛋 (得1个)
我要写评论
查看所有评论交流(共155条)