创建窗口句柄时出错(error creating window handle)
创建窗口句柄错误。这个错误非常头疼,难以排查,我从网络上搜集了一些排查方案。
可能的原因:
- 窗口句柄泄露,句柄数超过1W。
- 用户对象超过1W,错误提示“当前程序已使用了 Window 管理器对象的系统允许的所有句柄”。
下面的方案适用于窗口句柄泄露的情况。
1.通过任务管理器
,选择句柄数
、用户对象
、GDI对象
,来查看进程是否有异常, 一般报这个错误时,句柄数都接近1W,而Windows对单个程序的句柄限制是1W。
2.下载安装Windbg,加载程序,执行以下命令
1. !htrace -enable
2. g / break #开始程序,然后断点
3. !htrace -snapshot
4. g / break
5. !htrace -diff
查看产生的句柄,发现都是同一线程创建的句柄,记住线程ID
!runaway #列出所有的线程
!8s #切换到线程8 ,当然,8替换成你的线程ID
!clrstack #查看当前线程堆栈
资料:
http://stackoverflow.com/questions/222649/winforms-issue-error-creating-window-handle
http://stackoverflow.com/questions/88904/error-creating-window-handle
http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx
http://www.cnblogs.com/wlflovenet/p/debugCpu100.html
WinDbg
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi