代码之家  ›  专栏  ›  技术社区  ›  Benj

如何在内核调试会话中计算WinDBG等待的事件

  •  3
  • Benj  · 技术社区  · 14 年前

    我是一个十足的WinDbg新手,我一直在尝试调试一个WindowsXP问题,一个客户把这个问题发给我,我们的软件和一些第三方软件阻止windows注销。我已经重现了这个问题,并且验证了只有当我们的软件和客户的软件都安装好(虽然不一定在注销时运行)时,才会出现注销问题。我注意到,当用户试图注销时,WM\u ENDSESSION消息没有到达正在运行的窗口,我知道第三方软件使用内核驱动程序。

    我一直在查看WinDbg中的进程,我知道csrss.exe通常会向所有的windows发送WM\u ENDSESSION消息。当我跑的时候:

    !流程82356020 6

    WARNING: Frame IP not in any known module. Following frames may be wrong.
            00000000 00000000 00000000 00000000 00000000 0x7c90e514
    
            THREAD 8246d998  Cid 0248.02a0  Teb: 7ffd7000 Win32Thread: e1627008 WAIT: (WrUserRequest) UserMode Non-Alertable
                8243d9f0  SynchronizationEvent
                81fe0390  SynchronizationEvent
            Not impersonating
            DeviceMap                 e1004450
            Owning Process            82356020       Image:         csrss.exe
            Attached Process          N/A            Image:         N/A
            Wait Start TickCount      1813           Ticks: 20748 (0:00:05:24.187)
            Context Switch Count      3                 LargeStack
            UserTime                  00:00:00.000
            KernelTime                00:00:00.000
            Start Address 0x75b67cdf
            Stack Init f80bd000 Current f80bc9c8 Base f80bd000 Limit f80ba000 Call 0
            Priority 14 BasePriority 13 PriorityDecrement 0 DecrementCount 0
            Kernel stack not resident.
            ChildEBP RetAddr  Args to Child              
            f80bc9e0 80500ce6 00000000 8246d998 804f9af2 nt!KiSwapContext+0x2e (FPO: [Uses EBP] [0,0,4])
            f80bc9ec 804f9af2 804f986e e1627008 00000000 nt!KiSwapThread+0x46 (FPO: [0,0,0])
            f80bca24 bf80a4a3 00000002 82475218 00000001 nt!KeWaitForMultipleObjects+0x284 (FPO: [Non-Fpo])
            f80bca5c bf88c0a6 00000001 82475218 00000000 win32k!xxxMsgWaitForMultipleObjects+0xb0 (FPO: [Non-Fpo])
            f80bcd30 bf87507d bf9ac0a0 00000001 f80bcd54 win32k!xxxDesktopThread+0x339 (FPO: [Non-Fpo])
            f80bcd40 bf8010fd bf9ac0a0 f80bcd64 00bcfff4 win32k!xxxCreateSystemThreads+0x6a (FPO: [Non-Fpo])
            f80bcd54 8053d648 00000000 00000022 00000000 win32k!NtUserCallOneParam+0x23 (FPO: [Non-Fpo])
            f80bcd54 7c90e514 00000000 00000022 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f80bcd64)
    

    这个waitForMultipleObjects看起来很有趣,因为我想知道csrss.exe是否正在等待某个不允许注销的事件。有人能告诉我怎样才能知道它在等待什么事件吗?我还可以做些什么来进一步调查这个问题?

    2 回复  |  直到 14 年前
        1
  •  7
  •   snoone    14 年前

        THREAD 8246d998  Cid 0248.02a0  Teb: 7ffd7000 Win32Thread: e1627008 WAIT: (WrUserRequest) UserMode Non-Alertable  
            8243d9f0  SynchronizationEvent  
            81fe0390  SynchronizationEvent  
    

    不过,我要注意的是,您正在查看的线程是一个公共线程,几乎您所查看的每个系统都会有它(不确定该线程的确切用途,但我可以识别堆栈…有时我觉得这样做太久了!)。

    我还要注意的是,您不能一直信任堆栈上的参数。请参见以下详细信息: http://analyze-v.com/?p=7

    -斯科特

        2
  •  2
  •   Jason Evans    14 年前

    !object 82475218

    如果没有帮助,请尝试以下方法:

    http://blogs.msdn.com/search/SearchResults.aspx?q=KeWaitForMultipleObjects

    这是在寻找 KeWaitForMultipleObjects 在NT调试博客上,这是一个很好的了解Windows内部结构的博客。

    这是你的文件 KeWaitForMultipleObjects公司

    http://msdn.microsoft.com/en-us/library/ff553324.aspx 干杯。