具体内容参见 熊力的《Windows用户态程序高效排错》以及他的Blog,http://lixiong.cnblogs.com/。这些内容对我的工作帮助很大,在此感谢他!(对于不愿意在测试工具上投入太多财力的公司来说,此方法较好)
下面简单列一下:
- 内存泄露:使用WinDbg中的gflags和umdh进行定位查找。
- 句柄泄露:使用Application Verifier和WinDbg进行定位查找。通过Application Verifier对调试程序激活“Handles - Detect invalid handle usage”;通过WinDbg中的!handle和!htrace命令跟踪句柄增涨情况。
- GDI泄露:参考 Detect and Plug GDI Leaks in Your Code with Two Powerful Tools for Windows XP 和 Resource Leaks: Detecting, Locating, and Repairing Your Leaky GDI Code
- 其他:
Desktop heap是一类特殊的内存。下面这些kb对此有一些描述:
PRB: User32.dll or Kernel32.dll fails to initialize
http://support.microsoft.com/kb/184802/en-us
"Out of Memory" error message appears when you have a large number of programs running
http://support.microsoft.com/kb/126962/en-us
到support.microsoft.com 上搜索desktop heap,可以找到更多的信息。Windows除了使用进程来管理资源外,还是用Session和desktop来管理资源。比如只有在同一个Session里面的进程才可以共享剪贴板数据,Windows Message只能在属于同一个desktop的进程之间传递。而desktop heap,是操作系统管理的,为不同session创建的,由同一session内所有desktop共享的内存。当创建进程,创建GUI的时候,都会消耗desktop heap。当Desktop Heap用光后,系统中各种莫名其妙的问题就会发生。比如无法创建新进程,无法弹出菜单,API调用会莫名其妙地出错。
Desktop heap用光的原因往往是太多进程同时运行,或者创建了太多GUI object。怀疑是Desktop heap相关问题的时候,首先可以用下面这篇文章的方法来检查是否Desktop heap用光:
A new System log entry is not generated if the desktop heap is exhausted in Microsoft Windows 2000
http://support.microsoft.com/kb/810807/en-us
如果确认是desktop heap问题后,检察系统是否有太多进程在同时运行,(我曾经见过一百多个dllhost进程同时运行的情况),或者某一程序有特殊的GUI操作。在优化系统,优化代码后,如果的确需要使用很多desktop heap,可以参考前面的kb改变注册表来做调整。
除了上面这些系统资源外,还有其它很多资源都可能出现问题,比如TCP Port用光。
When you try to connect from TCP ports greater than 5000 you receive the error 'WSAENOBUFS (10055)'