第一部分背景
第1章Windows软件开发3
1.1Windows发展过程3
1.1.1Windows版本历史3
1.1.2支持的CPU架构4
1.1.3Windows版本特*5
1.1.4Windows服务术语5
1.2Windows架构6
1.2.1内核态与用户态6
1.2.2用户态系统进程7
1.2.3用户态应用进程8
1.2.4低级别的Windows通信机制11
1.3Windows开发人员接口13
1.3.1开发人员文档*源13
1.3.2WDM、KMDF和UMDF14
1.3.3NTDLL和USER32层14
1.3.4Win32API层15
1.3.5C*M层*5
1.3.6CLR(.NET)层20
1.4微软开发工具22
1.4.1Windows驱动程序开发工具包(WDK)23
1.4.2Windows软件开发工具包23
1.5小结23
第二部分调试的乐趣和好处
第2章入门27
2.1调试工具介绍27
2.1.1获取Windows调试器软件包27
2.1.2获取VisualStudi*调试器3*
2.1.3WinDbg和VisualStudio调试器对比31
2.2用户态调试32
2.2.1使用WinDbg调试你的个程序32
2.2.2列举局部变量和函数参数值39
2.2.3WinDbg中的源码级调试43
2.2.4符号文件、服务器和本地缓存44
2.2.5WinDbg符号离线缓存45
2.2.6WinDbg中符号解析问题的故障排除46
2.2.7名称修饰注意事项46
2.2.8获取WinDbg命令的帮*48
2.3内核态调试49
2.3.1你的个(实时)内核态调试会话50
2.3.2使用物理机建立一个内核态调试环境55
2.3.3使用虚拟机设置内核态调试环境60
2.3.4诊断主机/目标机通信问题62
2.3.5理解KD中断序列63
2.3.6在内核态调试器中控制目标机64
2.3.7在内核态调试器中设置代码断点66
2.3.8获取WinDbg内核态调试命令的帮*68
2.4小结68
第3章Windows调试器是如何工作的70
3.1用户态调试70
3.1.1架构概述70
3.1.2Win32调试API71
3.1.3调试事件和异常72
3.1.4中断序列75
3.1.5设置代码断点76
3.1.6观察WinDbg中的代码断点插入77
3.2内核态调试81
3.2.1架构概述81
3.2.2设置代码断点82
3.2.3*步执行目标82
3.2.4切换当前进程上下文83
3.3托管代码调试84
3.3.1架构概述85
3.3.2SOSWindows调试器扩展87
3.4脚本调试92
3.4.1架构概述92
3.4.2在VisualStudio中调试脚本93
3.5远程调试95
3.5.1架构概述95
3.5.2WinDbg中的远程调试96
3.5.3VisualStudio中的远程调试99
3.6小结101
第4章事后调试102
4.1实时调试102
4.1.1你的个实时调试实验102
4.1.2实时调试是如何工作的105
4.1.3使用VisualStudio作为实时调试器108
4.1.4运行时断言和实时调试113
4.1.5会话0中实时调试113
4.2转储调试114
4.2.1用户态转储文件自动生成114
4.2.2使用WinDbg调试器分析崩溃转储文件117
4.2.3使用VisualStudio分析崩溃转储文件123
4.2.4手动生成转储文件124
4.2.5“时间旅行”调试125
4.2.6内核态事后调试126
4.3小结128
第5章基础扩展130
5.1非侵入式调试130
5.2数据断点132
5.2.1深度分析用户态和内核态数据断点133
5.2.2清除内核态数据断点135
5.2.3执行数据断点与代码断点136
5.2.4用户态调试器数据断点操作:C 全局对象和C运行时库137
5.2.5内核态调试器数据断点操作:等待进程退出139
5.2.6不错例子:谁在修改注册表值141
5.3调试器脚本145
5.3.1使用调试器脚本重放命令145
5.3.2调试器伪寄存器146
5.3.3在调试器脚本中解析C 模板名称148
5.3.4脚本实践:在内核调试器中列举Windows服务进程149
5.4WOW64调试150
5.4.1WOW64环境150
5.4.2WOW64进程调试151
5.5Windows调试钩子(G**A*S)154
5.5.1系统级与进程相关的NT全局标志154
5.5.2G**A*S工具155
5.5.3调试器扩展命令!g**a*157
5.5.4用户态调试器对NT全局标志值的影响159
5.5.5映像文件执行*项钩子159
5.6小结159
第6章代码分析工具161
6.1静态代码分析161
6.1.1使用VC 静态代码分析捕获你的个崩溃错误161
6.1.2SAL注释164
6.1.3**静态分析工具167
6.2运行时代码分析169
6.2.1使用应用程序验*器工具捕获你的个错误170
6.2.2幕后花絮:操作系统中支持的校验器172
6.2.3调试扩展命令!avrf176
6.2.4应用程序校验器作为质量保*工具179
6.3小结179
第7章专家调试技巧181
7.1基本技巧181
7.1.1等待一个调试器附加到目标182
7.1.2加载DLL时中断184
7.1.3调试进程启动188
7.1.4调试子进程194
7.2更多有用的技巧203
7.2.1调试错误代码故障203
7.2.2在次异常通知时中断209
7.2.3冻结线程210
7.3内核态调试技巧212
7.3.1在用户态进程创建时中断212
7.3.2调试用户态进程启动215
7.3.3加载DLL时中断216
7.3.4未处理SEH异常时中断217
7.3.5冻结线程218
7.4小结220
第8章常见调试场景·部分222
8.1调试非法访问222
8.1.1理解内存非法访问222
8.1.2调试扩展命令!analyze223
8.2调试堆破坏225
8.2.1调试本地堆破坏225
8.2.2调试托管(GC)堆破坏233
8.3调试栈破坏241
8.3.1基于栈的缓冲区溢出242
8.3.2在栈破坏分析中使用数据断点243
8.3.3重构损坏栈的调用帧244
8.4调试栈溢出246
8.4.1理解栈溢出246
8.4.2调试命令kf247
8.5调试句柄泄露248
8.5.1句柄泄露例子249
8.5.2调试扩展命令!htrace250
8.6调试用户态内存泄露254
8.6.1使用应用程序验*器工具检测*源泄露254
8.6.2使用UMDH工具分析内存泄露257
8.6.3扩展策略:栈跟踪数据库的自定义引用260
8.7调试内核态内存泄露262
8.7.1内核内存基础知识262
8.7.2使用PoolTagging调查内核态泄露263
8.8小结266
第9章常见调试场景·第2部分268
9.1调试*源竞争268
9.1.1共享状态一致*错误269
9.1.2共享状态生命周期管理错误273
9.1.3DLL模块生命周期管理错误281
9.2调试死锁284
9.2.1(锁顺序)Lock-Ordering死锁285
9.2.2逻辑死锁288
9.3调试访问检查问题292
9.3.1基本的NT安全模型292
9.3.2WindowsVista的改进297
9.3.3结束300
9.4小结301
第10章调试系统内部机制302
10.1Windows控制台子系统302
10.1.1printf背后的魔力302
10.1.2WindowsUI事件的处理309
10.1.3Ctrl C信号的处理309
10.2系统调用剖析314
10.2.1用户态一侧的系统调用315
10.2.2转换到内核态317
10.2.3内核态一侧的系统调用318
10.3小结319
第三部分观察和分析软件的行为
第11章Xperf介绍323
11.1获取Xperf323
11.2你的个Xperf调查327
11.2.1制定一个调查策略328
11.2.2收集场景的ETW跟踪328
11.2.3分析收集到的ETW跟踪329
11.3Xperf的优点和局限*339
11.4小结339
第12章ETW内幕341
12.1ETW架构341
12.1.1ETW设计原则342
12.1.2ETW组件342
12.1.3特殊的NT内核日志记录会话343
12.1.4使用Xperf配置ETW会话344
12.2Windows系统现有的ETW检测347
12.2.1Windows内核中的检测347
12.2.2**Windows组件中的检测350
12.3理解ETW的Stack-Walk事件355
12.3.1启用和查看*核提*者事件的栈跟踪355
12.3.2启用和查看用户提供者事件的栈跟踪358
12.3.3诊断ETW栈跟踪问题359
12.4在你的代码中添加ETW记录363
12.4.1ETW事件剖析364
12.4.2使用ETWWin32API记录事件367
12.5在ETW中跟踪引导过程370
12.5.1在*导过程*记录*核提*者事件371
12.5.2在*导过程*记录用户提供者事件373
12.6小结375
第13章常见的跟踪场景376
13.1分析阻塞时间376
13.1.1ETW的CSwitch和ReadyThread事件377
13.1.2使用VisualStudi*20*0实施等待分析379
13.1.3使用Xperf实施等待分析384
13.2分析内存使用389
13.2.1分析目标进程中不错别的内存使用390
13.2.2分析NT堆内存使用391
13.2.3分析GC堆(.NET)内存使用395
13.3跟踪作为一个调试辅*403
13.3.1跟踪错误代码失败403
13.3.2跟踪系统内部机制407
13.4小结413
附录AWinDbg用户态调试快速启动415
附录BWindows内核态调试快速启动428
· · · · · · (
收起)
3 有用 杨麦田 2023-01-09 23:57:31 广东
译者会让你怀疑自己到底懂不懂中文。 “私用位员组”,直接把工作多年的程序员搞的一脸懵逼不知所措。 “可以使用该工具的任何特点来解析和可视化捕获的跟踪”,千万不要让译者的小学语文老师看到这书,否则他会被活活气死。