gpt4 book ai didi

events - 在内核调试中调试 NotificationEvent (Windows)

转载 作者:行者123 更新时间:2023-12-01 15:13:58 28 4
gpt4 key购买 nike

我正在调试一个类似卡住的进程:

  • 我怀疑根本原因是 THREAD 877f4030 Cid 0568.0fb8 下面的线程卡在了对 GetOverlappedResult 的用户模式调用上。

我已经用 kd.exe 打开了转储。

也就是说,我有兴趣了解更多关于 NotificationEvent 的信息,它显然永远不会释放我们的线程。

在线程信息中我们有:

879f6fdc  NotificationEvent

我应该将地址 879f6fdc 转换成什么类型​​?或者我应该在哪个结构字段中搜索它,以便了解或了解是什么阻碍了这种情况?

就线程信息而言,该线程当前未列出任何处于不希望或未完成状态的 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 在等待什么。有什么想法吗?

最佳答案

事件不会等待,线程会。 NotificationEvents 由执行操作的任何人发出信号,然后通知服务员操作完成。换句话说,您的堆栈是 Async IO 的示例,我们在其中传递带有 hEvent 集的重叠结构。引用 https://msdn.microsoft.com/en-us/library/windows/desktop/ms684342(v=vs.85).aspx

您应该检查已安排此 IO 的源或我们正在等待的 IO 类型,而不是转储事件。该事件将在操作完成时发出信号。

关于events - 在内核调试中调试 NotificationEvent (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36696806/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com