第1章 宏观策略 1
第1条:通过事务追踪系统处理所有的问题 1
第2条:在网上确切地查询你所遇到的问题,以寻求解决问题的灵感 4
第3条:确保前置条件与后置条件都能够得到满足 6
第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug 7
第5条:在能够正常运作的系统与发生故障的系统之间寻找差别 9
第6条:使用软件自身的调试机制 13
第7条:试着用多种工具构建软件,并将其放在不同的环境下执行 16
第8条:把工作焦点放在最为重要的问题上 20
第2章 通用的方法与做法 23
第9条:相信自己能够把问题调试好 23
第10条:高效地重现程序中的问题 26
第11条:修改完代码之后,要能够尽快看到结果 29
第12条:将复杂的测试场景自动化 30
第13条:使自己尽可能多地观察到与调试有关的数据 32
第14条:考虑对软件进行更新 34
第15条:查看第三方组件的源代码,以了解其用法 35
第16条:使用专门的监测及测试设备 37
第17条:使故障更加突出 40
第18条:从自己的桌面计算机上调试那些不太好用的系统 42
第19条:使调试任务自动化 44
第20条:开始调试之前与调试完毕之后都要把程序清理干净 46
第21条:把属于同一个类型的所有问题全都修复好 47
第3章 通用的工具与技术 49
第22条:用Unix命令行工具对调试数据进行分析 49
第23条:掌握命令行工具的各种选项及习惯用法 55
第24条:用编辑器对调试程序时所需的数据进行浏览 57
第25条:优化工作环境 59
第26条:用版本控制系统寻找bug发生的原因及经过 64
第27条:用工具监测由多个独立程序所构成的系统 67
第4章 调试器的使用技巧 71
第28条:编译代码时把符号信息包含进来,以便于调试 72
第29条:对代码进行单步调试 76
第30条:设置代码断点和数据断点 77
第31条:了解反向调试功能 80
第32条:查看例程之间的相互调用情况 83
第33条:查看变量及表达式的值,以寻找程序中的错误 84
第34条:了解怎样把调试器连接到正在运行的进程上 87
第35条:了解怎样运用核心转储信息来进行调试 89
第36条:把调试工具设置好 92
第37条:学会查看汇编代码及原始内存 95
第5章 编程技术 100
第38条:对可疑的代码进行评审,并手工演练这些代码 100
第39条:审读代码并与同事讨论 102
第40条:给软件添加调试机制 103
第41条:添加日志语句 107
第42条:对软件进行单元测试 111
第43条:用断言进行调试 114
第44条:改动受测程序,以验证自己的推想 118
第45条:尽量缩小正确范例与错误代码之间的差距 119
第46条:简化可疑代码 120
第47条:将可疑代码改用另外一种编程语言来写 123
第48条:改善可疑代码的可读性与结构 124
第49条:要清除bug的根源,而不仅仅消除其症状 128
第6章 编译时的调试技术 130
第50条:对生成的代码进行检视 130
第51条:使用静态程序分析工具 133
第52条:对项目进行配置,令程序能够以固定的方式构建和执行 138
第53条:对调试所用程序库及构建代码时所应执行的检查进行配置 141
第7章 运行时的调试技术 147
第54条:通过构建测试用例来寻找错误 147
第55条:令软件在遇到问题时尽早退出 151
第56条:检视应用程序的日志文件 152
第57条:对系统和进程所执行的操作进行性能评测 156
第58条:追踪程序的执行情况 160
第59条:使用动态程序分析工具 166
第8章 调试多线程的代码 169
第60条:通过事后调试来分析死锁问题 169
第61条:捕获并重现 176
第62条:用专门的工具来探查死锁与竞争条件问题 180
第63条:把不确定的因素隔离出来,或将其移除 186
第64条:检查资源争用情况,以解决与可伸缩性有关的问题 188
第65条:用性能计数器寻找伪共享问题 191
第66条:考虑用更为高级的抽象机制来重写代码 195
网上资源 203