国内文章发布站点 http://www.cnblogs.com/lixiong

为了方便国内朋友的下载和访问,建立了下面的镜像blog: http://blog.csdn.net/eparg http://www.cnblogs.com/lixiong 希望大家多多给反馈   谢谢

0

English Introduction about this blog

This blog is used to host a user mode troubleshooting paper, which is written in Chinese. The paper covers troubleshooting guideline, tools, technology with real case study. The download URL is: http://blogs.msdn.com/lixiong/attachment/687357.ashx Currently the English version is not available.

1

历史和当前动态

历史和当前动态===历史: 2006年8月3日文章发布在http://blogs.msdn.com/lixiong 当前动态: 等待反馈以便进一步修正和准备第三部分

0

FAQ

Windows用户态程序高效排错 FAQ===根据反馈整理出FAQ后会放在这里。(等待反馈中)

1

文章中介绍到的部分案例

下面是文章中一些案例问题的节选: ===   有一天,一个电话打进来,客户非常气愤地抱怨, 调用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就可以解决问题。

1

前言和简介

本文介绍什么?   这是一篇介绍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+调试技巧。   前两部分已经完成,正在整理。第三部分还没开始写。先把写好的给出来,听听大家的意见。   本文的使用方法和说明:   本文着重介绍思路,经验和工具。对于具体的知识点和工具,给出重点和方法,但是不会做详细的介绍,原因是MSDN的解释更加丰富和权威。具体信息可以参考文章中给出的链接。   在第一章阅读过程中,可能会发现某些术语,或者知识点并不熟悉。但是,这些并不会阻碍理解整体的思路。鼓励自主学习。通过Internet,都可以找到这些知识点的具体说明。同时,很多知识点会在第二章来说明。  …

1

文章目录

Windows用户态程序高效排错 (UsermodeTSPaper.pdf)文章的目录是:   === 第一部分,思考问题    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 调试和设计 暂告一个段落 ===

1

勘误和补充

Windows用户态程序高效排错 勘误===文章中的疏漏,错误的修正会放在这里。 === 第11页,错误的句子:   问题一共就发生过三次,是通过分析log文件得到的。Log文件记录的是每个时刻Session中的内。 应该修改为: 问题一共就发生过三次,是通过分析log文件得到的。Log文件记录的是每个log生成时刻Session中的内容。 ==   如果在VS2005下面想用CRT Debug Heap来调试Memory Leak,最后可以用_CrtDumpMemoryLeaks 把所有的leak打印出来。尝试下面的代码,会怎样:   #include “stdafx.h” #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include<crtdbg.h> #endif   #define MY_NEW[s] new(s,_NORMAL_BLOCK, __FILE__, __LINE__)   #if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) #define new MY_NEW #endif   int _tmain(int argc, _TCHAR* argv[]) {         char *p=new char[10];     void *p2=malloc(10);…

1

反馈收集和回复

反馈收集和回复===请您在这里通过添加评论留下您对这篇文章的反馈信息,我会及时整理并且回复。如果您的反馈不想让别人看到,可以点击右边的Email链接给我发邮件: http://blogs.msdn.com/lixiong/contact.aspx === Q: 问个其他的问题。最近困扰我很久了。一般stdcall函数的标准入口是这样的:push ebpmov ebp, esp但是现在我看一些windows自身的动态库,比如NTDLL.DLL,都是这样的:mov edi, edipush ebpmov ebp, esp多出来的mov edi,edi不会没有理由吧。我从网上搜索了一下,http://blogs.msdn.com/ishai/archive/…24/165143.aspx 还真有个说法。但是我没有看懂。他只是说这种指令能够做到“热打补丁”而不用重新启动应用程序。 A: The hot patching tech involves both short jump and a real jump. The mov esi,esi is used to reserve the space for the short jump.And before the move instruction, there should be always 5 nop instrunctions for the real…

23