今天干活时突然不能运行一个程序了。错误信息是不能删除一个临时文件。在Kill了所有可能访问这个文件的程序后,我还是得到这个讨厌的错误信息。
我刚好知道一个工具可以帮我:
http://www.sysinternals.com/ntw2k/freeware/handle.shtml
下载完这个程序后,发现Program Manager 是罪魁祸首。只好Log Off 再Log In了。
网页上有关于该工具的使用说明。这个网站上还有一些很棒的工具:
比如FileMon(文件监视器), RegMon(Registry监视器)
这些工具对调试程序也很有用。
顺便说一句,作者是Mark Russinovich,Inside Windows 2000的作者。牛人之一。
Christopher Brumme是CLR的Architect。他是为数不多的几个对CLR了如指掌的人。
个人认为他的Blog属于必读:
http://blogs.msdn.com/cbrumme/
看来我的Post起到了抛砖引玉的作用。知秋一叶给出了一个很完整的答案。另外也说明开心需要加快“警告”潜水员的频率
。
我再补充几点:
(1)在Vadump的输出中你会见到一系列的模块。如果你想知道为什么该模块会被载入。Windbg可以帮助你。具体步骤如下:
l Windbg <application executable name>
l 输入命令 “sxe –c “kb” ld:<module name>”. 模块名是第五列中的名字。
l 输入命令”g”.
l 在指定的模块被装载时,Windbg会中断程序的执行并打印调用堆栈。
(2)细心的人可能已经注意到对于托管代码模块,进程中会有两个备份:
40 2 38 0 mscorlib.dll
124 66 58 0 mscorlib.dll
其中的一个是IL Assembly,另一个是预先编译好的Native代码。预编译的Native代码是有NGen工具生成的。关于Ngen,CLR组的PUM Jason Zander写了一篇不错的文章:
http://blogs.gotdotnet.com/jasonz/PermaLink.aspx/159ab473-b82a-44c0-a2b2-3ee5429a3d3b
这片文章也较详细的说明了内存共享的问题。
他还写了一篇关于Windbg的文章(不是很完整):
http://blogs.gotdotnet.com/jasonz/PermaLink.aspx/ca4a6a32-978a-4682-8048-4fcfffaff770
不过里面有一些Link很有用:
http://msdn.microsoft.com/msdnmag/issues/03/06/Bugslayer/
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/DBGrm.asp
(3)如果你在写带GUI的应用程序,不妨在你测试程序中加入一个检查Working Set的Case:在起动程序后使用Vadump来得到Working Set并和你的Baseline文件进行比较。如果Working Set的Delta超过一定的数量,那么你的新Code中有些值得注意的问题。
开心就好问了我一个极有挑战性的问题(压力好大:)):
为什么一个简单的托管程序会使用如此多的内存空间。
对这个问题,我现在并没有一个完整的答案。
不过我想向大家介绍一个内存查看工具:vadump。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/vadump-o.asp
Vadump使用起来非常简单:
vadump -p <process id> -s -o
Vadump会显示各种内存的使用量和各模块的详细信息。以后我会解释各个栏目的意思。
你可以使用tlist来得到一个进程的ID。从我上次post的连接
http://www.microsoft.com/whdc/ddk/debugging/default.mspx
下载调试工具包。 里面就包括Tlist。
我最常用的命令行是: Tlist -t
第一次post,还是先自我介绍一下吧。
我叫彭刚,在微软CLR组做程序员。创建这个blog的目的主要是为了和大家一起探讨和学习CLR的核心技术。
CLR是一个庞大的系统。对于CLR的很多方面我也是一知半解。我负责的领域有基本数据类型和数据结构以及CodeDom等属于.Net框架的类。
以后我会不定期的贴一些关于如下方面的文章:
(1)设计指南(design guidelines)。不知道到有没有人有兴趣和我一起翻译英文版的设计指南?
(2)如何编写高质量,高效率的托管代码。
(3)调试CLR的技巧,主要是如何使用WINDBG(一个免费的调试器)来调试复杂的问题。
http://www.microsoft.com/whdc/ddk/debugging/default.mspx
(4)Generics。
大家如果有特别感兴趣的方面或特别希望在基本类库(mscorlib.dll和system.dll)中见到的功能,不妨给我留个言。