2009-06-10 77 views
5

我们的Windows应用程序经常挂在内存中,我试图用windbg跟踪 解决问题。我对windbg很陌生,可以使用一些建议(尽管我已经开始阅读高级Windows调试,但我仍然可以使用 )。诊断未能停止的应用程序

该应用程序是用VB编写的C++和COM对象的混合。偶尔当您退出时,应用程序似乎会消失,但任务管理器显示它在内存中挂起大约 ,显然处于空闲状态。 !

线程显示我:

ThreadCount: 2 
UnstartedThread: 0 
BackgroundThread: 2 
PendingThread: 0 
DeadThread: 0 
Hosted Runtime: no 
             PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    0 1 175c 001aa040  4220 Enabled 09131b78:09131fe8 001a2b80  0 STA 
    6 2 143c 001b4b48  b220 Enabled 00000000:00000000 001a2b80  0 MTA (Finalizer) 

为了我的未经训练的眼睛,它看起来像它被保持活由被阻止通过一个单线程公寓 敲定队列。这个 看起来是否合理?

〜0KB产量:

ntdll!KiFastSystemCallRet 
user32!NtUserGetMessage+0xc 
mfc80!AfxInternalPumpMessage+0x18 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 153] 
mfc80!CWinThread::Run+0x54 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 625] 
mfc80!AfxWinMain+0x69 [f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 47] 
WARNING: Stack unwind information not available. Following frames may be wrong. 
OurApp+0x7e8274 
kernel32!BaseProcessStart+0x23 

〜6KB产量:

ntdll!KiFastSystemCallRet 
ntdll!ZwWaitForMultipleObjects+0xc 
kernel32!WaitForMultipleObjectsEx+0x12c 
kernel32!WaitForMultipleObjects+0x18 
mscorwks!WKS::WaitForFinalizerEvent+0x7a 
mscorwks!WKS::GCHeap::FinalizerThreadWorker+0x75 
mscorwks!Thread::UserResumeThread+0xfb 
mscorwks!Thread::DoADCallBack+0x355 
mscorwks!Thread::DoADCallBack+0x541 
mscorwks!ManagedThreadBase_NoADTransition+0x32 
mscorwks!ManagedThreadBase::FinalizerBase+0xb 
mscorwks!WKS::GCHeap::FinalizerThreadStart+0xbb 
mscorwks!Thread::intermediateThreadProc+0x49 
kernel32!BaseThreadStart+0x37 

我将在这里欣赏一点点修正路线。如果我对 封锁终结者的猜测看起来合理,请告诉我。我也是 很高兴得到一些建议,弄清楚什么是封锁。

编辑:

巴蒂尔要求从输出分析!这实际上是从一个不同的转储 - 我有很多,他们都看起来几乎相同。

 
FAULTING_IP: 
+18a952f00ebdf74 
00000000 ??    ??? 

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: 00000000 
    ExceptionCode: 80000007 (Wake debugger) 
    ExceptionFlags: 00000000 
NumberParameters: 0 

BUGCHECK_STR: 80000007 

PROCESS_NAME: OurApp.exe 

OVERLAPPED_MODULE: Address regions for 'OurApp' and 'Unknown_Module_00350062' overlap 

ERROR_CODE: (NTSTATUS) 0x80000007 - {Kernel Debugger Awakened} the system debugger was awakened by an interrupt. 

EXCEPTION_CODE: (HRESULT) 0x80000007 (2147483655) - Operation aborted 

NTGLOBALFLAG: 0 

APPLICATION_VERIFIER_FLAGS: 0 

MANAGED_STACK: !dumpstack -EE 
OS Thread Id: 0x4490 (0) 
Current frame: 
ChildEBP RetAddr Caller,Callee 

DERIVED_WAIT_CHAIN: 

Dl Eid Cid  WaitType 
-- --- ------- -------------------------- 
    0 48c8.4490 Speculated (Triage) --> 
    5 48c8.4b74 Event     

WAIT_CHAIN_COMMAND: ~0s;k;;~5s;k;; 

BLOCKING_THREAD: 00004b74 

DEFAULT_BUCKET_ID: APPLICATION_HANG_BlockedOn_EventHandle 

PRIMARY_PROBLEM_CLASS: APPLICATION_HANG_BlockedOn_EventHandle 

LAST_CONTROL_TRANSFER: from 7c90df4a to 7c90e514 

FAULTING_THREAD: 00000005 

STACK_TEXT: 
0882fcd0 7c90df4a 7c809590 00000002 0882fcfc ntdll!KiFastSystemCallRet 
0882fcd4 7c809590 00000002 0882fcfc 00000001 ntdll!ZwWaitForMultipleObjects+0xc 
0882fd70 7c80a115 00000002 7a3b8d28 00000000 kernel32!WaitForMultipleObjectsEx+0x12c 
0882fd8c 79f92c5b 00000002 7a3b8d28 00000000 kernel32!WaitForMultipleObjects+0x18 
0882fdac 79f970b8 001b1ad8 0882feb0 001a0b18 mscorwks!WKS::WaitForFinalizerEvent+0x77 
0882fdc0 79e984cf 0882feb0 00000000 00000000 mscorwks!WKS::GCHeap::FinalizerThreadWorker+0x49 
0882fdd4 79e9846b 0882feb0 0882fe5c 79f7762b mscorwks!Thread::DoADCallBack+0x32a 
0882fe68 79e98391 0882feb0 9f3f02e2 00000000 mscorwks!Thread::ShouldChangeAbortToUnload+0xe3 
0882fea4 79eef74c 0882feb0 00000000 001a86c0 mscorwks!Thread::ShouldChangeAbortToUnload+0x30a 
0882fecc 79eef75d 79f9706d 00000008 0882ff14 mscorwks!ManagedThreadBase_NoADTransition+0x32 
0882fedc 79f3c6bc 79f9706d 9f3f0352 00000000 mscorwks!ManagedThreadBase::FinalizerBase+0xd 
0882ff14 79f920a5 00000000 86fb6620 804fb078 mscorwks!WKS::GCHeap::FinalizerThreadStart+0xbb 
0882ffb4 7c80b729 001a0b18 00730074 00610020 mscorwks!Thread::intermediateThreadProc+0x49 
0882ffec 00000000 79f9205f 001a0b18 00000000 kernel32!BaseThreadStart+0x37 


FOLLOWUP_IP: 
mscorwks!WKS::WaitForFinalizerEvent+77 
79f92c5b 85c0   test eax,eax 

SYMBOL_STACK_INDEX: 4 

SYMBOL_NAME: mscorwks!WKS::WaitForFinalizerEvent+77 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: mscorwks 

IMAGE_NAME: mscorwks.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 492b82c1 

STACK_COMMAND: ~5s ; kb 

BUCKET_ID: 80000007_mscorwks!WKS::WaitForFinalizerEvent+77 

FAILURE_BUCKET_ID: APPLICATION_HANG_BlockedOn_EventHandle_80000007_mscorwks.dll!WKS::WaitForFinalizerEvent 

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/OurApp_exe/6_2_6_1/4a29a184/unknown/0_0_0_0/bbbbbbb4/80000007/00000000.htm?Retriage=1 

Followup: MachineOwner 
--------- 

0:000> !threads 
ThreadCount: 2 
UnstartedThread: 0 
BackgroundThread: 2 
PendingThread: 0 
DeadThread: 0 
Hosted Runtime: no 
             PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    0 1 4490 0019de20  4220 Enabled 09003658:09003fe8 001a86c0  0 STA 
    5 2 4b74 001b1b08  b220 Enabled 00000000:00000000 001a86c0  0 MTA (Finalizer) 
+0

您确定所有创建的对象已正确释放?最简单的方法是使用一些不同的auto ptr类。如果你没有这样做,你应该。 – eran 2009-06-10 19:46:37

+0

我认为这个挂起是一个泄露的COM对象的结果。似乎认识到应该有一些方法来找到泄漏的物体与windbg。有什么建议?另外,我是一个聪明的指针的大信徒,只要我可以避免裸指针。 – criddell 2009-06-11 14:12:28

回答

3

终结器线程空闲,正在等待工作 - 它的踪迹看起来很好。 Theread 0也看起来很好,并且处于空闲状态 - 它等待下一个UI消息。

你可以提供一些关于如何退出应用程序的细节吗?鉴于消息循环仍在运行,在我看来,您的关闭应用程序逻辑有些问题。

+0

这是一个MFC Windows应用程序。自从我深入研究代码以来已经有一段时间了,但我相信应用最终会发布SC_CLOSE或WM_QUIT消息。我猜它是锁定的,因为有一些OLE对象仍然在内存中,并且AfxOleCanExitApp()返回false,因为对象数量大于0.我认为,如果我能更好地使用windbg,我将能够找到泄漏的对象。 – criddell 2009-06-11 14:20:52

2

我同意J. Passing。

由于一个线程是托管代码,您是否尝试过在windbg中加载SOS调试扩展来获取托管堆栈跟踪。你也可以试试windbg的“!analyze -v”命令,看看有什么说的。