首页 > 解决方案 > ApplicationHang - PeekMessage

问题描述

我正在调查应用程序挂起(winforms)。它只发生在客户机器上。他们从冻结过程中为我们提供了 dmp。但我不确定如何解释数据。

我将文件加载到 WinDbg 中。

  1. !dlk => 没有死锁

  2. !分析-挂起

    FAULTING_THREAD: 00003aec (这是主线程) WATSON_BKT_EVENT: AppHang ERROR_CODE: (NTSTATUS) 0xcfffffff - EXCEPTION_CODE_STR: cfffffff DERIVED_WAIT_CHAIN:

    Dl Eid Cid WaitType


    0 3ae8.3aec COM
    => 对我来说看起来像是主线程上的 COM 问题

  3. !转储堆栈

    user32!_PeekMessage+0x42, 调用 win32u!NtUserPeekMessage combase!CCliModalLoop::MyPeekMessage+0x52, 调用 user32!PeekMessageW user32!PeekMessageW+0x149, 调用 user32!_PeekMessage user32!PeekMessageW+0x149, 调用 user32!_PeekMessage combase!CCliModalLoop::MyPeekMessage+ 0x52, 调用 user32!PeekMessageW combase!CCliModalLoop::MyPeekMessage+0x52, 调用 user32!PeekMessageW combase!CCliModalLoop::HandleWakeForMsg+0x13b, 调用 combase!CCliModalLoop::SetPointerInputModeAsAppropriateForQueueAttachmentConditions combase!CCliModalLoop::PeekRPCAndDDEMessage+comdalLoop::PeekRPCAndDDEMessage+0x49! MyPeekMessage combase!CCliModalLoop::RevertToNormalPointerInputMode+0x1d,调用 combase!CCliModalLoop::IsAttachedQueuePointerMessageReorderingAllowed combase!CCliModalLoop::BlockFn+0x262,调用 combase!CCliModalLoop::PeekRPCAndDDEMessage combase!ClassicSTAThreadWaitForHandles+0x9f, calling combase!CCliModalLoop::BlockFn clr!PrepareCriticalFinalizerObject+0x5e, calling clr!_security_check_cookie combase!CoWaitForMultipleHandles+0x76, calling combase!_guard_dispatch_icall_nop clr!MsgWaitHelper+0x8e, calling combase!CoWaitForMultipleHandles clr!ThreadStateNCStackHolder::~ThreadStateNCStackHolder+0x1c , 调用 clr!GetThread clr!Thread::DoAppropriateWaitWorker+0x2e6, 调用 clr!MsgWaitHelper clr!Thread::DoAppropriateWait+0x7d, 调用 clr!Thread::DoAppropriateWaitWorker clr!WaitHandleNative::CorWaitOneNative+0x161, 调用 clr!Thread::DoAppropriateWa KERNELBASE!CreateEventW+0x8c,调用 ntdll!RtlSetLastWin32Error :CoWaitForMultipleHandles+0x76, 调用 combase!_guard_dispatch_icall_nop clr!MsgWaitHelper+0x8e, 调用 combase!CoWaitForMultipleHandles clr!ThreadStateNCStackHolder::~ThreadStateNCStackHolder+0x1c, 调用 clr!GetThread clr!Thread::DoAppropriateWaitrWorker!::::WaitHel DoAppropriateWait+0x7d, 调用 clr!Thread::DoAppropriateWaitWorker clr!WaitHandleNative::CorWaitOneNative+0x161, 调用 clr!Thread::DoAppropriateWait KERNELBASE!CreateEventW+0x8c, 调用 ntdll!RtlSetLastWin32Error :CoWaitForMultipleHandles+0x76, 调用 combase!_guard_dispatch_icall_nop clr!MsgWaitHelper+0x8e, 调用 combase!CoWaitForMultipleHandles clr!ThreadStateNCStackHolder::~ThreadStateNCStackHolder+0x1c, 调用 clr!GetThread clr!Thread::DoAppropriateWaitrWorker!::::WaitHel DoAppropriateWait+0x7d, 调用 clr!Thread::DoAppropriateWaitWorker clr!WaitHandleNative::CorWaitOneNative+0x161, 调用 clr!Thread::DoAppropriateWait KERNELBASE!CreateEventW+0x8c, 调用 ntdll!RtlSetLastWin32Error :DoAppropriateWaitWorker clr!WaitHandleNative::CorWaitOneNative+0x161, 调用 clr!Thread::DoAppropriateWait KERNELBASE!CreateEventW+0x8c, 调用 ntdll!RtlSetLastWin32Error :DoAppropriateWaitWorker clr!WaitHandleNative::CorWaitOneNative+0x161, 调用 clr!Thread::DoAppropriateWait KERNELBASE!CreateEventW+0x8c, 调用 ntdll!RtlSetLastWin32Error :

我不确定如何进一步调查/解释这一点。从堆栈中,我猜想发生一些 COM 事情的线程没有响应。对“PeekMessage”的调用可能表明消息队列损坏/无响应。带有“SetPointerInputModeAs...”的行对我来说似乎也很可疑。

任何建议或想法任何人?

亲切的问候

标签: .netwinformsfreezewindbgpeekmessage

解决方案


推荐阅读