转载请注明出处,谢谢
翻译时间:2019-02-25
译者:周林
翻译进度:14/600(2.3%)
原书对应页码:第v页 ~ 第xiv页
目录
前言 第xv页
简介 第xvii页
目标读者 第xviii页
前置知识 第xviii页
本书组织结构 第xviii页
本书表达惯例 第xix页
系统要求 第xx页
样例代码 第xxi页
安装样例代码 第xxi页
运行样例代码 第xxii页
鸣谢 第xxvi页
勘误与支持 第xxvii页
倾听读者声音 第xxviii页
保持联系 第xviii页
第一部分 背景介绍
第1章 Windows软件开发 第3页
Windows之演进 第3页
Windows版本历史回顾 第3页
所支持的CPU架构 第4页
Windows构建(Build)的分类 第5页
Windows版本命名规范 第6页
Windows架构 第7页
内核态 vs. 用户态 第8页
用户态系统进程 第9页
用户态应用程序进程 第10页
Windows底层通信机制 第13页
Windows编程接口 第16页
开发文档资源 第16页
WDM、KDMF与UMDF 第17页
NTDLL与USER32层 第18页
Win32 API层 第18页
COM层 第19页
CLR(.NET)层 第25页
微软开发工具包 第28页
Windows DDK(WDK) 第29页
Windows SDK 第29页
综述 第30页
第二部分
第2章 让我们开始吧 第33页
调试工具介绍 第34页
获取Windows调试器工具包 第34页
获取Visual Studio调试器 第38页
WinDBG与Visual Studio调试器之比较 第38页
用户态调试 第39页
调试你的第一个程序 第39页
显示局部变量与函数参数的值 第47页
使用WinDBG进行源代码级调试 第52页
调试符号文件、调试服务器与本地缓存 第53页
缓存调试符号用于离线使用WinDBG 第55页
解决WinDBG中的符号解析问题 第56页
符号名字之修饰的考量 第57页
WinDBG命令速查 第58页
内核态调试 第60页
你的第一个(在线)内核调试会话 第61页
使用物理机建立内核态调试环境 第67页
使用虚拟机建立内核态调试环境 第73页
诊断宿主机/目标机通信问题 第76页
理解KD Break-in次序 第77页
用内核态调试器控制目标机 第81页
在内核调试器中设置代码断点 第83页
WinDBG内核调试命令速查 第83页
综述 第83页
第3章 Window调试器是如何工作的 第85页
用户态调试 第85页
架构概览 第86页
Win32调试API 第87页
调试事件与异常 第88页
Break-in序列 第91页
设置代码断点 第93页
在WinDBG中观察代码断点之插入 第93页
内核态调试 第98页
架构概览 第98页
设置代码断点 第100页
切换当前进程上下文 第101页
托管代码调试 第103页
架构概览 第103页
SOS之Windows调试器扩展 第106页
脚本调试 第112页
架构概览 第112页
在Visual Studio中调试脚本 第114页
远程调试 第116页
架构概览 第116页
用WinDBG远程调试 第117页
用Visual Studio远程调试 第121页
综述 第123页
第4章 事后调试 第125页
即时(Just-In Time)调试 第125页
你的第一个JIT调试实验 第126页
即时调试器运行原理 第128页
将Visual Studio作为你的即时调试器 第132页
运行时(Run-Time)断言与即时调试 第138页
转储调试 第139页
自动生成用户态崩溃转储文件 第139页
使用WinDBG调试器分析崩溃转储 第143页
在Visual Studio中分析崩溃转储 第144页
手动生成转储文件 第151页
“前后回溯式(Time Travel)”调试 第153页
内核态事后调试 第153页
综述 第157页
第5章 高级特性与技巧 第159页
非入侵式调试 第159页
数据断点 第162页
深度解密用户态与内核态数据断点 第163页
清除内核态数据断点 第163页
执行数据断点 vs. 代码断点 第166页
用户态调试器之数据断点实战:C++
全局对象与C运行时库 第168页
内核态数据断点实战:等待进程退出 第170页
进阶示例:谁改了注册表的值 第172页
脚本调试器 第176页
使用调试器脚本来执行调试命令 第176页
调试器中的伪寄存器 第178页
调试器脚本实战:在内核调试器中显示
Windows服务进程 第181页
WOW64调试 第183页
WOW64环境 第184页
调试WOW64进程 第184页
Windows调试钩子(GFLAGS) 第187页
系统级 vs. 进程级NT全局标志(NT Global Flags) 第187页
GFLAGS工具 第188页
!gflag调试器扩展命令 第191页
用户态调试器对NT全局标志的影响 第193页
综述 第194页
第6章 代码分析工具 第195页
静态代码分析 第195页
使用VC++静态代码分析工具捕获
你的第一个崩溃Bug 第196页
SAL注解 第199页
其他静态分析工具 第202页
运行时代码分析 第206页
用应用程序验证器(Application Verifier)工具
捕获你的第一个Bug 第206页
揭秘:操作系统中的验证器支持 第209页
!avrf调试器扩展命令 第214页
将应用程序验证器作为质量保证工具 第217页
综述 第217页
第7章 专家调试技巧 第219页
基本技巧
等待调试器附加到目标上 第220页
让DLL加载事件触发中断 第222页
对进程启动进行调试 第227页
对子进程进行调试 第234页
更多的有用技巧 第245页
对缺陷代码的调试 第245页
让First-Chance异常通知时触发中断 第252页
冻结线程 第253页
内核态调试技巧 第255页
让用户态进程创建时触发中断 第255页
对用户态进程创建进行调试 第259页
让DLL加载事件触发中断 第260页
让未处理的SEH异常触发中断 第262页
冻结线程 第262页
综述 第265页
第8章 常见调试场景——第一部分 第267页
对访问异常的调试 第267页
理解内存访问异常 第268页
!analyze调试器扩展命令 第269页
堆被破坏问题之调试 第271页
本地堆被破坏问题之调试 第271页
托管(GC)堆被破坏问题之调试 第281页
堆栈被破坏问题之调试 第291页
基于堆栈的缓冲区破坏 第291页
在调研堆栈被破坏问题时使用数据断点 第294页
从被破坏的堆栈重建调用栈帧 第295页
堆栈溢出问题之调试 第297页
理解堆栈溢出 第297页
kf调试器命令 第299页
句柄泄露问题之调试 第300页
句柄泄露问题示例 第300页
!htrace调试器扩展命令 第302页
用户态内存泄露问题之调试 第307页
使用应用程序验证器工具侦测资源泄露 第307页
使用UMDH工具调研内存泄露问题 第310页
扩展技巧:一个自定义引用堆栈跟踪之数据库 第314页
内核态内存泄漏问题之调试 第316页
内核内存的基本概念 第316页
使用池标记(Pool Tagging)调研内核态泄露 第318页
综述 第322页
第9章 常见调试场景——第二部分 第323页
对竞态问题的调试 第323页
共享态一致性Bug 第324页
共享态生命管理Bug 第330页
DLL模块生命周期惯例Bug 第340页
对死锁问题的调试 第343页
锁顺序造成的死锁 第344页
逻辑死锁 第348页
对访问检查(Access-Check)问题的调试 第352页
基本的NT安全模型 第353页
Windows Vista的改进 第358页
打包 第362页
综述 第363页
第10章 调试子系统揭秘 第365页
Windows控制台子系统 第366页
printf背后的魔法 第366页
处理Windows UI事件 第373页
处理Ctrl+C热键信号 第374页
系统调用的原子性 第380页
系统调用的用户态部分 第381页
切换到内核态 第383页
系统调用的内核态部分 第385页
综述 第387页
第三部分
第11章 利用Xperf 第391页
获取Xperf 第391页
你的首次Xperfd调研 第396页
设计一个调研策略 第397页
基于当前场景收集ETW Trace 第397页
分析收集到的ETW Trace 第399页
Xperf的优缺点 第411页
综述 第412页
第12章 ETW揭秘 第415页
ETW架构 第416页
ETW设计原理 第416页
ETW组件 第417页
特殊的的NT内核日志会话 第418页
使用Xperf配置ETW会话 第419页
Windows中现有的ETW工具 第422页
Windows内核中的工具 第422页
其他Windows组件的工具 第426页
理解ETW的堆栈回溯事件 第431页
使能与查看内核态生产者事件的堆栈跟踪 第432页
使能与查看用户态生产者事件的堆栈跟踪 第434页
诊断ETW堆栈回溯问题 第436页
向你的代码中添加ETW日志 第441页
ETW事件的原子性 第441页
使用ETW Win32 API记录事件 第445页
综述 第455页
第13章 常见跟踪场景 第457页
分析阻塞时间 第458页
CSwitch与ReadyThread ETW事件 第459页
使用Visual Studio 2010进行等待分析 第461页
使用Xperf进行等待分析 第467页
分析内存使用情况 第473页
目标进程内存使用情况的高阶分析 第474页
NT堆内存使用情况分析 第475页
GC堆(.NET)内存使用情况分析 第481页
作为调试助手的跟踪技巧 第490页
跟踪缺陷代码 第490页
跟踪系统内幕 第494页
综述 第502页
附录A WinDBG用户态调试快速上手 第505页
启动用户态调试会话 第505页
设定调试符号路径 第505页
设定源代码路径 第506页
显示目标进程的命令行 第507页
控制流命令 第507页
显示加载模块和它们的版本号 第508页
解析函数/方法地址 第509页
设置代码(软件)断点 第509页
设置数据(硬件)断点 第510页
线程切换 第511页
显示函数/方法参数 第512页
显示局部变量 第513页
显示本地类型的数据成员 第513页
在调用栈帧之间切换 第514页
显示函数/方法的汇编代码 第515页
显示和修改内存与寄存器的值 第518页
终止用户态调试会话 第518页
附录B WinDBG内核态调试快速上手 第519页
启动内核态调试会话 第519页
切换CPU上下文 第519页
显示进程信息 第520页
显示线程信息 第521页
切换进程与线程上下文 第522页
显示加载模块和它们的版本号 第523页
在内核态代码中设置代码(软件)断点 第524页
在用户态代码中设置代码(软件)断点 第525页
设置数据(硬件)断点 第525页
终止内核态调试会话 第526页
索引 第527页
关于作者 第561页