软件调试

软件调试

计算机知识书籍
《软件调试》系计算机软件工程、开发项目管理类图书,作者:张银奎。2008年6月由电子工业出版社出版发行。本书包括CPU的调试、Windows操作系统中的调试设施、Visual C/C++编译器的调试支持,以及WinDBG调试器主要调试功能的应用实例。Windows操作系统中的调试设施,包括内核调试引擎、用户态调试予系统、验证器、Dr.Watson、WER、ETW、故障转储、WHEA等。本书是对软件调试技术在过去50年中所取得成就的全面展示,也是笔者本人在软件设计和系统开发第一线奋战10多年的经验总结。
    书名:软件调试 别名: 作者:张银奎 类别:软件工程/开发项目管理 原作品: 译者: 出版社:电子工业出版社 页数:1006 定价:128 开本:16 装帧: ISBN: 字数:1200000 ISBN:9787121064074

内容简介

《软件调试》系计算机软件工程、开发项目管理类图书,作者:张银奎。2008年6月由电子工业出版社出版发行。本书包括CPU的调试、Windows操作系统中的调试设施、Visual C/C++编译器的调试支持,以及WinDBG调试器主要调试功能的应用实例。n围绕如何实现高效调试这一主题,本书深入系统地介绍了以调试器为核心的各种软件调试技术。

本书共30章,分为6篇。第1篇介绍了软件调试的概况和简要历史。第2篇以英特尔架构(IA)的CPU为例,介绍了计算机系统的硬件核心所提供的调试支持,包括异常、断点指令、单步执行标志、分支监视、JTAG和MCE等。第3篇以Windows操作系统为例,介绍了计算机系统的软件核心中的调试设施,包括内核调试引擎、用户态调试子系统、异常处理、验证器、错误报告、事件追踪、故障转储、硬件错误处理等。第4篇以Visual C/C++编译器为例,介绍了生产软件的主要工具的调试支持,重点讨论了编译期检查、运行期检查及调试符号。第5篇讨论了软件的可调试性,探讨了如何在软件架构设计和软件开发过程中加入调试支持,使软件更容易被调试。

n在前5篇内容的基础上,第6篇首先介绍了调试器的发展历史、典型功能和实现方法,然后全面介绍了WinDBG调试器,包括它的模块结构、工作模型、使用方法和主要调试功能的实现细节。n本书是对软件调试技术在过去50年中所取得成就的全面展示,也是对作者本人在软件设计和系统开发第一线奋战10多年的经验总结。本书理论与实践紧密结合,选取了大量具有代表性和普遍意义的技术细节进行讨论,是学习软件调试技术的宝贵资料,适合每一位希望深刻理解软件和自由驾驭软件的人阅读,特别是从事软件开发、测试、支持的技术人员和有关的研究人员。

图书目录

第1篇 绪论n第1章 软件调试基础n

1.1 简介n

1.2 基本特征n

1.3 简要历史n

1.4 分类n

1.5 调试技术概览n

1.6 错误与缺欠n

1.7 与软件工程的关系n

1.8 本章总结n

第2篇 CPU的调试支持n

第2章 CPU基础n

2.1 指令和指令集n

2.2 IA-32处理器n

2.3 CPU的操作模式n

2.4 寄存器n

2.5 理解保护模式n

2.6 段机制n

2.7 分页机制(Paging)n

2.8 系统概貌n

2.9 本章总结n

第3章 中断和异常n

3.1 概念和差异n

3.2 异常的分类n

3.3 异常例析n

3.4 中断/异常优先级n

3.5 中断/异常处理n

3.6 本章总结n

第4章 断点和单步执行n

4.1 软件断点n

4.2 硬件断点n

4.3 陷阱标志n

4.4 实模式调试器例析n

4.5 本章总结n

第5章 分支记录和性能监视n

5.1 分支监视概览n

5.2 使用寄存器的分支记录n

5.3 使用内存的分支记录n

5.4 DS示例:CpuWheren

5.5 性能监视n

5.6 本章总结n

第6章 机器检查架构(MCA)n

6.1 奔腾处理器的机器检查机制n

6.2 MCAn

6.3 编写MCA软件n

6.4 本章总结n

第7章 JTAG调试n

7.1 简介n

7.2 JTAG原理n

7.3 JTAG应用n

7.4 IA-32处理器的JTAG支持n

7.5 本章总结n

第3篇 操作系统的调试支持n

第8章 Windows概要n

8.1 简介n

8.2 进程和进程空间n

8.3 内核模式和用户模式n

8.4 架构和系统部件n

8.5 本章总结n

第9章 用户态调试模型n

9.1 概览n

9.2 采集调试消息n

9.3 发送调试消息n

9.4 调试子系统服务器(XP之后)n

9.5 调试子系统服务器(XP之前)n

9.6 比较两种模型n

9.7 NTDLL中的调试支持例程n

9.8 调试API 224n

9.9 本章总结n

第10章 用户态调试过程n

10.1 调试器进程n

10.2 被调试进程n

10.3 从调试器中启动被调试程序n

10.4 附加到已经启动的进程n

10.5 处理调试事件n

10.6 中断到调试器n

10.7 输出调试字符串n

10.8 终止调试会话n

10.9 本章总结n

第11章 中断和异常管理n

11.1 中断描述符表n

11.2 异常的描述和登记n

11.3 异常分发过程n

11.4 结构化异常处理(SEH)n

11.5 向量化异常处理(VEH)n

11.6 本章总结n

第12章 未处理异常和JIT调试n

12.1 简介n

12.2 默认的异常处理器n

12.3 未处理异常过滤函数n

12.4 应用程序错误对话框n

12.5 JIT调试和Dr. Watsonn

12.6 顶层异常过滤函数n

12.7 Dr. Watsonn

12.8 DRWTSN32的日志文件n

12.9 用户态转储文件n

12.10 本章总结n

第13章 硬错误和蓝屏n

13.1 硬错误提示n

13.2 蓝屏终止(BSOD)n

13.3 系统转储文件n

13.4 分析系统转储文件n

13.5 辅助的错误提示方法n

13.6 配置错误提示机制n

13.7 防止滥用错误提示机制n

13.8 本章总结n

第14章 错误报告n

14.1 WER 1.0n

14.2 系统错误报告n

14.3 WER服务器端n

14.4 WER 2.0n

14.5 CERn

14.6 本章总结n

第15章 日志n

15.1 日志简介n

15.2 ELF的架构n

15.3 ELF的数据组织n

15.4 察看和使用ELF日志n

15.5 CLFS的组成和原理n

15.6 CLFS的使用方法n

15.7 本章总结n

第16章 事件追踪n

16.1 简介n

16.2 ETW的架构n

16.3 提供ETW消息n

16.4 控制ETW会话n

16.5 消耗ETW消息n

16.6 格式描述n

16.7 NT Kernel Loggern

16.8 Global Logger Sessionn

16.9 Crimson APIn

16.10 本章总结n

第17章 WHEAn

17.1 目标和架构n

17.2 错误源n

17.3 错误处理过程n

17.4 错误持久化n

17.5 注入错误n

17.6 本章总结n

第18章 内核调试引擎n

18.1 概览n

18.2 连接n

18.3 启用n

18.4 初始化n

18.5 内核调试协议n

18.6 与内核交互n

18.7 建立和维持连接n

18.8 本地内核调试n

18.9 本章总结n

第19章 Windows的验证机制n

19.1 简介n

19.2 驱动验证器的工作原理n

19.3 使用驱动验证器n

19.4 应用程序验证器的工作原理n

19.5 使用应用程序验证器n

19.6 本章总结n

第4篇 编译器的调试支持n

第20章 编译和编译期检查n

20.1 程序的构建过程n

20.2 编译n

20.3 Visual C++编译器n

20.4 编译错误和警告n

20.5 编译期检查n

20.6 标准标注语言n

20.7 本章总结n

第21章 运行库和运行期检查n

21.1 C/C++运行库n

21.2 链接运行库n

21.3 运行库的初始化和清理n

21.4 运行期检查n

21.5 报告运行期检查错误n

21.6 本章总结n

第22章 栈和函数调用n

22.1 简介n

22.2 栈的创建过程n

22.3 CALL和RET指令n

22.4 局部变量和栈帧n

22.5 帧指针省略(FPO)n

22.6 栈指针检查n

22.7 调用协定n

22.8 栈空间的增长和溢出n

22.9 栈下溢n

22.10 缓冲区溢出n

22.11 变量检查n

22.12 基于Cookie的安全检查n

22.13 本章总结n

第23章 堆和堆检查n

23.1 理解堆n

23.2 堆的创建和销毁n

23.3 分配和释放堆块n

23.4 堆的内部结构n

23.5 低碎片堆(LFH)n

23.6 堆的调试支持n

23.7 栈回溯数据库n

23.8 堆溢出和检测n

23.9 页堆n

23.10 准页堆n

23.11 CRT堆n

23.12 CRT堆的调试堆块n

23.13 CRT堆的调试功能n

23.14 堆块转储n

23.15 泄漏转储n

23.16 本章总结n

第24章 异常处理代码的编译n

24.1 概览n

24.2 FS:[0]链条n

24.3 遍历FS:[0]链条n

24.4 执行异常处理函数n

24.5 __try{}__except()结构n

24.6 安全问题n

24.7 本章总结n

第25章 调试符号n

25.1 名称修饰n

25.2 调试信息的存储格式n

25.3 目标文件中的调试信息n

25.4 PE文件中的调试信息n

25.5 DBG文件n

25.6 PDB文件n

25.7 有关的编译和链接选项n

25.8 PDB文件中的数据表n

25.9 本章总结n

第5篇 可调试性n

第26章 可调试性概览n

26.1 简介n

26.2Showstopper和未雨绸缪n

26.3 基本原则n

26.4 不可调试代码n

26.5 可调试性例析n

26.6 与安全、性能和商业秘密的关系n

26.7 本章总结n

第27章 可调试性的实现n

27.1 角色和职责n

27.2 可调试架构n

27.3 通过栈回溯实现可追溯性n

27.4 数据的可追溯性n

27.5 可观察性的实现n

27.6 自检和自动报告n

27.7 本章总结n

第6篇 调试器n

第28章 调试器概览n

28.1 TX-0计算机和FLIT调试器n

28.2 小型机和DDT调试器n

28.3 个人计算机和它的调试器n

28.4 调试器的功能n

28.5 分类标准n

28.6 实现模型n

28.7 经典架构n

28.8 HPD标准n

28.9 本章总结n

第29章 WinDBG及其实现n

29.1 WinDBG溯源n

29.2 C阶段的架构n

29.3 重构n

29.4 调试器引擎的架构n

29.5 调试目标n

29.6 调试会话n

29.7 接收和处理命令n

29.8 本章总结n

第30章 WinDBG用法详解n

30.1 工作空间n

30.2 命令概览n

30.3 用户界面n

30.4 输入和执行命令n

30.5 建立调试会话n

30.6 终止调试会话n

30.7 理解上下文n

30.8 调试符号n

30.9 事件处理n

30.10 控制调试目标n

30.11 单步执行n

30.12 使用断点n

30.13 控制进程和线程n

30.14 观察栈n

30.15 分析内存n

30.16 遍历链表n

30.17 调用目标程序的函数n

30.18 命令程序n

30.19 本章总结n

附录A 示例程序列表n

附录B WinDBG标准命令列表

索引

图书信息

作者: 张银奎着

出 版 社:电子工业出版社

出版时间: 2008-6-1

字数: 1200000

页数: 1006

开本: 16开

I S B N : 9787121064074

分类:图书>> 计算机/网络 >>软件工程/开发项目管理

定价:¥128.00

编辑推荐

ACM院士和调试技术先驱Jack B.Dennis教授做历史回顾计算机和操作系统领域资深专家David A.Solomon撰写序言。调试高手笔耕三载集十余年经验成百万言篇,业内专家鼎力相助,汇五十年精华补软件界空白。

您将学习到:

CPU的调试支持,包括异常、断点、单步执行、分支监视、JTAG、MCE等。

Windows操作系统中的调试设施,包括内核调试引擎、用户态调试予系统、验证器、Dr.Watson、WER、ETW、故障转储、WHEA等。

Visual C/C++编译器的调试支持,包括编译期检查、运行期检查,以及调试符号。

WinDBG调试器的发展历史、模块结构、工作模型、使用方法、主要调试功能的实现细节,以及遍布全书的应用实例。

内核调试、用户态调试、JIT调试、远程调试的原理、实现和用法。异常的概念、分发方法、处理方法(seh、VEH、CppEH),未处理异常,以及编译器编译异常处理代码的方法。

调试符号的作用、产生过程、存储格式和使用方法。栈和堆的结构布局、工作原理和有关的软件问题,包括栈的自动增长和溢出,缓;中区溢出,溢出攻击,内存泄漏,堆崩溃等。

软件的可调试性和提高可调试性的方法。

此外,书中还诠释了很多较难理解的概念,思考了一系列耐人深思和具有普遍意义的问题。本书是对软件调试技术在过去50年中所取得成就的全面展示,也是笔者本人在软件设计和系统开发第一线奋战10多年的经验总结。本书适合每一位希望深刻理解软件和自由驾驭软件的人阅读,不论您是否直接参与软件开发和测试;不论您是热爱软件,还是憎恨软件;不论您是想发现软件中的瑕疵,还是想领略其中蕴含的智慧!

本书直面软件工程中的最困难任务——侦错

围绕软件世界中的最强大工具——调试器

全方位展示了软件调试技术的无比威力和无穷魅力

80个示例程序的源程序文件和项目文件

浏览符号文件的SymView工具

与内核调试引擎对话的KdTalker工具

直接浏览用户态转储文件的UdmpView工具

显示CPU执行轨迹(分支)的Cpuwhere工具

观察IDT、GDT和系统对象的SOZOOmer工具

本书是对软件调试技术在过去50年中所取得成就的全面展示,也是对作者本人在软件设计和系统开发第一线奋战10多年的经验总结。全书共分6篇30章,选取了大量具有代表性和普遍意义的技术细节进行讨论,包括CPU的调试支持、操作系统的调试支持、编译器的调试支持、WinDBG及其实现等,是学习软件调试技术的宝贵资料。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。

图书章节

第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)工作。在以上环节中,每一步都可能遇到这样那样的技术难题。

相关词条

相关搜索

其它词条