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