Windows用户态程序高效排错
2007-12
电子工业出版社
熊力
236
无
本书是一本介绍Windows系统上的用户态程序排错方法和技巧的书。本书分为4个章节,先介绍最重要的、通用的思考方法,以便制定排错步骤;再介绍对排错有帮助的知识点和工具;并介绍了.NET Framework(CLR)的相关知识和调试技巧;最后一章针对常见的几大类问题进行了总结。 本书案例丰富,对现实中的实际问题进行了研究,并和读者一起分析解决办法;本书的写作思路为先给出问题描述,然后提供线索,再进行分析,让读者在阅读中也进行思考,以提高实际解决问题的能力。本书适合希望学习排错、调试知识的软件开发、测试人员,希望深入学习Windows系统上用户态程序的排错知识的软件开发、测试人员。
熊力,2004年开始在上海微软技术支持中心担任技术支持工程师。他所在的小组负责帮助企业客户解决开发领域的技术难题。作者专注于.NET Framework、 C/C++、COM和Web开发,现任微软中国研发集团服务器与开发工具事业部测试工程师。
第1章 比工具、技巧和经验都重要的是你的思考——从四个风格迥异的案例说起1.1 绝望的性能问题:ADO.NET 2.0竟然比1.0要慢1.1.1 问题描述1.1.2 悲观和绝望1.1.3 换位思考1.1.4 排错1.1.5 结论和收获1.1.6 题外话和相关讨论Safehandle的更多讨论平衡、取舍、双赢和RFC 1925Profiler的下载地址和相关资源1.2 不可思议:一个API同时打开了两个文件1.2.1 问题描述1.2.2 第一印象1.2.3 深入分析1.2.4 革命尚未成功1.2.5 结论1.2.6 题外话和相关讨论MSDN是最值得信赖的吗你敢说CPU坏了DWORD和文件长度程序输出0xcdcdcdcd,想到了什么1.3 简单的问题最棘手:稀疏平常的ASP.NET Session Lost问题1.3.1 问题描述1.3.2 制定策略1.3.3 具体操作和结论1.3.4 题外话和相关讨论排查session lost的经验1.4 本可以做得更好:SharePoint中文界面变英文1.4.1 问题描述1.4.2 排错步骤1.4.3 错过的线索第2章 汇编、异常、内存、同步和调试器——重要的知识点和神兵利器2.1 排错的工具:调试器Windbg2.1.1 调试器的功能:检查代码和资料,保存dump文件, 断点控制程序的执行2.1.2 符号文件(Symbol file),把二进制和源代码对应起来2.1.3 一个简单的上手程序2.1.4 用Internet Explorer来操练调试器的基本命令vertarget检查进程概况!peb 显示Process Environment Blocklmvm 检查模块的加载信息.reload / !sym 加载符号文件lmf 列出当前进程中加载的所有模块r,d,e 寄存器,内存的检查和修改!address显示内存页信息S 搜索内存!runaway 检查线程的CPU消耗~ 切换目标线程k,kb,kp,kv,kn 检查call stacku 反汇编x 查找符号的二进制地址dds 对应二进制地址的符号2.1.5 检查程序资料的小例子.frame 在栈中切换以便检查局部变量dt 格式化显示资料2.1.6 用Windbg控制程序进行实时调试(Live Debug)Wt Watch and Trace, 跟踪执行的强大命令断点和条件断点(condition breakpoint),高效地控制观测目标伪寄存器,帮助保存调试的中间信息Step Out的实现2.1.7 远程调试(Remote debug)2.1.8 如何通过Windbg命令行让中文魔兽争霸运行在英文系统上2.1.9 Dump文件2.1.10 CDB、NTSD和重定向到Kernel Debugging2.1.11 Debugger Extension,扩展Windbg的功能2.2 读懂机器的语言:汇编,CPU执行指令的最小单元2.2.1 需要用汇编来排错的常见情况案例分析:用汇编读懂VC编译器的优化问题描述我的分析案例分析:VC2003 编译器的bug、debug模式正常,release模式会崩溃例子程序跟踪汇编指令来分析案例分析:臭名昭著的DLL Hell如何导致ASP.NET出现Server Unavailable2.2.2 题外话和相关讨论Release比 Debug快吗2.3 理解操作系统对程序的反馈:异常(Exception)和通知(Debug Event)2.3.1 异常(Exception)的方方面面和一篇字字珠玑的文章案例分析:如何让C++像C#一样打印出函数调用栈(callstack)2.3.2 Adplus,抓取dump的方便工具案例分析:华生医生(Dr. Watson)在什么情况下不能记录Dump文件问题描述背景知识问题分析新的做法问题解决了,可是为什么华生医生(Dr. Watson)抓不到dump呢2.3.3 通知(Debug Event)是操作系统跟调试器交流的一种方法案例分析:VB6的版本问题2.3.4 题外话和相关讨论错过第一现场后还从dump中分析出线索吗Adplus,天天都用的工具未处理异常发生后的主动退出如何调试UnhandledExceptionFilter2.4 平坦内存空间中的层次结构:Heap和Stack2.4.1 Heap是对平坦空间的高效管理和利用2.4.2 PageHeap,调试Heap问题的工具简单例子的多种情况Heap上的内存泄漏和内存碎片2.4.3 Stack overrun/corruption2.4.4 题外话和相关讨论PageHeap的/unaligned参数Heap trace,系统帮你记录下每次Heap的操作为何才分配了300MB内存,就报告Out of memory2.5 找准排查问题的对应层次2.5.1 从C运行库看层次2.5.2 简单的_CRTDBG_MAP_ALLOC定义就可以让内存泄漏无可遁形2.5.3 BSTR Cache,建立在Heap之上的COM字符串内存管理2.5.4 题外话和相关讨论CRT Debug Heap一定对Debug有帮助吗C++中new操作符的尴尬2.6 理清多个线程对资源的竞争:同步和锁2.6.1 句柄泄漏、死锁和线程争用,三个典型问题句柄泄漏(Handle Leak)死锁(Deadlock)线程争用 (contention)2.6.2 Windbg中的对应排错!handle 检查句柄信息!htrace 检查操作句柄的历史记录!cs 列出CriticalSection的详细信息排查CriticalSection leak( Orphan CriticalSection)Invalid handle exception案例分析:ArrayList.Add的时候发生IndexOutOfRangeException问题描述这个异常不简单具体操作结论2.7 调试和设计2.7.1 一位热心朋友的提问案例分析:反被聪明误第3章 .NET Framework的原理和SOS调试——剖析CLR程序和CLR本身3.1 MetaData、JIT、GC和Exception的关键点3.1.1 MetaData(元资料)和引擎初始化3.1.2 JIT动态编译3.1.3 GC 内存管理3.1.4 Exception Handling异常处理3.2 用Windbg探索CLR的实现3.2.1 开源的CLR实现:Rotor3.2.2 对一个Hello world的WinForm程序庖丁解牛mscoree!_CorExeMain CLR引擎的入口EEStartupHelper 重要的引擎初始化函数mscorwks!SystemDomain::ExecuteMainMethod 执行托管代码的入口CallDescr /MakeJitWorker Jit引擎发动的地方NtUserWaitMessage 托管程序完成加载gc_heap::allocate_more_space/ GCHeap::GarbageCollect 通过GC管理内存的分配和 释放AppDomain,ThreadPool,Exception,StackWalk,Security都是有趣的话题3.3 通过SOS快捷方便地调试托管程序3.3.1 CLR让托管程序的调试变得非常简单3.3.2 SOS的命令介绍3.4 用简单的程序演示SOS的常见操作3.4.1 .load SOS 加载SOS到Windbg3.4.2 !dumpheap 统计托管内存使用信息3.4.3 !do 显示托管对象的详细信息3.4.4 !gcroot 查找托管对象的引用关系案例分析:ASP.NET High CPU和更多的CLR命令演示!threads查看托管线程!tp查看线程池和CPU占用率!SyncBlk查看托管线程的lock!ip2md 映像内存地址到托管函数名!savemodule 保存模块到本地以便用reflector分析著名的blog:If broken it is,fix it you should3.5 题外话和相关讨论3.5.1 ReleaseCOMObject 释放COM对象时候的两难困境3.5.2 PInvoke应该Pin住内存防止崩溃3.5.3 Pin住内存又会导致内存碎片3.5.4 臭名昭著的mixed DLL loading deadlock3.5.5 有趣且有用的练习和更多的资料第4章 崩溃,性能和资源泄漏——分享一些经验4.1 排错开始前的准备工作4.1.1 用正确的态度对待问题4.1.2 用简单的提问缩小排错的范围4.1.3 通过MPS REPORT获取系统的详细信息4.1.4 通过简单的Dump分析获取基本信息4.2 崩溃(Crash)4.2.1 崩溃的万千种不同死相4.2.2 准确获取DumpAdplus:最容易上手的dump脚本华生医生(dr Watson)通过Image File Execution Options让调试器随目标程序一起启动COM+和ASP.NET的dump获取需要特殊配置4.2.3 crash dump中需要重点关注的信息案例分析:VC程序的崩溃问题描述MessageBox 嵌套调用从源代码中发现的疑点从This指针找崩溃的根源结论4.2.4 小结和更多的资源4.2.5 题外话和相关讨论HeapCorruptionStackCorruption4.3 性能(Performance)4.3.1 “你真牛,不如你再给我缩短10秒吧!”不是想要多快就能调到多快4.3.2 性能调优的步骤,CPU利用率是关键4.3.3 无所不知的性能监视器使用性能监视器的基本步骤重要的计数器案例分析:博客园的性能问题案例分析:堵塞在SqlCommand.ExecuteReader上就一定在等sql吗问题背景案例分析:堵塞在Assembly.Load上的deadlock问题背景案例分析:196个线程织成的一张网问题背景小结4.3.4 用Profiler精确定位性能瓶颈案例分析:DataTable中foreach和for loop性能差了50%问题背景4.3.5 题外话和相关讨论Task manager跟performance monitor的差别性能监视器的超级用法C++跟C#到底谁快没有profiler怎么办4.4 资源泄漏(Resource Leak)4.4.1 资源泄漏分轻重缓急4.4.2 内存泄漏排错的基本步骤泄漏了什么,谁分配的,为什么无法释放定位泄漏内存的类型和增长趋势区分managed heap leak和native leak案例分析:IE7的内存泄漏问题描述重现问题和基本分析用传统的Pageheap+UMDH找到问题根源方便强大的IIS Diagnostics工具结论分析IIS Diag4.4.3 托管内存泄漏案例分析:object chain让排错简单明了问题背景案例分析:一个bt的案例碎片的其他原因4.4.4 句柄泄漏(Handle Leak)4.4.5 题外话和相关讨论GDI LeakDesktop heap issue更多的资源
《Windows用户态程序高效排错》案例丰富,对现实中的实际问题进行了研究,并和读者一起分析解决办法;《Windows用户态程序高效排错》的写作思路为先给出问题描述,然后提供线索,再进行分析,让读者在阅读中也进行思考,以提高实际解决问题的能力。《Windows用户态程序高效排错》适合希望学习排错、调试知识的软件开发、测试人员,希望深入学习Windows系统上用户态程序的排错知识的软件开发、测试人员。
无
PDF在:
http://files.cnblogs.com/lixiong/userdbg_msinternal.pdf
今天一个朋友提醒我,说 Windows用户态程序高效排错 的全文应该可以免费放出来了。 我掐指一算, 早过了和出版社约定的时间。
下面是
Windows用户态程序高效排错 全文 PDF 的链接
PDF在:
http://files.cnblogs.com/lixiong/userdbg_msinternal.pdf
注意:
1. 这个就是原书一样的内容。我太不负责了,里面的一些错误也没有修改。勘误请参考:
http://blog.csdn.net/eparg/archive/2007/12/07/1923194.aspx
2. PDF下面写了ms internal. 实际上里面的内容和书里面一样。写internal是为了当年在公司内部审阅方便。
3. PDF看起来比较方便,里面的link可以直接点开。但是3年过去了,我相信里面很多链接都失效了,遇上此类情况请灵活使用搜索引擎。
最后欢迎排砖。
“这就是绝世武功的秘籍吗?”
“不,这只是秘籍的目录!”
没错,看完这本书,我脑子里闪现的就是周星驰鹿鼎记中与陈家洛的这句对白。区区200来页,其包含的内容却是远胜于此。究其原因,恐怕是以下两个:
1. 书中列出了无数个链接,而有些链接过去的知识点,就够你研究好半天了。比如SEH的使用,CLR的原理等等
2. 书中大多讲解的,还是工具的使用,无数个命令,参数的确也是比较难记,要掌握好这些工具,不是一两个星期能搞定的事情。比如windbg, performance monitor等等。
由此可能会觉得,这本书作者自己的思想少了点,链接的内容,工具的使用占了较大的篇幅。但其实作者融汇贯通了如此多的知识,加上自己的思考与实践再呈现给大家,读起来相当的痛快,也是相当有用。
至此读完了一遍,但正如我前面所形容的,这是一本武功秘籍的目录,要想完全掌握书中的内容,还是要多阅读,多思考,多实践。并且,根据目录的提示去扩展阅读那些“绝世武功秘籍”。
这本书总体开看,还是不错的,不像很多其他的书,到处抄袭,至少是有不少原创内容。
但也不如很多人捧的那样好,原因我觉得是写的不好,作者当工作笔记写的,不是当书写,所以内容文字还有待改进。其实,我觉得这本书的内容,作为电子版的话,应该不错,但是作为印刷版,还是有不少地方需要改进,包括内容本身,文字叙述,还有章节安排。
终于读完了《Windows 用户态程序高效排错》(http://www.china-pub.com/37008)
感想:
1、这本书还要再读几遍,反复实践!
2、书中提供了大量的参考资源,都是要仔细研究的!
3、作者以授之以渔的态度为读者奉献了一本经典之作!
4、曾经看过评论说这本书的读者面较窄,严重反对!凡是想一辈子吃写程序这口饭的,这本书应该是必读!就像《Borland 传奇》一样!(不管你是否想精通Debug,读读这本书不会浪费你多少时间,相反可能会有意想不到的收获!)
5、不能再盲人摸象了,写程序一定要知其所以然啊!
6、想说的话太多,一时说不出来,用一句话代替:这真是本好书!!!!!
补充:研究Debug技术,欢迎大家加入博客园Debug探索团队(http://debug.cnblogs.com/)
书中的链接汇总在
http://blog.csdn.net/eparg/archive/2007/09/19/1792015.aspx
比起IDE内置的调试器,windbg是更有力的排错武器。通过分析运行时信息找到疑难错误的根源所在,这种感觉很不错。
反过来说,有了分析运行时错误的经验,对于减少开发过程中的缺陷也有积极的意义。可贵的是作者在书中对于开发错误,系统配置错误和意外情况导致的问题也有很多探讨和分析,使得适合本书的读者范围大大的增加了。
作者不仅在介绍windbg的使用方法和实际调试的案例,揭示了windows和.NET系统底层的原理(当然只是调试过程中涉及到的部分),还向读者指出了如何开发出错误更少的程序。
作者在书中付了很多参考文章的地址,读者可以籍此获得更多的相关知识。美中不足的是参考文章分散在各章节中,实战案例的分析也是如此,如果能整理为两个专门列表,一个是参考资料、扩展阅读列表,一个是案例分析列表,附在书后就更完美了。
PS:
作者提供的汇总连接:http://blog.csdn.net/eparg/archive/2007/09/19/1792015.aspx
我算是从头到尾关注这本书的少数人之一吧,最早知道熊力的《Windows用户态程序高效排错》这本书,是在去年6年,当然,当时还不叫这个名字,叫graepf的《个人总结的调试文章》(呵呵,差别很大吧),初见是在某论坛上,那时的我对论坛上的这类文章大多持怀疑态度,不过从第一眼看到文章里提到的那些实例,感觉就是找到宝藏,那份惊喜不亚于看到John Robbins的《.NET和Windows应用程序调试》,同时因为中文的原因,觉得读起来非常解渴,尤其是对session lost的讨论,如同在我眼前开了一道大门,从理论到实际,对session的深入理解,催生了具体的处理情况,尤其是对情况的分析,循循善诱,对像我这样一出bug就感觉无从下手的人来说,就像明灯一样指明了如何解决问题的道路。继续读下去,对内存泄露的话题,熊力依旧是举重若轻,MSDN中的kb,各种实际案例信手拈来,可以看出都是厚积薄发,尤其是对案例的反汇编代码的解说详细精到,同时娴熟的运用WinDbg加以分析,更是让人大呼过瘾,不忍释卷。到了今年初的时候,一个偶然的机会得到了该书的内部电子版,因为我的工作方向发生了变化,所以很遗憾没有向熊力提供更多的反馈,不过即使略读一番,对这本书仍是更加期待,不想一等又是半年,终于看到本书即将出版,一年多的等待终于有了结局,希望能有更多喜爱系统底层,喜欢探究系统奥秘的人来看看这本中国人自己的《.NET和Windows应用程序调试》!
作者主动把pdf放在这,赞!
这个不是《Windows用户态程序高效排错》原书
楼上的, 这个就是原书, 我是作者.
膜拜~~!刚想在china-pub上买呢
xiongli太棒了. 期待新作哈
我已经从事软件开发8年了,今天无意中看到了作者的这本书。
我的感觉是很震撼。
作者的工作态度,专业能力,钻研精神,无不让我这个平时庸庸碌碌,懒懒散散的笨人在北方的这个寒冷冬日里汗流浃背,无地自容。
感谢作者~~
感谢您的分享..............
多谢您的评论。
“这只是秘籍的目录!”
作为作者,我认为您的这句话是出版两年来最贴切的评论。
那我就顶!
这一点就类似于《Real-time rendering》呢,1000多页厚,也只是作为摘要。延伸的参考文献有1400多项
太可怕了,非十年二十年之功不可得。
学习这种精神!
的确比较少来. 我一般3个月来一次看看评论...
评论确实相当贴切,一定要从目录延伸开去,才能得到最大的收获。
推荐书何必用“狗屁” “TMD”和一堆感叹号? ^_^
你可以把这些都理解成当时激动的心情就行啦
:) 有点理解啦