谈”句柄泄漏”

转载 2015年11月19日 15:35:39

“泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(memory leak),本文介绍一种新的泄漏—句柄泄漏(handle leak)。在windows系统的程序中,我们经常会遇到句柄这个词,而且windows也抽象出了一种句柄类型HANDLE。在unix系统的系统中,句柄这个词用的不是很多。我们用另一个词描述它—文件描述符(file descriptior)。这里的文件是指广义的文件,因为在unix系统中,everything is a file。总的说来,句柄是指操作系统给我们的应用程序的进程分配的,用来标识某种资源的符号。这里的资源,可以是狭义的文件,可以是socket连接,也可以是一个对象。

现在,这里以linux环境中的一个socket连接中的句柄泄漏的例子来说明句柄泄漏的情况:有三个应用程序A,B,C,它们运行在不同的机器上,它们之间通过socket接口进行通信。其中A和B之间通信,A是服务端;B是客户端,B和C之间通信,B是服务端,C是客户端。它们之间的通信都是TCP的。现在,B要给A发送数据,B在发送前,如果发现和A之间的连接断开,就会去重连,在重连的时候,B并没有close已经断开连接的socket id。这样,B重连A多次之后,操作系统分配给它的socket id都将会被用完。那么,现在C如果来连接B, 就会出现B拒绝C连接的情况,为什么会这样呢?因为B进程里面已经没有可用来标识该连接的socket id,所以B只能拒绝服务。

上面就是一个socket句柄泄漏的例子。解决上面的问题的具体方法是:在B每次重连A的时候,调用系统提供的close()函数,把已经断开连接的socket的socket id释放。 举上面的例子,一方面是说明句柄泄漏的一种情况,另一方面,也是比较重要的方面,是让大家重视句柄的使用,能够正确使用句柄,一定要做到申请一个,就要时刻记得释放一个,要把申请和释放一一对应起来。就像内存使用中的malloc/free, new/delete一样,句柄的使用,申请和释放的api也要配对使用。

不管是内存也好,还是句柄也好,都是可以统称为资源的,对资源的使用,要求都是统一的,就是要“有借有还,再借不难”。我们要谨记“文明”使用操作系统提供给我们的资源,力争写出更加“和谐”的程序来!


Android异常一、异步任务导致的窗口句柄泄漏问题

先贴异常: 05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window co...
  • LonelyRoamer
  • LonelyRoamer
  • 2012年05月05日 10:43
  • 21391

应用句柄泄露分析实例

Monkey测试由于操作量大,并且速度比较快,总是会出来一些隐藏的比较深的问题,比如内存泄露啊,句柄泄露啊等等。 但是往往这类问题通过Monkey日志又很难直接定位到。需要有一些经验才能快速定位并解决...
  • hehui1860
  • hehui1860
  • 2016年09月02日 17:33
  • 3704

句柄泄露

介绍   欢迎来到这个调试教程系列的第5篇。在这篇文章,我们会介绍Windows中的句柄,什么是句柄以及怎么调试句柄泄露。在读这篇文章之前,我希望你对前4篇文章掌握的都还不错。这一系列的文章并不是在...
  • maomao171314
  • maomao171314
  • 2014年07月31日 14:51
  • 1457

句柄泄露与CloseHandle()

摘自:http://blog.chinaunix.net/uid-21783276-id-2689047.html CloseHandle()函数的使用?? 很多程序在创建线程都这样写的:...
  • chinaclock
  • chinaclock
  • 2015年11月23日 17:19
  • 2361

句柄泄露实例分析

在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子。例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,...
  • zhjmyx
  • zhjmyx
  • 2016年12月16日 16:51
  • 958

使用HandleSpy定位托管代码句柄泄漏

引子  我们知道句柄泄漏原因多种多样,一般泄漏的对象主要是内核句柄 、 文件句柄、互操作句柄等。 由于Framework的GC帮我们干了很多事情,所以很多C#程序员养成了吃饭后不洗碗的习惯,new出来...
  • pc0de
  • pc0de
  • 2017年05月21日 18:10
  • 894

Windows 句柄泄露学习总结

句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年03月19日 11:18
  • 2043

linux句柄泄露问题查看

背景: 我们在开发linux在线服务器的时候经常会遇会句柄泄露的问题。因为在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的...
  • daofengliu
  • daofengliu
  • 2014年07月27日 15:14
  • 6819

windbg检测句柄泄露(定位到具体代码)

1.构造一个测试用例
  • yockie
  • yockie
  • 2014年10月30日 01:12
  • 6256

谈”句柄泄漏“

“泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(memory leak),本文介绍一种新的泄漏—句柄泄漏(handle leak)。在windows系统的程序中,我们经常会遇到句柄...
  • feimataxue
  • feimataxue
  • 2012年06月07日 09:09
  • 298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈”句柄泄漏”
举报原因:
原因补充:

(最多只允许输入30个字)