|
在window平台下,产生并进入临界区EnterCriticalSection之后不释放,用handlespy检测,会产生一定数量的全局Event句柄泄露,甚是奇怪,开始以为EnterCriticalSection被重载了,几经折腾,基本定位在EnterCriticalSection自身,列堆栈以观之,发现EnterCriticalSection内部调用了NTCreateEvent函数, google一把,大概是说在多核处理器上,有时候会需要通过创建全局Event来干点啥CPU同步的事情,所以,在我的四核开发机器上,大概每20次就调用就会产生一次Event泄露。 知道原因好办了,为CriticalSection增加引用计数器,没人用删掉,发了几十万笔,泄露为0,解决之。
工具:查泄露工具: HandleSpy.exe 开源工具,通过比较两次快照就能得到泄露的代码行,犀利。查句柄工具: SysinternalsSuite 包内的 handle.exe
顺便鄙视一下windows8,任务管理器把handle计数器全搞没了,对于我们这些搞开发的,真的非常不方便。
C:\Code\TechLab\MyTest\MyTest\Release>handle.exe -s -p kdfixgw.exe
Handle v3.51
Copyright (C) 1997-2013 Mark Russinovich
Sysinternals
Handle type summary:
ALPC Port : 4
Desktop : 1
Directory : 4
EtwRegistration : 71
Event : 99
File : 99
IoCompletion : 2
Key : 21
Mutant : 48
Section : 92
Semaphore : 104
Thread : 59
Timer : 3
TpWorkerFactory : 1
WaitCompletionPacket: 2
WindowStation : 2
Total handles: 612
|
|