第1章 简介 1
1.1 问题的本质 1
目 录 1
1.2 六种思维方式 2
1.3 软件工程的两个时期 3
1.4 调试及开发方法学 6
1.5 小结 9
第2章 福尔摩斯 11
2.1 前言 11
2.2 侦探的世界观 11
2.3 侦探小说 12
2.4 福尔摩斯的性格特征 12
2.5 福尔摩斯的方法 13
2.6 小结 23
3.2 彼特·温西勋爵的性格特征 25
第3章 彼特·温西勋爵 25
3.1 前言 25
3.3 彼特·温西勋爵的破案方法 27
3.4 小结 35
第4章Professor Solomon 37
4.1 前言 37
4.2Professor Solomon的方法 37
4.3 小结 46
第5章 案例精解系列Ⅰ 48
5.1 案例精解Ⅰ 48
第6章解决数学问题 142
6.1 前言 142
6.2 数学家的世界观 142
6.3 Polya和数学启发法思想 143
6.4 作为数学证据的文章 145
6.5 Schoenfeld和解决数问题 148
6.6 将Schoenfeld方法使用到软件调试 150
6.7 小结 151
第7章调试策略 153
7.1 前言 153
7.2 评价机制 153
7.3 二分查找策略 154
7.4 贪婪搜索策略 154
7.5 宽度优先策略 155
7.6 深度优先搜索策略 157
7.7 程序切片策略 158
7.8 演绎分析策略 158
7.9 归纳分析策略 159
7.10如何选择策略 160
7.11小结 161
8.2 稳定程序 162
8.1 前言 162
第8章 启发式调试方法 162
8.3 创建测试用例 164
8.4 减少必要的输入 166
8.5 问题分类 167
8.6 描述问题 170
8.7 将问题解释给他人听 171
8.8 回想相似的问题 171
8.9绘制图表 172
8.10从既有材料中选择假设 173
8.11小结 174
第9章调试的手段 176
9.1 前言 176
9.2 阅读源代码 177
9.3 编写单元测试 178
9.4 显示变量的值 179
9.5 显示执行情况的信息 181
9.6 显示过程的参数 183
9.7 生成流的跟踪 185
9.8 生成变量的快照 186
9.9 生成内存的转储 188
9.10 强制设置变量值 190
9.11断言假设 191
9.12检查数据结构 192
9.13显示数据结构 193
9.14使用运行时的下标检查 195
9.15使用运行时的栈检查 196
9.16使用运行时的堆检查 198
9.17初始化全局变量 199
9.18初始化本地变量 201
9.19改变存储的类别 202
9.20使用不同的编译器 203
9.21编译为汇编代码 204
9.22在不同的平台上执行 207
9.23小结 208
第10章案例精解系列Ⅱ 209
10.1案例精解2 209
10.2案例精解3 227
第11章安全专家的方式 297
11.1前言 297
11.2安全专家的世界观 297
11.3根本原因分析 297
11.4软件缺陷根本原因 299
11.5原因和事件图 312
11.6故障树分析 313
11.7小结 315
12.1前言 316
12.2心理学家的世界观 316
第12章心理学家的方式 316
12.3人类认识模型 317
12.4定义和分类人类的错误 318
12.5解释错误原因 321
12.6研究回顾 337
12.7小结 348
第13章工程师的方式 352
13.1前言 352
13.2工程师的世界观 352
13.3根据开发阶段分类错误 355
13.4避免开发阶段的错误 359
13.5根据编码规范避免错误 365
13.6建立调试基础 377
13.7小结 379
14.2计算机科学家的世界观 382
14.1前言 382
第14章计算机科学家的方式 382
14.3根据语言形式分类错误 383
14.4根据语言形式探测编程错误 384
14.5静态分析工具 386
14.6动态分析工具 393
14.7分析比较 405
14.8小结 407
第15章回到工作 409
15.1回顾方法 409
15.2度量你的工作 412
15.3浏览我们的Web站点 412
词汇表 414
附录A根本原因检查清单 416
附录B关于调试的书籍 423
附录C推荐软件 432
参考文献 433