|
在window平臺下,產(chǎn)生并進入臨界區(qū)EnterCriticalSection之后不釋放,用handlespy檢測,會產(chǎn)生一定數(shù)量的全局Event句柄泄露,甚是奇怪,開始以為EnterCriticalSection被重載了,幾經(jīng)折騰,基本定位在EnterCriticalSection自身,列堆棧以觀之,發(fā)現(xiàn)EnterCriticalSection內(nèi)部調(diào)用了NTCreateEvent函數(shù), google一把,大概是說在多核處理器上,有時候會需要通過創(chuàng)建全局Event來干點啥CPU同步的事情,所以,在我的四核開發(fā)機器上,大概每20次就調(diào)用就會產(chǎn)生一次Event泄露。 知道原因好辦了,為CriticalSection增加引用計數(shù)器,沒人用刪掉,發(fā)了幾十萬筆,泄露為0,解決之。
工具:查泄露工具: HandleSpy.exe 開源工具,通過比較兩次快照就能得到泄露的代碼行,犀利。查句柄工具: SysinternalsSuite 包內(nèi)的 handle.exe
順便鄙視一下windows8,任務(wù)管理器把handle計數(shù)器全搞沒了,對于我們這些搞開發(fā)的,真的非常不方便。
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
|
|