客户端程序出现句柄泄露时查找办法

背景
有些客户反应客户端程序操作一段时间后,查看任务管理器发现客户端程序占用句柄数过多,怀疑存在句柄泄露问题。针对该问题,现场测试多个场景,把出现问题的范围缩小。现发现在以下两个场景下,会出现句柄泄露:
1、 打开客户端程序后操作交易
2、 在文本框中切换输入法(百度输入法2.10版本)
使用handle.exe收集数据并分析后,已经确定是由于客户端程序中使用键盘钩子与百度输入法自带Bug导致句柄泄露,但排查时还是浪费了大量时间,几经转折才查出原因。下面说明下如何使用Windbg来准确快速的定位问题。
排查步骤
首先,什么是句柄,微软是如下描述的:
An object is a data structure that represents a system resource, such as a file, thread, or graphic image. An application cannot directly access object data or the system resource that an object represents. Instead, an application must obtain an object handle, which it can use to examine or modify the system resource. Each handle has an entry in an internally maintained table. These entries contain the addresses of the resources and the means to identify the resource type

排查问题主要分下面几步:
1、安装Windbg工具
2、运行存在问题的应用程序
3、Windbg连接该程序
4、执行“!htrace –enable“命令,打开堆栈追踪
5、执行“!htrace -snapshot”命令,建立快照
6、开始Debug,操作应用程序
7、停止Debug,执行“!htrace -diff”命令,找到泄露句柄的堆栈信息

下面具体说明下每一步操作,前两步不在赘述,从第3步开始

如下图所示,连接该应用程序

执行“!htrace –enable“与“!htrace -snapshot”命令

选择Debug中的“Go”,按句柄增加的场景操作应用程序,并观察任务管理器中的句柄数

观察到任务管理器中的句柄数增加后,停止Debug

执行“!htrace -diff”命令,可以看到该句柄及申请句柄的程序堆栈信息,下面的图片中可以直接看到是“swt_extension_win32”的”HookProc”方法申请的句柄。现在问题已经可以确定是由于此处导致。

执行“!handle xx f”命令,可以看到该句柄与handle.exe工具收集到的信息一致

同样,切换输入法时句柄增加可以得到下图数据,可以看到是“UIPFull”的”DllCanUnloadNow”方法申请的句柄

打开百度输入法安装目录,可以看到如下信息,从而可以确定本次泄露是由百度输入法导致:

总结
应用程序在出现句柄泄露时会引起一定的恐慌,误认为此问题会比较严重,从而对查找问题造成一定的干扰。其实,句柄泄露并不可怕,客户端在存在句柄泄露问题的情况下,依旧可以长时间稳定高效运行。不过查出句柄泄露原因还是很有必要的,查找时可使用handle.exe与windbg配合来使用,先确定出现泄露的场景,然后使用工具在该场景中收集数据,分析问题。
备注
注意事项:
使用”!htrace –diff”命令时,在安装win8系统的机器上无法打印出堆栈信息,XP系统的机器上可以打印完整信息。
参考链接:
http://blog.csdn.net/hgy413/article/details/7631187
https://msdn.microsoft.com/en-us/library/windows/hardware/ff563208(v=vs.85).aspx

Windbg可以从微软官网下载~
————————————————
from:https://blog.csdn.net/ll413343176/article/details/49453079

原文地址:https://www.cnblogs.com/lidabo/p/12072443.html

时间: 2024-08-05 12:46:20

客户端程序出现句柄泄露时查找办法的相关文章

java服务器客户端程序在联机运行时被防火墙拦截

最近在myeclipse上写了份网络象棋的代码,包含服务器端和客户端,让朋友下载后运行客户端,连不上我开的服务器,但我关闭自己的防火墙后他才连上,我尝试把程序设为防火墙信用程序,但不行,求大神指导!!希望大家可以留言,帮一下忙,本人自学的java,有些东西不是太了解!随笔至少150字,以下是凑字数 RFID应用系统基本功能模拟 [问题描述] 设计开发一支可连接实验系统平台并可进行以下操作的应用程序: 识别电子标签 读取单个或多个Block中数据 写入标签单个Block中数据 可执行使电子标签进入

c/c++编译时,指定程序运行时查找的动态链接库路径

http://blog.csdn.net/tsxw24/article/details/10220735 c/c++编译时,指定程序运行时查找的动态链接库路径 分类: c/c++ linux 2013-08-23 14:04 1117人阅读 评论(0) 收藏 举报 [plain] view plaincopy $ g++ -Wl,-rpath,/usr/local/lib/ -oevh libevent_http.cpp -levent -Wl,-rpath,  用于指定程序运行时查找动态链接库

平台服务器句柄泄露问题的排查与解决

我们监控平台有台报警服务器,其主要功能是接收前端,TDDC,网管服务器等发送的报警,并依据报警联动配置进行相应的联动操作,最近发现在该服务器运行过程中,通过任务管理器查看其句柄数量会不断增加,以至于影响其他服务器工作,初步怀疑是句柄泄露问题,现对其进行分析排查. 句柄是Windows用来标识应用程序所建立或使用的对象的唯一整数,Windows的内核对象包括进线程,窗口,位图,GDI对象等等.应用程序通过句柄访问内核对象,当使用完内核对象之后需要释放资源关闭该内核对象句柄,如果未能正确关闭,则会造

.NET对象与Windows句柄(三):句柄泄露实例分析

在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,但由于忘记调用DataAnalyzer的Stop方法,导致产生句柄泄露.本文假定我们已经发现了泄露现象但还不知道原因,讨论如何在这种情况下分析问题. 一.发现问题 在程序运行约一个小时以后,通过任务管理器发现句柄数超过5000,线程数也超过1000.对于一段只需要并行接收和分析数据的简易代码来说,这

使用SDWebImage加载大量图片后造成内存泄露的解决办法 转载

使用SDWebImage加载大量图片后造成内存泄露的解决办法 时间:2015-07-21 14:26:47      阅读:5885      评论:0      收藏:0      [点我收藏+] SDWebImage的知名度就不用说了,github上近10k的star,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,在UITableView中不断加载更多的内容,使用SDWebImage会造成内存占用越来越大,导致memory warning最终terminate,稍微找了下

linux句柄泄露问题查看

背景: 我们在开发linux在线服务器的时候经常会遇会句柄泄露的问题.因为在linux系统设计里面遵循一切都是文件的原则,即磁盘文件.目录.网络套接字.磁盘.管道等,所有这些都是文件,在我们进行打开的时候会返回一个fd,即是文件句柄.如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象.在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个,如果超过了这个限制,进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对

句柄泄露实例分析

句柄泄露实例分析 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子.例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,但由于忘记调用DataAnalyzer的Stop方法,导致产生句柄泄露.本文假定我们已经发现了泄露现象但还不知道原因,讨论如何在这种情况下分析问题. 一.发现问题 在程序运行约一个小时以后,通过任务管理器发现句柄数超过5000,线程数也超过1000.对于一段只需要并行接收和分析数据

0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序

1.select 模型 1.1 select 函数原型如下,其中 nfds 表示的描述符的最大值加1(因为这里是左闭右开区间),中间三个参数分别表示要监听的不同类型描述符的集合,timeout用来表示轮询的时间间隔,这里用NULL表示无限等待. 1.2 使用 select函数编写客户端程序的一般步骤: a)初始化参数,包括初始化监听集合read_set并添加fd,以及初始化监听的最大描述符 maxfd 和select的返回值 nready: b)将read_set 赋值给 ready_set,因

.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子

上一篇文章介绍了句柄的基本概念,也描述了C#中创建文件句柄的过程.我们已经知道句柄代表Windows内部对象,文件对象就是其中一种,但显然系统中还有更多其它类型的对象.本文将简单介绍Windows对象的分类. 句柄可以代表的Windows对象分为三类,内核对象(Kernel Object).用户对象(GDI Object)和GDI对象,上一篇文章中任务管理器中的“句柄数”.“用户对象”和“GDI对象”计数就是与这几类对象对应的.为什么要这样分类呢?原因就在于这几类对象对于操作系统而言有不同的作用