《Windows用户态程序高效排错》

《Windows用户态程序高效排错》  
http://blogs.msdn.com/lixiong/default.aspx  
 
欢迎反馈,反馈请发到:  
http://blogs.msdn.com/lixiong/articles/687575.aspx  
 
 
目录:  
 
第一部分,思考问题  
 
     1.0  热身运动  
 
     1.1  灰常奇怪的问题  
 
     1.2  稀疏平常的Session  Lost  
 
     1.3  绝望的性能  
 
     1.4  本可以做得更好  
 
第二部分,知识和工具  
 
     2.1  汇编  
 
     2.2  异常和通知  
 
     2.3  内存  
 
     2.4  区分层次  
 
     2.5  调试器和Windbg  
 
     2.6  同步和锁  
 
     2.7  调试和设计  
 
暂告一个段落  
 
 
 
前言:  
 
这是一篇介绍Windows系统上User  Mode程序的排错  (troubleshooting)  方法和技巧的文章。  
 
   
 
无论是开发,测试还是支持,都会遇上程序运行结果跟预期效果不一致的情况。找到问题的根源和解决的过程,就是排错。同时,如果问题发生的情况很特殊,比如特别难于重现,或者没有源代码可以参考,在这样的情况下解决问题,非常有挑战性!  
 
   
 
后面的章节会通过例子来跟大家分享排错过程中的经验和技巧。  
 
下面这些问题截取于本文后面要讨论的一些例子:  
 
   
 
l                ASP.NET的程序在测试环境中一切正常,部署到生产环境中后,在压力比较大的时候,发生Session丢失现象。  (ASP.NET  Session  lost)  
 
l                VC开发的程序运行一段时间后,偶尔发生内存访问错误,然后崩溃。  
 
l                程序消耗的handle数量持续增长,内存使用也持续增长,最后性能下降非常厉害。  
 
l                VC程序中,使用ShellExecute打开一个本地的TXT文件。TXT格式默认打开方式关联到UltraEdit。发现在UltraEdit中除了打开这个TXT外,另外还打开了一个GIF文件。  
 
   
 
问题可以表现得非常简单,或者非常复杂。可能涉及不同的开发工具和技术。如何分析解决,正是后面要讨论的。  
 
   
 
   
 
本文的组织结构:  
 
   
 
后面分三部分来解释  
 
   
 
l                第一部分介绍最重要的,通用的思考方法。正确的思维方法能找出问题的核心,制定排错步骤和决定采用何种技术和工具进行研究。  
 
l                第二部分介绍对排错非常有帮助的知识点和工具。包括调试器  (debugger),异常  (exception),内存工具,同步等等。选择恰当的工具,在恰当的时间,可以获取关于问题的关键信息。结合对应的知识就可以分析出问题的根源。  
 
l                第三部分结合前两部分的内容,针对常见的几大类问题进行了总结。包括资源泄漏  (resource  leak),  性能问题  (performance),  崩溃  (crash),  CLR调试技巧和COM+调试技巧。  
 
   
 
前两部分已经完成,正在整理。第三部分还没开始写。先把写好的给出来,听听大家的意见。  
 
 
 
 
 
一些讨论的案例:  
 
===  
 
   
 
有一天,一个电话打进来,客户非常气愤地抱怨,  调用ShellExecute这个API,传入本地的一个文本文件的路径,在相同的机器上,有的时候会同时打开除了这个TXT以外的另一个不相干的文件!客户非常明确地告诉我,所有的参数肯定没有传错,而且ShellExecute的返回值也正确。  
 
   
 
===  
 
   
 
一段加密解密程序,首先由用户输入16个字节的原文,然后程序用固定的密钥加密生成密文,接着再对密文解密得到原来的原文,并且打印。问题的现象是,无论用户输入怎么样的原文,经过加密解密后,打印出来的原文的二进制都是一连串的0xcdcdcdcd  
 
   
 
===  
 
   
 
Windows  SharePoint  Portal  是运行在.NET  Framework上的一个web应用程序。管理员可以设定使用英文界面或者中文界面。某一天一个客户抱怨SharePoint无法显示出中文界面。所有的页面都用英文显示。  
 
   
 
===  
 
   
 
客户开发一个性能很敏感的程序,想知道VC编译器对下面这段代码的优化做得怎么样:  
 
   
 
                 int  hgt=4;  
 
                 int  wid=7;  
 
                 for  (i=0;  i<hgt;  i++)  
 
                         for  (j=0;  j<wid;  j++)  
 
                                   A[i*wid+j]  =  exp(-(i*i+j*j));  
 
   
 
===  
 
   
 
客户声称用VC开发的程序偶尔会崩溃。为了获取详细信息,客户激活了Dr.  Watson,以便程序崩溃的时候可以自动获取dump文件进行分析。但是问题再次发生后,Dr.  Watson并没有记录下来dump文件。  
 
   
 
===  
 
   
 
买了中文版的魔兽争霸,但家里的Windows却是英文版。中文的魔兽争霸必须要运行到中文的操作系统上,否则就报告操作系统语言不匹配,然后退出。怎么办呢?重装系统?去网上找破解?其实windbg就可以解决问题。  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值