Windows高级调试

本书全面讲解Windows高级调试技术和工具,涵盖内存破坏、安全、进程间通信等主题,并介绍编写定制调试扩展等内容。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONEWindows 高级调试

bb

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE(美) Mario Hewardt  Daniel Pravat  

 聂雪军  等译

 

图书内容:
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE  
    本书主要讲解 Windows高级调试思想和工具,并涉及一些高级调试主题。本书内容主要包括:工具简介、调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、 64位调试、事后调试、 Windows Vista基础以及应用程序验证器的测试设置等。本书内容详实、条理清楚。

 

本书适合Windows开发人员、Windows测试人员和Windows技术支持人员等参考。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE标准书号: 978-7-111-26639-6

 

定价:79.00

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE出版时间: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE2009 5

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE“谁说你不能学习别人的经验?本书就包含了丰富而翔实的信息,它们非常清晰地阐述了如何通过一种逻辑的方法来找出和修复程序中的问题。对于那些在 Microsoft Windows平台上开发、测试和提供技术支持的人员来说,本书绝对是一本不可或缺的参考手册。”

 

Bob Wilton,资深工程师

 

就职于Microsoft公司中CPRCritical Problem Resolution)小组

 

“我有幸与本书的作者在超高要求系统(Extremely Demanding System)领域共事了8年多的时间。本书包含了非常有价值的知识,我们曾经感叹,要是在项目开始之前就知道这些知识该有多好—这位调试大师或许只有229号才会告诉你这些知识,因为他只有在这一天的下午才有空;只有亲自去构建和调试那些复杂的系统项目而不是道听途说,才能获得这些宝贵的知识。

 

在大多数书籍中,一些高级主题总是作为‘留给读者的练习’或者‘请参阅其他高级参考书’,而这些主题似乎从来就没有出现过。本书属于那些‘其他高级参考书’。要买就买两本吧,因为你将经常要借一本给其他人。”

 

Raymond McCollum,架构师

 

就职于Microsoft前沿安全产品(Forefront Security Product)部门

 

“由MicrosoftMarioDaniel合著的这本书是一本非常棒的参考书,面向的读者包括中级调试人员和高级调试人员。本书通过对一些示例进行深入讲解来阐述如何调试各种错综复杂的问题,例如栈破坏和堆破坏等,这使得本书与目前市面上讲解Win32软件调试的众多书籍相比显得卓尔不群。本书的实用性非常高,包含了丰富的调试技巧和策略。”

 

Kinshuman,开发主管

 

就职于Windows核心操作系统部门

 

“我非常高兴地看到在这本书中包含了大量非常聪明的调试技巧。它不仅介绍了如何对付那些难以诊断的问题,而且还详细解释了在这些技术后面隐藏的底层机制。本书中介绍的实用方法对于人们理解一些关键的Windows领域是非常有帮助的。”

 

Adrian Marinescu,软件架构师

 

就职于Microsoft

 

本书详细描述了如何调试和修复软件中的各种问题。本书的内容是根据作者在跟踪各种软件问题时所积累的丰富经验而提炼出来的。本书不仅给出了各种问题的代表性示例,而且还介绍了在分析这些问题时所使用的工具,以及这些工具的详细使用说明。无论是软件开发人员还是软件测试人员,在理解了这些示例后都将受益匪浅。”

 

Daniel Mihai,软件设计工程师

 

就职于Microsoft开发人员生产率工具(Developer Productivity Tools)部门

 

“我编写了WinDbg符号处理器、符号服务器以及源文件服务器。即便如此,我仍然无法教会我妻子使用WinDbg。她认为这个工具非常难用,因此并不了解这个工具的强大之处。我买了这本书送给她,这样她就可以知道如何使用WinDbg。本书中关于事后调试(Postmortem  Debugging)和内存破坏等方面的内容,有效地揭示了在程序出错时的运行环境和操作系统的内部状态。MarioDaniel在调试领域积累了丰富经验,因为他们经常被要求解决陌生程序中一些莫名其妙的问题。这也是具有工业强度的调试技术的真正意义所在。”

 

Pat Styles

 

就职于Microsoft

 


Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 译者序

序言

前言

作者简介

第一部分        

1   调试工具简介   1

1.1 泄漏诊断工具   1

1.2 Windows调试工具集  3

1.3 UMDH   4

1.4 Microsoft 应用程序验证器  4

1.5 全局标志   9

1.6 进程浏览器 11

1.7 Windows驱动程序开发包  12

1.8 Wireshark  14

1.9 DebugDiag  15

1.10 小结  15

2章 调试器简介  16

2.1 调试器的基础知识   16

2.1.1 调试器类型   17

2.1.2 调试器命令   18

2.1.3 调试器的配置 19

2.1.4 通过内核态调试器重定向用户

态调试器    24

2.1.5 是否使用KD   26

2.2 基本的调试任务 26

2.2.1 键入调试命令 27

2.2.2 解析调试器的提示信息 27

2.2.3 配置和使用符号   29

2.2.4 使用源文件   38

2.2.5 分析命令 40

2.2.6 修改上下文的命令 60

2.2.7 其他的辅助命令   67

2.2.8 示例 68

2.3 远程调试   70

2.3.1 Remote.exe   70

2.3.2 调试服务器   71

2.3.3 进程服务器与内核服务器   73

2.3.4 远程调试中的符号解析 74

2.3.5 远程调试中的源代码解析   75

2.4 调试场景   75

2.4.1 调试非交互式进程(服务

或者COM服务器)    76

2.4.2 在没有内核态调试器的情况

下调试非交互式进程(服务

或者COM服务器)    77

2.5 小结   77

3章 调试器揭密  78

3.1 用户态调试器的内幕 78

3.1.1 操作系统对用户态调试器的支持 78

3.1.2 调试事件的顺序   83

3.1.3 控制来自调试器的异常和事件   84

3.1.4 内核态调试器中的调试事件处理 105

3.2 控制调试目标   106

3.2.1 断点的工作原理   107

3.2.2 内存访问断点的工作原理   108

3.2.3 处理器跟踪   109

3.2.4 实时调试中的线程状态管理 109

3.2.5 通过用户态调试器来挂起线程   112

3.3 小结   113

4章 符号文件与源文件的管理  114

4.1 调试符号的管理 114

4.1.1 公有符号的生成   115

4.1.2 在符号库中存储符号   117

4.1.3 在HTTP服务器上共享公有符号  119

4.2 源文件的管理   120

4.2.1 收集源文件信息   120

4.2.2 源文件信息的使用 122

4.2.3 不带源文件修订控制的源文件

服务器  123

4.3 小结   125

第二部分 调 试 实 践

5章 内存破坏之一—栈    127

5.1 内存破坏的检测过程 128

5.1.1 步骤1:状态分析  128

5.1.2 步骤2:源代码分析    129

5.1.3 步骤3:使用内存破坏检测工具  133

5.1.4 步骤4:调整源代码    133

5.1.5 步骤5:定义回避策略  133

5.2 栈内存破坏 133

5.2.1 栈溢出   142

5.2.2 异步操作与栈顶指针   147

5.2.3 调用约定的不匹配 154

5.2.4 回避策略 164

5.3 小结   166

6章 内存破坏之二—堆    167

6.1 堆简介 167

6.1.1 前端分配器   168

6.1.2 后端分配器   169

6.2 堆破坏 181

6.2.1 使用未初始化状态 181

6.2.2 堆的上溢与下溢   185

6.2.3 堆句柄的不匹配   195

6.2.4 重用已删除的堆块 199

6.3 小结   205

7章 安全    206

7.1 Windows安全概述    206

7.1.1 安全标识符   207

7.1.2 访问控制列表 208

7.1.3 安全描述符   209

7.1.4 访问令牌 211

7.2 安全信息的来源 213

7.2.1 访问令牌 213

7.2.2 安全描述符   215

7.3 如何执行安全检查   217

7.4 在客户端/服务器程序中传播标识  218

7.4.1 远程认证与安全支持提供者接口 218

7.4.2 模拟级别 220

7.5 系统边界上的安全检查   220

7.6 安全故障的分析 221

7.6.1 本地安全故障 221

7.6.2 延迟初始化中的安全问题   226

7.6.3 身份模拟的潜在安全问题   231

7.6.4 分布式COM错误   232

7.6.5 扩展命令!token的故障 241

7.6.6 在Windows XP SP2上安装了

某个程序后发生DCOM激活故障 243

7.6.7 通过跟踪工具来分析安全故障   247

7.7 小结   248

8章 进程间通信  249

8.1 通信机制   249

8.2 本地通信分析   250

8.2.1 LPC的背景知识    251

8.2.2 调试LPC通信 251

8.2.3 调试本地DCOM以及MSRPC通信  254

8.3 远程通信分析   260

8.3.1 RPC故障测定状态信息的使用    260

8.3.2 网络流量分析 270

8.3.3 打破调用路径 275

8.4 一些其他的技术信息 277

8.4.1 远程认证 277

8.4.2 RPC扩展错误信息  278

8.4.3 其他工具 278

8.5 小结   279

9章 资源泄漏    280

9.1 什么是资源泄漏 280

9.2 高层流程   280

9.2.1 步骤1:找出潜在的资源泄漏    281

9.2.2 步骤2:什么东西正在泄漏  282

9.2.3 步骤3:初步分析  282

9.2.4 步骤4:资源泄漏检测工具  282

9.2.5 步骤5:制定回避策略  283

9.3 资源泄漏的可重现性 283

9.4 句柄泄漏   284

9.4.1 存在泄漏的程序   285

9.4.2 步骤1和步骤2:它是不是一个

句柄泄漏    286

9.4.3 步骤3:初始分析  287

9.4.4 更复杂的程序 290

9.4.5 步骤4:利用泄漏检测工具  292

9.4.6 句柄注入与!htrace    298

9.4.7 步骤5:为句柄泄漏制定回避策略    300

9.5 内存泄漏   301

9.5.1 一个简单的内存泄漏   301

9.5.2 步骤1和步骤2:是否存在泄漏,

以及泄漏的是什么资源    302

9.5.3 步骤3:使用内存检测工具  303

9.5.4 步骤4:回避策略  322

9.6 小结   322

10章 同步   323

10.1 同步的基础知识    323

10.1.1 事件    323

10.1.2 临界区  325

10.1.3 互斥体  329

10.1.4 信号量  330

10.2 高层流程  331

10.2.1 步骤1:识别问题的征兆   331

10.2.2 步骤2:转储所有线程 331

10.2.3 步骤3:分析线程中的同步问题 332

10.2.4 步骤4:修复问题 334

10.2.5 步骤5:制定回避策略 334

10.3 同步情况  334

10.3.1 死锁    334

10.3.2 第1种孤立临界区情况—异常  338

10.3.3 第2种孤立临界区情况—线程

结束    343

10.3.4 DllMain函数的注意事项   347

10.3.5 锁竞争  353

10.3.6 管理临界区  358

10.4 小结  361

第三部分 高 级 主 题

11章 编写定制的调试扩展 363

11.1 调试扩展简介  363

11.2 调试扩展示例  365

11.2.1 调试扩展模型    369

11.2.2 调试扩展示例的需求  371

11.2.3 头文件和代码组织    372

11.2.4 调试扩展的初始化    374

11.2.5 调试会话状态的变化  379

11.2.6 KnownStructOutput   379

11.2.7 退出调试扩展    379

11.2.8 Help命令的实现  380

11.2.9 dumptree命令的实现  381

11.2.10 KnownStructOutput函数的实现    384

11.2.11 取消命令的实现 387

11.2.12 版本   389

11.2.13 调试扩展的构建 389

11.3 小结  390

12章 64位调试   391

12.1 Microsoft 64位系统    391

12.1.1 操作系统简介    392

12.1.2 在WOW64中运行的32位程序   393

12.2 Windows x64带来的变化 395

12.2.1 第1章—调试工具简介    396

12.2.2 第2章—调试器简介  397

12.2.3 第3章—调试器揭密  407

12.2.4 第5章—内存破坏之一—栈    411

12.2.5 第6章—内存破坏之二—堆    411

12.2.6 第7章—安全    412

12.2.7 第8章—进程间通信  413

12.2.8 第11章—编写定制的调试扩展 414

12.3 小结  414

13章 事后调试   415

13.1 转储文件基础  415

13.1.1 通过调试器来生成转储文件    417

13.1.2 通过ADPlus来生成转储文件   420

13.1.3 内核态转储文件的创建    421

13.2 转储文件的使用    423

13.2.1 转储文件的分析:访问违例    424

13.2.2 转储文件的分析:句柄泄漏    425

13.3 Windows错误报告   429

13.3.1 Dr.Watson   429

13.3.2 Windows错误报告的系统架构   434

13.4 企业错误报告  446

13.4.1 设置企业错误报告    447

13.4.2 通过企业错误报告来报告错误  449

13.5 小结  451

14章 功能强大的工具 452

14.1 调试诊断工具  452

14.1.1 分析内存泄漏或者句柄泄漏    453

14.1.2 编写定制的分析脚本  455

14.2 扩展命令!analyze  457

14.2.1 故障程序    457

14.2.2 分析结果    458

14.2.3 故障的跟进人员  462

14.3 小结  463

15章 Windows Vista基础  464

15.1 第1章—调试工具简介  464

15.2 第2章—调试器简介    465

15.2.1 用户访问控制的副作用    465

15.2.2 启用内核态调试器    467

15.2.3 地址空间布局的随机化    468

15.3 第6章—内存破坏之二—堆  469

15.4 第7章—安全性    473

15.4.1 用户访问控制    474

15.4.2 调试器中的UAC   475

15.4.3 注册表和文件虚拟化  479

15.5 第8章—进程间通信    481

15.6 第9章—资源泄漏  482

15.7 第10章—同步 482

15.7.1 轻量读写锁  482

15.7.2 条件变量    483

15.7.3 单次初始化  484

15.7.4 增强线程池  484

15.8 第11章—编写定制的调试扩展   484

15.9 第13章—事后调试 485

15.10 小结 487

附录A 应用程序验证器的测试设置 488


 




fj.png高级调试.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16502878/viewspace-598647/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16502878/viewspace-598647/

该资源有目录,对大家学习调试技术会有很大的帮助 译 者 序 软件调试是开发人员日常工作的重要组成部分。无论软件工程的理念多么先进,开发进度的安排多么合理,或者开发人员的经验多么丰富,人们在开发软件时总是无法保证不出现任何错误。当软件出现错误时,就需要进行调试。近年来,随着软件规模和复杂性的不断增加,错误的出现频率以及调试难度也在以非线性的方式增长。要想提高调试工作的效率,采用正确的调试思路和调试工具是非常重要的。有时候,一个需要数天时间才能解决的问题,如果换一种调试思路或者借助某种特殊的调试工具,或许只需1个小时就可以解决。 软件人员通常都知道许多高效的编码方法,例如极限编程、代码自动生成框架等,但他们很少知道一些高效的调试方法。大多数软件开发人员的调试思路和所使用的调试工具都还停留在比较初级的阶段,例如仅限于通过集成开发环境自带的调试器来进行单步跟踪。事实上,随着Windows的不断发展,Windows调试工具的数量和功能也在不断增加。但可惜的是,很少有人知道这些强大的调试工具,而了解这些工具的独特优势并且针对不同调试问题采用正确调试工具的人则更少。有些软件开发人员经常加班和熬夜,往往是因为他们使用了一些低效的方法来调试复杂的问题,他们并不知道其实存在着一些更高效的调试方式可以帮他们节约大量的时间。 本书的写作初衷正是为了将一些非常有价值的调试思路和调试工具推荐给软件开发人员,目的是提高开发人员的调试效率。本书的特点如下。 1) 系统地介绍了Windows调试的基础知识。这些知识包括两个方面:Windows中一些底层组件的知识,包括调用栈的结构、堆管理器的工作原理、安全管理机制、进程间通信协议等;一些基本的调试知识,包括调试器的工作原理、调试符号的使用、内存转储文件的结构以及栈回溯中包含的调试信息等。 2) 结合实际问题来阐述正确的调试思路以及各种调试工具的使用。本书采用的叙述方式是,首先给出某个实际的问题,例如内存破坏、同步问题、资源泄漏、安全威胁等;然后介绍分析这个问题的正确调试思路,例如如何通过程序的异常表现来了解问题的具体信息;最后根据所调试的问题来采用正确的调试工具,并详细讲解了各种调试工具的使用方法和技巧。 3) 讲解了一些高级调试主题,包括64位操作系统上的调试Windows Vista系统上的调试、事后调试以及调试扩展的编写等。这些主题为开发人员进行复杂的调试提供了必要的基础知识。 作者Mario Hewardt和Daniel Pravat是Microsoft公司的资深工程师,他们从事的工作就是保证Windows产品的可靠性、稳定性以及安全性。他们在调试领域已经工作了十余年的时间,积累了丰富的调试实践经验,而本书正是融合了这些宝贵的经验而形成的。因此,对于Windows开发人员来说,本书是一本不可多得的调试参考手册。 本书的技术性较强,需要读者对Windows系统的底层架构和组件有一定的了解,并且具备一定的编程基础和调试基础。如果读者需要补充这些方面的知识,可以参考作者在书中介绍的相关参考书籍。 参与本书翻译工作的还有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯、刘红、张玮、陈红、李斌、李勇涛、王海涛、周云波、彭敏才和张世锋等。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,请读者和同行不吝指正。 感谢妻子云兰和女儿彤彤,虽然在翻译本书的过程中减少了陪伴你们的时间,但你们依然理解和支持我的工作。感谢父母在生活上的帮助,使我可以全身心地投入到本书的翻译工作中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值