本书主要讲解Windows高级调试思想和工具,并涉及一些高级调试主题。本书内容主要包括:工具简介、调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础以及应用程序验证器的测试设置等。本书内容详实、条理清楚。.\r\n
本书适合Windows开发人员、Windows测试人员和Windows技术支持人员等参考。..\r\n
对Windows开发人员来说,很少有任务比调试程序更具挑战性和重要性。然而,人们却往往很难获得一些关干调试技术的可靠而又实用的信息。现在,两位来自Microsoft的系统级开发工程师,带着他们15年的实践经验,为读者全面而系统地揭示了Windows调试技术。\r\n
Mario Hewardt和Daniel Pravat介绍了在应用程序的整个生命周期内需要使用到的各种调试技术,并且展示了如何有效地使用Microsoft提供的强大调试器和第三方解决方案。\r\n
为了使你尽快地找到切实可行的解决方案,本书内容围绕真实的调试场景来组织,并且通过代码示例来讲解和分析专业开发人员所要面对的各种调试问题。作者还介绍了一些新兴的调试主题,例如Windows操作系统的核心概念、安全。Windows Vista以及64位调试等,每个主题都包含细致入微的阐述。\r\n
读完本书,你将能够\r\n
·掌握当今最强大的Windows调试工具,包括NTSD、CDB、WinDbg、KD以及ADPlus等。\r\n
·对没有针对调试进行优化的代码进行调试。\r\n
·理解调试器的”内幕”并高效地管理符号文件和源文件。\r\n
·调试与栈和堆相关的复杂内存破坏问题。\r\n
·解决复杂的安全问题。\r\n
·调试跨进程问题:身份跟踪,RPC调试扩展,以及通过Wireshark来跟踪IPC。\r\n
·找出并修复资源泄漏,例如内存泄漏和句柄泄漏。\r\n
·调试常见的线程同步问题。\r\n
·学习如何编写定制的调试扩展。\r\n
·通过故障转储来执行”事后调试”,并与Windows错误报告机制集成起来。\r\n
·通过DebugDiag和调试命令Analyze来自动化调试过程。\r\n
无论你是系统层开发人员,还是应用层开发人员,本书都将使你深入理解Windows中的各种调试技术。本书或许在下一个项目中就可以帮你节省数周的工作时间。...
目录
译者序
序言 10
前言 11
作译者简介 18
第1章 工具简介 20
1.1 泄漏诊断工具 20
Microsoft Detours库 22
1.2 Windows调试工具集 22
1.3 UMDH 24
1.4 Microsoft 应用程序验证器 24
1.5 全局标志 28
1.6 进程浏览器 32
1.7 Windows驱动程序开发包 33
1.8 Wireshark 35
1.9 DebugDiag 36
1.10 小结 36
第2章 调试器简介 37
2.1 调试器的基础知识 37
2.1.1 调试器类型 38
2.1.2 调试命令 39
2.1.3 调试器的配置 40
2.1.4 通过内核态调试器重定向用户态调试器 44
2.1.5 是否使用KD? 46
2.2 基本的调试任务 47
2.2.1 键入调试命令 47
2.2.2 解析调试器的提示信息 47
2.2.3 配置和使用符号 48
2.2.4 使用源文件 56
2.2.5 分析命令 57
2.2.6 修改上下文的命令 69
2.2.7 其他的辅助命令 73
2.2.8 示例 75
2.3 远程调试 76
2.3.1 Remote.exe 76
2.3.2 调试服务器 76
2.3.3 进程服务器与内核服务器 78
2.3.4 远程调试中的符号解析 79
2.3.5 远程调试中的源代码解析 80
2.4 调试场景 80
2.4.1 调试非交互式的进程(服务或者COM服务器) 81
2.4.2 在没有内核态调试器的情况下调试非交互式进程(服务或者COM服务器) 82
2.5 小结 82
第3章 调试器揭密 84
3.1 用户态调试器的内幕 84
3.1.1 操作系统对用户态调试器的支持 84
3.1.2 调试事件的顺序 87
3.1.3 控制来自调试器的异常和事件 88
3.1.4 内核态调试器中的调试事件处理 105
3.2 控制调试目标 106
3.2.1 断点的工作原理 106
3.2.2 内存访问断点的工作原理 107
3.2.3 处理器跟踪 108
3.2.4 实时调试中的线程状态管理 108
3.2.5 通过用户态调试器来暂停线程 110
3.3 小结 111
第4章 符号文件与源文件的管理 112
4.1 调试符号的管理 112
4.1.1 公有符号的生成 112
4.1.2 在符号库中存储符号 114
4.1.3 在HTTP服务器上共享公有符号 115
4.2 源文件的管理 116
4.2.1 收集源文件信息 116
4.2.2 源文件信息的使用 117
4.2.3 不带源文件修订控制的源文件服务器 118
4.3 小结 119
第2部分 调试实践 121
第5章 内存破坏之一——栈 121
5.1 内存破坏的检测过程 122
5.1.1 步骤1:状态分析 122
5.1.2 步骤2:源代码分析 123
5.1.3 步骤3:使用内存破坏检测工具 125
5.1.4 步骤4:调整源代码 125
5.1.5 步骤5:定义回避策略 126
5.2 栈内存破坏 126
5.2.1 栈溢出 134
5.2.2 异步操作与栈顶指针 138
5.2.3 调用约定的不匹配 143
5.2.4 回避策略 149
5.3 小结 151
第6章 内存破坏之二——堆 152
6.1 什么是堆? 152
6.1.1 前端分配器 153
6.1.2 后端分配器 154
6.2 堆破坏 164
6.2.1 使用未初始化状态 164
6.2.2 堆的上溢与下溢 166
6.2.3 堆句柄的不匹配 171
6.2.4 重用已删除的堆块 173
6.3 小结 178
第7章 安全 179
7.1 Windows中的安全 179
7.1.1 安全标识符 180
7.1.2 访问控制列表 181
7.1.3 安全描述符 182
7.1.4 访问令牌 183
7.2 安全信息的来源 184
7.2.1 访问令牌 184
7.2.2 安全描述符 185
7.3 如何执行安全检查? 186
7.4 在客户/服务器程序中传播标识 186
7.4.1 远程认证与安全支持提供者接口 187
7.4.2 模拟级别 188
7.5 系统边界上的安全检查 188
7.6 安全故障的分析 189
7.6.1 本地安全故障 189
7.6.2 延迟初始化中的安全问题 191
7.6.3 身份模拟的潜在安全问题 194
7.6.4 分布式COM错误 194
7.6.5 扩展命令!token的故障 201
7.6.6 在Windows XP XP2上安装了某个程序后发生DCOM激活故障 202
7.6.7 通过跟踪工具来分析安全故障 204
7.7 小结 206
第8章 进程间通信 207
8.1 通信机制 207
8.2 本地通信分析 209
8.2.1 LPC的背景知识 209
8.2.2 调试LPC通信 210
8.2.3 调试本地DCOM以及MSRPC通信 211
8.3 远程通信分析 214
8.3.1 RPC故障测定状态信息的使用 214
8.3.2 网络流量分析 222
8.3.3 打破调用路径 228
8.4 一些其他的技术信息 229
8.4.1 远程认证 229
8.4.2 PRC扩展错误信息 230
8.4.3 其他工具 230
8.5 小结 231
第9章 资源泄漏 231
9.1 什么是资源泄漏? 231
9.2 高层过程 232
9.2.1 步骤1:找出潜在的资源泄漏 232
9.2.2 步骤2:什么东西正在泄漏? 234
9.2.3 步骤3:初步分析 235
9.2.4 步骤4:资源泄漏检测工具 235
9.2.5 步骤5:制定回避策略 236
9.3 资源泄漏的可重现性 236
9.4 句柄泄漏 237
9.4.1 存在泄漏的程序 238
9.4.2 步骤1和步骤2:它是不是一个句柄泄漏? 238
9.4.3 步骤3:初始分析 240
9.4.4 更复杂的程序 241
9.4.5 步骤4:利用泄漏检测工具 244
9.4.6 句柄注入与!htrace 246
9.4.7 步骤5:为句柄泄漏制定回避策略 248
9.5 内存泄漏 248
9.5.1 一个简单的内存泄漏 250
9.5.2 步骤1和步骤2:是否存在泄漏,以及泄漏的是什么资源? 250
9.5.3 步骤4:使用内存检测工具 252
9.5.4 步骤5:回避策略 262
9.6 小结 263
第10章 同步 263
10.1 同步的基础知识 264
10.1.1 事件 264
10.1.2 临界区 266
10.1.3 互斥体 268
10.1.4 信号量 269
10.2 高层流程 270
10.2.1 步骤1:识别问题的征兆 270
10.2.2 步骤2:转储出所有线程 271
10.2.3 步骤3:分析线程中的同步问题 271
10.2.4 步骤4:修复问题 272
10.2.5 步骤5:制定回避策略 272
10.3 同步情况 272
10.3.1 死锁 273
10.3.2 第1种孤立临界区情况——异常 275
10.3.3 第2种孤立临界区情况——线程结束 277
10.3.4 DllMain函数的注意事项 279
10.3.5 锁竞争 283
10.3.6 管理临界区 287
10.4 小结 289
第三部分 高级主题 289
第11章 编写定制的调试扩展 289
11.1 调试扩展简介 290
11.2 调试扩展示例 290
11.2.1 调试扩展模型 293
11.2.2 调试扩展示例的需求 295
11.2.3 头文件和代码组织 296
11.2.4 调试扩展的初始化 297
11.2.5 调试会话状态的变化 300
11.2.6 KnowStructOutput 301
11.2.7 退出调试扩展 301
11.2.8 Help命令的实现 301
11.2.9 dumptree命令的实现 302
11.2.10 KnownStructOutput函数的实现 304
11.2.11取消命令的实现 305
11.2.12 版本 306
11.2.13 调试扩展的构建 307
11.3 小结 307
第12章 64位调试 309
12.1 Microsoft 64位系统 309
12.1.1 操作系统简介 309
12.1.2 在WOW64中运行的32位程序 311
12.2 Windows x64带来的变化 314
12.2.1 第1章——调试工具简介 314
12.2.2 第2章——调试器简介 315
12.2.3 第3章——调试器揭密 322
12.2.4 第5章——内存破坏之一——栈 324
12.2.5 第6章 内存破坏之二——堆 324
12.2.6 第7章——安全 324
12.2.7 第8章——进程间通信 325
12.2.8 第11章——编写定制的调试扩展 326
12.3 小结 326
第13章 事后调试 326
13.1 转储文件基础 327
13.1.1 通过调试器来生成转储文件 328
13.1.2 通过ADPlus来生成转储文件 331
13.1.3 内核态转储文件的创建 333
13.2 转储文件的使用 335
13.2.1 转储文件的分析:访问违例 335
13.2.2 转储文件的分析:句柄泄漏 336
13. 3 Windows错误报告 338
13.3.1 Dr.Watson 339
13.3.2 Windows错误报告的系统架构 343
13.4 企业错误报告 358
13.4.1 设置企业错误报告 358
13.4.2 通过企业错误报告来报告错误 361
13.5 小结 363
第14章 一些功能强大的工具 364
14.1 调试诊断工具 364
14.1.1 分析内存泄漏或者句柄泄漏 365
14.1.2 编写定制的分析脚本 367
14.2 扩展命令!analyze 368
14.2.1 故障程序 369
14.2.2 分析结果 369
14.2.3 故障的跟进人员 372
14.3 小结 372
第15章 Windows Vista 基础 373
15.1 第1章——调试工具简介 373
Windows调试日志 374
15.2 第2章——调试器简介 374
15.2.1 用户访问控制的副作用 375
15.2.2 启用内核态调试器 377
15.2.3 地址空间布局的随机化 377
15.3 第6章——内存破坏之2——堆 378
15.4 第7章——安全性 381
15.4.1 用户访问控制 382
15.4.2 调试器中的UAC 383
15.4.3 注册表和文件虚拟化 385
15.5 第8章——进程间通信 387
RPC和DCOM协议的变化 387
15.6 第9章——资源泄漏 387
15.7 第10章——同步 387
15.7.1 轻量读写锁 388
15.7.2 条件变量 388
15.7.3 单次初始化 389
15.7.4 增强线程池 389
15.8 第11章——编写定制的调试扩展 390
15.9 第13章——事后调试 390
15.10 小结 393
附录A 应用程序验证器的测试设置 394
Exceptions(异常) 394
Handles(句柄) 394
Memory 403
ThreadPool 406
TLS 407
InteractiveServices 410
DangerousAPIs 415
DirtyStacks 416
TimeRollOver 416
PrintAPI和PrintDriver 416
(美)Mario Hewardt;Daniel Pravat
无封面