《软件调试》导读之提纲挈领

拙作《软件调试》出版两个月后,有热心读者建议我讲些阅读这本书的方法。有读者愿意读自己的书,当然是好事,再说读者是客户,他们的意见就是命令,不能怠慢。粗略思考一番,计划先为《软件调试》的每一篇写一个导读短文。总为开篇,今日先谈谈《软件调试》这本书的篇章结构,用软件的术语就是架构,用写作的术语也就是提纲。

从最初的书名说起

早在2003年,我就萌生了写一本关于软件调试的书的念头。但是软件调试是个大话题,有很多东西可以写,必须选择好一个角度才能写出一本好书来。于是我开始搜索当时已经有的书,无论是美国出的,还是英国出的,一共找到了十来本。而后,逐一了解了已有的这些书,归纳了它们的主要内容和特色。

2004年下半年,第一个版本的规划初步成型了,书名叫Advanced System Debugging(《高级系统调试》)(简称ASD)。针对的目标问题是系统级的调试任务,简单理解,就是在系统范围找BUG,是与模块范围内的常规调试相对而言的。在当时的规划书中,我特意从以下四个方面比较了系统调试和常规调试的不同:

Ÿ    Scope

Ø    System wide vs. Module/Product wide

Ÿ    Addressed Issues

Ø    Application or OS Hang/Crash vs. Feature Failure

Ÿ    Source Code

Ø    Not depends on source code vs. Based on source code

Ÿ    Time Frame

Ø    System Debugging is more relevant with issues near or after product deployment

并强调系统调试需要不同的工具,并且更具挑战性:

Ÿ       Addressed issues are more serious

Ø       Hang, Crash, Halt,  auto Restart, etc.

Ÿ       Locate Issues in system wide

Ø       Any component, including hardware, maybe the root cause

Ÿ       Without source code and complete document

Ÿ       Very broad knowledge is needed

Ø       OS, Hardware, Firmware, etc.

当时确定的主要内容有以下几个部分:

(一)调试基础

Ÿ       How debugger works?

Ø       Break, stack trace, memory view, and variable watch

Ÿ       CPU & OS support to Debugging

Ø       Post Mortem (JIT) debug, Attach Debugger

Ÿ       General debug mechanism

Ø       Dump, asserts, event log, and debug outputs

Ÿ       Debugging in software engineering

(二)异常

Ÿ       Understand software and hardware exceptions;

Ÿ       Exception handling mechanism;

Ÿ       What if exceptions uncaught in user mode and kernel mode;

Ÿ       Frequent exceptions.

(三)方法学和工具

Ÿ       Advanced Inspecting

Ø       View system components inside;

Ø  Examine binary (program) files and process;

Ÿ  Advanced Monitoring/Spying

Ø  Monitor system activities and kernel objects;

Ø  Exploring OS boot process;

Ÿ  Advanced Tracing

Ø  Interrupt an application, driver, and OS;

Ø  Skills for WinDbg

(四)蓝屏(BSOD

Ÿ  Why BSOD?

Ÿ  Interpret BSOD

Ø  Illustrate Stop Code one by one

Ÿ  Enable and analyze memory dump

Ÿ  Trace BSOD by WinDbg

Ø  Kernel debugging

Ÿ  Advanced topics about BSOD

Ø  Crash handler

Ø  More serious issues than BSOD

(五)调试实践

Ÿ  User mode debugging practice

Ø  Dr. Watson, MiniDump

Ÿ  Kernel mode debugging practice

Ø  Kernel debug using COM, 1394 and Virtual PC

Ø  Debug driver issues

Ÿ  Debug ACPI issues

Ø  Resolve tough S3/S1 issues by actual sample 

现在回过头来看第一版计划,可以看到,其中包含了大多数后来要写的内容。而且这种从整个计算机系统的角度来着眼的思想一直保持到最后。

2005年时的选题列选单

2005年年初,开始和电子出版社协商出版计划。我开始进一步细化写作内容和篇章结构。于是第一个版本的章节计划产生了,下面是从当时的选题列选单中摘录下来的:

软件调试是软件开发及维护中最重要且最富有挑战性的工作之一,大多数软件工程师都认为他们50%以上的工作时间是用在软件调试上的。但是软件调试无论是在软件工程实践中还是在学术界至今都还没有得到应有的重视,少数效率低下的调试方法仍在普遍使用,如何提高软件调试的效率和增强软件的可调试性还很少得到关注。特别是,纵观浩如烟海的计算机图书世界,目前还找不到一本系统全面阐述软件调试理论和实践的作品。本书正是出于这种考虑,力争填补软件领域和国内外出版界的一大空白。本书本着深入全面和理论与实践并重的原则,多方位的向读者展现软件调试的原理、方法和技巧。全书分为4 篇,18 章。基础篇(1~4 章)除了介绍基本的概念和术语(第1 章)外,系统的阐述了CPU(第2 章)、操作系统(第3 章)和编译器(第4 章)是如何支持软件调试的。开发篇(5~7 章)开创性的提出如何在软件工程的各个环节中,尤其是设计阶段,融入软件调试策略,提高软件的可调试性,以从根本上降低软件调试的复杂度,提高调试效率(第5 章)。该篇不仅全面归纳比较了常用的提高软件可调试性的方法(第6 章),还提出了一些新的模型和实现,有很强的实践参考价值(第7 章)。工具篇(8~12 章)在对各类调试工具进行概括性介绍(第8 章)后,深入的解析了三类常用调试工具的原理和用法以及一批经典工具。第9 章在介绍微软的著名内核调试器WinDbg 的同时,深入地揭示了内核调试的原理(目前还没有一本书包含此内容)。第10 章通过深入解析微软.Net 调试器的源代码,介绍了目前流行的中间/脚本语言(比如.Net Java)调试的原理。第11 章以介绍JTAG 原理为线索,探索了极富挑战性的嵌入式调试领域,介绍了如何调试常见的嵌入式系统(xScale 系统, ARM 系统等)。第12章把近百个经典、小巧、免费的调试工具归纳为几类,对它们做了个大检阅(这些工具是附带光盘工具箱的一部分)。实践篇(13~18 章)首先归纳了被国内外专家普遍认可的一些调试规则和方法(第13 章),然后结合真实的案例,介绍了解决几类难度较大的调试问题的方法和技巧。第14章介绍了远程调试、RPC 调试等用户态调试任务。第15 章在介绍非常热门的 Windows 内核/驱动程序调试的同时,还向读者揭示了如何探索Windows 内核的一些技巧。第16 章全面的探讨了著名的蓝屏崩溃问题。第17 章介绍了如何在没有源代码和文档的情况下定位系统故障。第18 章以最富挑战性的ACPI 问题为例,探讨了如何利用前面介绍的方法和工具解决软件、硬件、固件相结合的棘手问题,并总结全书。

归纳一下,首先当时把要写的内容分为如下四篇:基础篇、开发篇、工具篇和实践篇。另外,将书名从ASD改为《软件调试》。现在看来,这一版本的架构与AWDAdvanced Windows Debugging)颇有相通之处,特别是基础篇和实践篇与AWD的第一篇和第二篇是一个思路。

软件调试的最初300页就是按照以上架构来写作的,写的是上面规划中的第2章和第3章。

重构

动笔后,更深的感觉到写书难。本来计划两个月完成的第2章,写到2005年年底也没完成。又因为春节的大块时间用来探索Windows调试子系统,所以20063月才完成第2章的第一稿。20068月完成了第3章的初稿。这两章完成后,一个明显的问题是这两章的篇幅都很长,第2章有100页,第3章有210多页。这两章的长度让我觉得很不称心,我觉得一章太长,不易于阅读,也不方便编辑和排版。记得当时我还特意找了几本书,在Windows Internals中,有接近和超过100页的两章,第3章系统机制(98页),和第7章内存管理(110页)。

一边写作,一边思考了几周后,我终于下定决心重新组织结构。重构的一个指导思想是更侧重调试原理,将工程实践所需的基础知识和技能融入到原理中去,不再面向问题组织篇章和就事论事 根据这一思想,做了如下几个大的改动:

n  将原来的234章升级为篇,以便更好的组织这些原理性和基础性的内容。

n  砍去实践篇,以便使这本书具有更好的通用性。因为实践篇中本来的内容还是面向问题的,深入讨论其中的每个问题域都可以单独写一本书,如果把这些内容放在同一本书中写,那么很难深入,喜欢一个问题域的读者通常也不需要深入了解另外的问题域。

n  在工具篇中,只集中讨论调试器,去掉本来安排的1012章。

根据以上策略调整后,新的架构便是今天的样子,全书分为6篇,30章。

(全文内容请阅读“《软件调试》导读之提纲挈领”,请点击:/Files/bvbook/软件调试-导读之提纲挈领.pdf

“创业&升职”,请看《走出软件作坊》;

“求职&面试”,请看《编程之美——微软技术面试心得

posted @ 2009-03-10 15:36  博文视点  阅读(444)  评论(0编辑  收藏  举报