第一章 程序调试基础 1
程序查错和科学方法 1
程序调试的过程 2
阶段一:测试 2
阶段二:固定 2
阶段三:局部化 3
阶段四:改正 3
邻近(proximity)原理 4
结论 7
C语言历史和特点 8
第二章 C语言及C程序的测试 8
C程序的测试 10
错误辨识 10
不同错误的衡量尺度 13
独立性的错误 14
查错前的准备 15
测试步骤 15
如何执行测试 15
搜寻与验证 25
结论 26
编译程序和单元 27
第三章 编译期间的错误 27
语法错误:给程序员的一些的忠告 29
集中焦点在有用的错误信息 30
使用Lint软件分析语法 39
把预处理器(preprocessor)当成独立程序 43
了解C语言语法(Syntax) 44
使用人工分解 44
使用语法引导编辑器 45
结论 45
控制流追踪 46
第四章 传统的错误追踪方法 46
方法化的结构语句不是魔术 52
结构函数 52
数据流追踪 53
选择变量 54
使用快照(Snapshots) 54
追踪局部变量 56
结论 61
第五章 调试设施的管理 62
控制追踪输出 62
暂时性开关 64
固件改变 64
设置控制变量 64
里程站计算法 65
函数连续法 66
微因子(Granularity) 69
实用性的变通 70
给读者 71
管理源程序 71
结论 73
第六章 C语言调试难点 74
强类型(Strong typc)与错误寻找 74
灵活性与错误寻找 76
结构差异的一般性影响 77
虚拟机器(Virtual machine) 78
针对虚拟机器的错误 79
指针(Pointer)错误和堆栈(stack) 79
超出范围的下标 82
各种情况 83
未给指针赋初值 83
误写程序代码的指针 87
结论 88
初始化(initialized)内存的好处 89
未分配(unallocated)内存的重要性 89
第七章 固定指针错误 89
使用调试工具初始化未分配的内存 90
产生装入映射表 92
8086地址表示法 95
辨别全局(global)变量 96
使用DEBUG技巧 99
警告 100
构造一个内存初始化的函数 100
加一特殊初始化程序到调用程序 101
堆栈的存取 104
初始化局部变量 104
特殊的装入器 104
自动化局部追踪技术 106
结论 110
第八章 特殊的追踪技巧 111
监视虚拟机器 111
在程序代码区检查核对和(checksum) 111
管理核对和 115
堆栈的回朔(Walk-Back) 116
误写堆栈的指针错误 121
解释堆栈追踪的细节 125
机器层次的追踪 128
追踪准备工作 129
显示某函数的程序代码 130
追踪执行 134
用DEBUG监视局部变量 137
结论 149
第九章 符号调试器 150
Sdb:UNIX的符号调试程序 150
使用sdb 151
命令格式 151
函数和变量定位器 152
显示程序代码的命令 153
显示变量的命令 158
处理断点的命令 163
控制执行的命令 167
直接函数计算 168
监督命令 168
堆栈逆向追踪(169trace back)命令 169
sbd的应用:事后检测 169
sbd的应用:找出误写全局变量区的指针错误 170
sdb的应用:找出误写局部变量区的指针错误 170
Sdb的应用:找出误写返回地址的指针错误 172
Sdb的弱点 179
测试模块 179
其他UNIX支持的调试工具 180
CodeVicw:Microsoft的符号调试程序 181
用户界面 181
CodeView的弱点 186
结论 186
第十章 C语言的编译调试实例 188
概述 188
最经常使用的选择项-c,-o,-LARGE 190
存贮模式 198
指针和整数的大小列表 201
省缺名字列表 202
特殊的关键字 202
XENIX链接编辑器:Id 204
使用链接编辑器 204
链接编辑器选择项 204
可执行的目标代码文件 206
公用变量的分配 206
adb:一个程序调试器 207
启动和停止adb 207
显示指令和数据 209
形成地址 209
退出adb 209
形成表达式 210
选择数据格式 213
使用(=)命令 214
使用(?)和(/)命令 214
一个例子:简单格式化 215
调试程序执行 216
执行一个程序 216
删除断点 218
中止程序 218
单步执行程序 218
用中断和退出键停止程序 218
显示C栈回溯 219
晃示CPU寄存器 219
显示外部变量 220
一个例子:跟踪多个函数 220
使用adb内存映象 223
其它特点 226
在一行中组合命令 226
使用XENIX命令 228
计算数值和显示正文 228
一个例子:显示目录和i节点 229
在文件中确定值的位置 230
写入文件 230
修补二进制文件 230
修改内存 231
结论 231
普遍性的技巧 232
C语言特有的问题 232
复杂的技巧 232
正式的框架 232
回顾 232
第十一章 程序调试技巧的总结 232
奇怪的工作状态 233
附录A 全功能程序调试系统 234
程序员的界面 234
函数界面 234
调用的实例 234
用户界面 235
查错命令 236
机器与编译器相关 239
附录B ctrace公用程序 255
警告 255
各种变化 256