目录 3
第Ⅰ部分VB.NET环境中的调试 3
第1章战略性调试问题 3
1.1应用程序的可靠性 3
1.1.1 理解可靠性 4
1.1.2可靠性的衡量 5
1.1.3软件的可靠性设计 6
1.1.4改善软件的可靠性 7
1.2.1理解可用性 8
1.2应用程序的可用性 8
1.2.2可用性的衡量 9
1.2.3 设计软件的可用性 9
1.2.4改善软件的可用性 10
1.3调试复杂系统 10
1.3.1 根据合同构建 11
1.3.2理解通信问题 12
1.3.3 可能的解决方案 13
1.4调试开发人员心理学 13
1.4.1 没有了Edit和Continue 13
1.4.2心理因素 17
1.5 小结 20
1.6轶闻趣事 20
第2章VB.NET语言中的新设计 23
2.1 VB.NET中True的实际值 23
2.2类成员重载 24
2.2.1不确定的重载 24
2.2.2 C#重载及VB.NET重载 25
2.2.3 让C#开发人员为难的重载 27
2.3.1偶然的屏蔽 29
2.3 理解继承问题 29
2.3.2更多的屏蔽问题 30
2 3 3理解等价性 32
2.3.4更好的等价性 35
2.3.5继承和方法的可见性 35
2.3.6遍历继承树 37
2.4其他各种问题 39
2.4.1 开发人员和编译器之间的误解 39
2.4.2 VB.NET与C#之间的混淆 40
2.4.3装箱的危险 42
2.4.4数字不再是数字的情况 43
2.4.5关于NaN的其他问题 47
2.4.5关于Double 49
2.4.6有关Double的问题 49
2.5 小结 50
2.6轶闻趣事 51
第Ⅱ部分调试工具 55
第3章 Visual Studio.NET调试器 55
3.1 Visual Studio调试器简介 55
3.1.1统一用户界面 55
3.1.4高级断点 56
3.1.5应用程序可显示的信息 56
3.1.2各种调试模式 56
3.1 .3 分布式调试 56
3.1.6远程调试 57
3.1.7低级访问 57
3.1.8调试器自动化 57
3.2 Visual Studio调试器的工作机制 57
3.2.1理解DebuggableAttribute类 58
3.2.5 生成配置及其对调试器的影响 59
3.2.4 Visual Studio调试器的作用 59
3.2.3 JIT编译器的作用 59
3.2.2 VB.NET语言编译器的作用 59
3.3 3种调试模式 62
3.3.1 IDE调试 63
3.3.2进程调试 63
3.3.3 JIT调试 66
3 .4 使用Visual Studio调试器IDE 68
3.4.1使用Immediate/Command窗口 68
3.4.2使用Output窗口 70
3.4.3使用Source窗口 71
3.4.4使用断点和Breakpoints窗口 72
3.4.5 使用Watch窗口 77
3.4.6使用QuickWatch窗口 78
3.4.7 使用Locals窗口 79
3.4.8 使用Autos窗口 80
3.4.9使用Me窗口 80
3.4.10使用Call Stack窗口 81
3.4.11使用Modules窗口 82
3.4.12使用Disassembly窗口 83
3.5.1 窗口行为 84
3.5 Visual Studio调试器的IDE问题 84
3.4.13 使用Threads窗口 84
3.4.14使用Running Documents窗口 84
3.5.2解释Chr(0) 85
3.5.3调试器的单步调试 86
3.6 小结 86
3.7轶闻趣事 86
第4章 使用Visual Studio.NET调试器 88
4.1 Visual Studio的准备工作 88
4.1.1 General调试选项 88
4.1.3 Just-In-Time调试选项 90
4.1.2 Edit and Continue选项 90
4.1.4 Native调试选项 91
4.1.5 Project默认选项(只适用于Visual Studio 2003) 91
4.1.6其他有用的Visual Studio设置 92
4.2解决方案的准备工作 92
4.2.1源文件的搜索路径 92
4.2.2符号文件的搜索路径 93
4.2.3解决方案的生成配置 94
4.3 项目准备 94
4.3.2项目的Start选项 95
4.3.1 项目的Build选项 95
4.3.3项目的Optimization选项 96
4.3.4项目的生成配置 97
4.4设置活动调试器进程 98
4.5调试生产应用程序 99
4.6调试符号管理 99
4.6.1应用程序的符号 99
4.6.2 Windows操作系统的符号 99
4.6.4符号服务器 100
4.6.3 Framework SDK的符号 100
4.7 改进JIT调试 101
4.8 处理没有Edit and Continue的情况 102
4.9调试公共中间语言 102
4.10理解代码优化 103
4.10.1优化是敌人 105
4.10.2代码优化测试 105
4.11 小结 106
4.12轶闻趣事 107
5.1.2使用Cordbg 108
5.1.1使用Cordbg的理由 108
5.1 Cordbg:控制台调试器 108
第5章其他调试工具 108
5.2 Dbgclr:GUI调试器 110
5.3 Ildasm:查看CIL 111
5.3.1 Visual Studio中的Ildasm 111
5.3.2从命令行调用Ildasm 111
5.3.3研究Ildasm代码 112
5.4性能监视器:查看性能信息 118
5.5 ADepends:查看程序集依赖关系 121
5.6.1 Visual Studio中的PermView 122
5.6 PermView:查看程序集权限 122
5.6.2从命令行调用PermView 123
5.6.3研究权限 123
5.7小结 127
5.8轶闻趣事 127
第6章跟踪和检测 130
6.1 有用的诊断信息 130
6.1.1应用程序的最终用户 130
6.1.4诊断的类别 131
6.1.3应用程序的开发团队 131
6.1.2应用程序的支持团队 131
6.1.5设计建议 132
6.2 VB.NET跟踪 132
6.2.1第1步:创建跟踪 133
6.2.2第2步:激活跟踪 136
6.2.3 第3步:监听跟踪 137
6.2.4第4步:编译时的跟踪控制 144
6.2.5第5步:运行时的跟踪控制 148
6.2.6有关跟踪的小结 150
6.3 使用Debug类 151
6.4使用定制的性能计数器 152
6.4.1创建定制的性能计数器 152
6.4.2操纵性能计数器的实例 153
6.5 小结 154
6.6轶闻趣事 154
第Ⅲ部分调试应用程序 159
第7章Windows Forms调试 159
7.1调试Windows Forms应用程序 159
7.1.2中断至应用程序 160
7.1.1 生成应用程序 160
7.1.4考查程序状态 161
7.1.3命中断点 161
7.1.5查找Bug 163
7.1.6棘手的调试情形 164
7.2调试其他的Windows Forms应用程序 166
7.2.1 调试类库 166
7.2.2调试Windows Forms控件 167
7.2.3 调试Visual Studio插件 169
7.4轶闻趣事 170
7.2.4调试控件设计器 170
7.3 小结 170
第8章Web服务调试 172
8.1 调试ASP.NET工作进程 172
8.2 调试准备 173
8.3使用Web浏览器进行调试 174
8.4 使用SOAP客户端进行调试 177
8.5调试客户端代理 179
8.7调试已部署的Web服务 180
8.6调试远程Web服务 180
8.8处理Web服务故障 181
8.8.1理解Web服务的异常信息流 181
8.8.2改进Web服务异常 182
8.8.3隐藏异常细节 185
8.8.4诱捕未经处理的异常 187
8.9 跟踪SOAP消息 188
8.9.1 构造SoapMonitor的SOAP扩展 188
8.9.2创建SoapMonitor属性 192
8.9.3 全部组合起来 193
8.9.4客户端的SOAP记录 195
8.10跟踪和检测 197
8.11 小结 197
8.12轶闻趣事 197
第9章 ASP.NET调试 199
9.1 IIS调试考虑事项 199
9.1.1 使用IIS 5.x进行同时调试 199
9.1.2使用IIS 6.0进行同时调试 200
9.1.3 IIS 5.x的进程回收 200
9.1.5 URLScan、IIS和DEBUG谓词 201
9.1.4 IIS 6.0中的进程回收 201
9.1.6 IIS身份验证 202
9.1.7多线程考虑事项 203
9.1.8生产调试 203
9.2 调试准备 203
9.2.1用户账户权限 203
9.2.2远程服务器调试 205
9.2.3 IE的配置 205
9.2.4应用程序配置 206
9.3 调试AspNetDebugDemo应用程序 208
9.3.1 ASP.NET错误处理 210
9.3.2不进行错误处理 210
9.3.3程序级的错误处理 211
9.3.4页面级错误处理 212
9.3.5 应用程序级错误处理 213
9.4 使用ASP.NET跟踪 215
9.4.1 页面级跟踪 215
9.4.2 应用程序级跟踪 217
9.5 小结 219
9.6轶闻趣事 220
10.1 调试ServiceAdmin服务 221
10.1.1 调试准备 221
第10章Windows服务调试 221
10.1.2使用进程附加进行调试 223
10.1.3从Visual Studio附加 223
10.1.4确保调试设置的正确性 224
10.1.5调试不需要安装的服务 224
10.1.6调试OnStart方法 225
10.2调试安装问题 226
10.4小结 227
10.3注意事项 227
10.5轶闻趣事 228
第11章 VB.Classic应用程序调试 229
11.1 VB.Classic版本 229
11.2托管代码和非托管代码 229
11.3 使用VB 6.0组件的VB.NET应用程序 230
11.3.1 VB.Classic的准备工作 231
11.3.2VB.NET的准备工作 232
11.3.3 调试第一个COM Interop应用程序 233
11.3.4调试技巧 233
11.3.5 使用VB 6.0调试器 234
11.4.1VB.NET的准备工作 235
11.4 使用VB.NET组件的VB 6.0应用程序 235
11.4.2 VB.Classic的准备工作 236
11.4.3 调试第二个COM Interop应用程序 237
11.5 克服COM版本控制问题 238
11.6小结 241
11.7轶闻趣事 241
第12章 SQL Server调试 243
12.1 调试需求 243
12.3 权限和sp_sdidebug 244
12.2调试组件的安装 244
12.4远程调试权限 245
12.5 使用Visual Studio直接进行调试 246
12.6使用Query Analyzer直接进行调试 248
12.7应用程序调试 248
12.7.1 应用程序调试安装 249
12.7.2从Visual Studio中进行应用程序调试 250
12.7.3从Visual Studio之外进行应用程序调试 252
12.8 SQL调试限制 253
12.9 理解SQL安全性 254
12.10小结 255
12.11 轶闻趣事 255
第Ⅳ部分调试常见情况 261
第13章错误处理和异常管理 261
13.1异常与错误 261
13.2错误处理需求 262
13.2.1最终用户需求 262
13.2.2操作支持需求 263
13.2.3 开发人员需求 264
13.2.4对异常进行日志记录 265
13.3异常和异常管理 266
13.3.1 System.Exception类 266
13.3.2 Try…Catch…Finally 267
13.3.3 Try…Catch…Finally机制 268
13.3.4 正确使用Try…Catch…Finally 269
13.3.5构建定制的异常 279
13.3.6调试异常 286
13.3.7处理未处理异常 289
13.3.8异常管理应用程序块 299
13.3.9分析异常行为 300
13.3.10异常示例解决方案 301
13.4 小结 301
13.5 轶闻趣事 302
第14章调试多线程应用程序 305
14.1 多线程基础 305
14.1.1 为什么多线程如此难 306
14.1.2多线程的优点 307
14.1.3 多线程的缺点 307
14.2多线程问题 308
14.2.1理解数据争用 309
14.2.2理解进程死锁 313
14.2.3理解进程活锁 318
14.2.4理解线程饿死 319
14.3 ThreadMonitor应用程序 322
14.4 WindowsForms中的多线程 326
14.5处理线程失败 330
14.5.1 处理线程异常 330
14.5.2终止托管线程 331
14.7轶闻趣事 332
14.6 小结 332
第15章调试分布式系统 334
15.1理解分布式应用程序 334
15.1.1 处理失败 334
15.1.2处理状态 337
15.1.3 理解消息的语义 338
15.1.4处理有漏洞的抽象 338
15.2远程调试简介 339
15.3 远程调试准备 339
15.3.1 安装远程调试 340
15.3.2只安装本机远程调试 341
15.3.3安装完全远程调试 342
15.3.4远程调试限制 342
15.4 HeartbeatMonitor应用程序 343
15.4.1 HeartbeatMonitor简介 343
15.4.2安装HeartbeatMonitor 344
15.4.3 调试HeartbeatMonitor 346
15.5监控分布式应用程序 348
15.6小结 350
15.7轶闻趣事 350