Windbg调试windows handle泄漏

本文介绍了如何使用windbg工具解决Windows Handle泄漏问题,特别是针对Winform程序的user object泄漏。通过loadby命令加载sos调试扩展,检查堆中内存使用情况,使用!dumpheap等命令定位泄漏页面,通过!gcroot查找强引用,从而找到并解决泄漏源头。此外,还提醒了避免在foreach循环中释放控件资源的错误做法。
摘要由CSDN通过智能技术生成

Visual Studio是开发时常用的利器,但是有些情况还是需要用到windbg作为调试工具,
1. windbg安装方便,直接拷贝也可以使用
2. windbg更为轻量级,内存占用更少
3. windbg可以方便的在没有源代码时支持调试
4. windbg可以支持调试脚本
5. windbg可以方便的进行内存检查
6. windbg可以查看crash dump

在工作的时候可以用windbg来解决以下几个方面的问题。

调试crash dump
调试winform程序user object泄露
调试没有源代码支持的客户机上的程序

进行托管程序的调试,需要用loadby命令先加载sos.dll这个调试扩展。有的时候调试的dump所加载的mscorwks版本跟调试机上的版本不一致,最简单的方法就是截取dump文件的机器上得到相应的mscorwks.dll拷贝到windbg的安装目录下,按照版本命名如mscordacwks_x86_x86_2.0.50727.3607.dll。
.loadby sos mscorwks

调试user object泄漏

产生原因
Winform程序中经常会由于资源没有正确的释放导致产生user object的泄漏,最终导致系统抛出"Error creating window handle"的异常。打开任务管理器在选项中选中user object,可以看到user object的在winform程序中已经明显超过其他应用程序。在默认设置下每个进程可以允许10000个user object,超出了这个限制异常就会发生。

解决user object泄漏的问题一般要关注下面几个方面,
1. 页面级别的泄漏(form level)
2. 控件级别的泄漏(control level)
3. 其他非托管资源的泄漏(other class implemented IDisposible)

调试方法
1. windbg attach到应用程序
2. 加载sos调试扩展(.loadby sos mscorwks)
3. 查看堆中内存使用情况(!dumpheap -stat)
0:006> .loadby sos mscorwks
0:006> !dumpheap -stat

PDB symbol for mscorwks.dll not loaded
total 3814 objects
Statistics:
      MT    Count    TotalSize Class Name
......
7932a2d4       80         1280 System.WeakReference
7b2260cc       46         1288 System.Windows.Forms.MouseEventArgs
7932b3a4       58         1392 System.Collections.Stack
79333178       26         1456 System.Collections.Hashtable
79329d90       48         1536 System.EventHandler
79331ca4       82         1640 System.RuntimeType
79331754       17         1700 System.Char[]
7b221628       34         1768 System.Windows.Forms.CreateParams
79330740      148         1776 System.Object
7b21e9d0       11         1848 System.Windows.Forms.TextBox
7b21a9c4       11         1848 System.Windows.Forms.Button
7b220ef0       34         1904 System.Win

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值