程序各种资源泄露的调试方法

具体内容参见 熊力的《Windows用户态程序高效排错》以及他的Blog,http://lixiong.cnblogs.com/。这些内容对我的工作帮助很大,在此感谢他!(对于不愿意在测试工具上投入太多财力的公司来说,此方法较好)

下面简单列一下:

  1. 内存泄露:使用WinDbg中的gflags和umdh进行定位查找。
  2. 句柄泄露:使用Application Verifier和WinDbg进行定位查找。通过Application Verifier对调试程序激活“Handles - Detect invalid handle usage”;通过WinDbg中的!handle和!htrace命令跟踪句柄增涨情况。
  3. 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
  4. 其他:

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除了使用进程来管理资源外,还是用Sessiondesktop来管理资源。比如只有在同一个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)'

http://support.microsoft.com/kb/196271/en-us

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值