2016-04-18 88 views
3

我調試一個過程,就像是冷凍:調試NotificationEvent在內核調試(Windows)中

  • 我懷疑的根本原因是低於THREAD 877f4030 Cid 0568.0fb8線程被阻塞在用戶模式調用GetOverlappedResult

我已打開kd.exe的轉儲。

也就是說,我很想知道更多關於NotificationEvent這顯然永遠不會釋放我們的線程。

在線程信息有:

879f6fdc NotificationEvent 

在什麼類型,我應該投地址879f6fdc?或者我應該在哪個結構域中搜索它,以便理解或者瞭解阻礙情況的線索?

就Thread Thread而言,此線程當前不會列出任何處於非期望或未完成狀態的IRP。


下面爲相應的線程整個線程信息:

THREAD 877f4030 Cid 0568.0fb8 Teb: 7ff3d000 Win32Thread: 00000000 WAIT: (UserRequest) UserMode Non-Alertable 
    879f6fdc NotificationEvent 
Not impersonating 
DeviceMap     89809fc8 
Owning Process   87950030  Image:   OurProduct.exe 
Attached Process   N/A   Image:   N/A 
Wait Start TickCount  1472232  Ticks: 5394 (0:00:01:24.146) 
Context Switch Count  2791788  IdealProcessor: 0 
UserTime     00:00:06.848 
KernelTime    00:00:09.890 
Win32 Start Address MSVCR120!_threadstartex (0x721fbfb4) 
Stack Init 8c761fd0 Current 8c761bc8 Base 8c762000 Limit 8c75f000 Call 0 
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 
Kernel stack not resident. 
ChildEBP RetAddr Args to Child 
8c761be0 824cfced 877f4030 00000000 8ab36120 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 
8c761c18 824ceb4b 877f40f0 877f4030 879f6fdc nt!KiSwapThread+0x266 
8c761c40 824c856f 877f4030 877f40f0 00000000 nt!KiCommitThreadWait+0x1df 
8c761cb8 8267ae07 879f6fdc 00000006 826bca01 nt!KeWaitForSingleObject+0x393 
8c761d20 8248f8a6 00001018 00000000 00000000 nt!NtWaitForSingleObject+0xc6 
8c761d20 774f7094 00001018 00000000 00000000 nt!KiSystemServicePostCall (FPO: [0,3] TrapFrame @ 8c761d34) 
09f9f61c 774f6a24 758b179c 00001018 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 
09f9f620 758b179c 00001018 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) 
09f9f68c 758b7841 00001018 ffffffff 00000000 KERNELBASE!WaitForSingleObjectEx+0x98 (FPO: [Non-Fpo]) 
09f9f6a0 758cb9e1 00001018 ffffffff 064f3d10 KERNELBASE!WaitForSingleObject+0x12 (FPO: [Non-Fpo]) 
09f9f6b8 745be159 00001018 0639ee0c 09f9f6ec KERNELBASE!GetOverlappedResult+0x57 (FPO: [Non-Fpo]) 

什麼是繼續並知道哪些事件或同步機制是不完善的正確方法?


在NotificationEvent地址一些命令:

0: kd> !object 879f6fdc 
879f6fdc: Not a valid object (ObjectType invalid) 

0: kd> dt nt!_KEVENT 879f6fdc 
    +0x000 Header   : _DISPATCHER_HEADER 

然後:

0: kd> dt nt!_DISPATCHER_HEADER 879f6fdc 
    +0x000 Type    : 0 '' 
    +0x001 TimerControlFlags : 0 '' 
    +0x001 Absolute   : 0y0 
    +0x001 Coalescable  : 0y0 
    +0x001 KeepShifting  : 0y0 
    +0x001 EncodedTolerableDelay : 0y00000 (0) 
    +0x001 Abandoned  : 0 '' 
    +0x001 Signalling  : 0 '' 
    +0x002 ThreadControlFlags : 0x4 '' 
    +0x002 CpuThrottled  : 0y0 
    +0x002 CycleProfiling : 0y0 
    +0x002 CounterProfiling : 0y1 
    +0x002 Reserved   : 0y00000 (0) 
    +0x002 Hand    : 0x4 '' 
    +0x002 Size    : 0x4 '' 
    +0x003 TimerMiscFlags : 0 '' 
    +0x003 Index   : 0y0 
    +0x003 Processor  : 0y00000 (0) 
    +0x003 Inserted   : 0y0 
    +0x003 Expired   : 0y0 
    +0x003 DebugActive  : 0 '' 
    +0x003 ActiveDR7  : 0y0 
    +0x003 Instrumented  : 0y0 
    +0x003 Reserved2  : 0y0000 
    +0x003 UmsScheduled  : 0y0 
    +0x003 UmsPrimary  : 0y0 
    +0x003 DpcActive  : 0 '' 
    +0x000 Lock    : 0n262144 
    +0x004 SignalState  : 0n0 
    +0x008 WaitListHead  : _LIST_ENTRY [ 0x877f40f0 - 0x877f40f0 ] 

從以前的調查中,我還記得,如果+0x003 DpcActive爲1,這將意味着我們會等待一些硬件操作將其設置爲0.但是在這種情況下它是0.

所以現在,我只是不知道這個NotificationEvent正在等待什麼。 有什麼想法?

+0

嘗試獲取更完整的用戶堆棧跟蹤以查看GetOverlappedResult()的調用情況。試試'.process/p/r 87950030; .thread/p/r 877f4030; kb'這是否顯示更多堆棧幀到用戶堆棧? –

+0

我刪除了additinal stackframes,從我們的產品調用。調用':: CancelIo(port)後調用GetOverlappedResult; '和':: PurgeComm(端口,PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);'等待並保證操作完成。 Msdn表示,這兩項操作在被調用後不能保證完成。 –

+0

你打電話'GetOverlappedResult()'之前確保'CancelIo()'返回TRUE?如果'CancelIo()'返回false,那麼沒有I/O被取消,因此'GetOverlappedResult(...,BWAIT = TRUE)'*可能*不會再回來。我說*可能*,因爲I/O可能在您調用'CancelIo()'之前完成。 –

回答

1

事件不會等待,線程做。通知事件由任何執行操作的人發出信號,然後通知服務員完成操作。換句話說,你的棧是一個異步IO的例子,我們在這裏傳遞一個帶有hEvent集合的重疊結構。參考https://msdn.microsoft.com/en-us/library/windows/desktop/ms684342(v=vs.85).aspx

您應該檢查已安排此IO的來源或我們正在等待的IO類型,而不是傾出事件。操作完成後,該事件將發出信號。