Диагностика приложения, которое не может остановить

Наше приложение для Windows часто зависает в памяти, и я пытаюсь использовать windbg, чтобы отследить проблему. Я очень новичок в windbg и могу воспользоваться некоторыми советами (хотя я начал читать Advanced Windows Debugging).

Приложение представляет собой смесь объектов C++ и COM, написанных на VB. Иногда, когда вы выходите, приложение, кажется, уходит, но диспетчер задач показывает его зависание в памяти, по-видимому, простаивающее.

! темы показывает мне это:

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-отладчик) NTSTATUS) 0x80000007 - {Kernel Debugger Awakened} системный отладчик был разбит прерыванием.

EXCEPTION_CODE: (HRESULT) 0x80000007 (2147483655) - Операция прервана NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK:! Dumpstack -EE Идентификатор потока OS OS: 0x4490 (0) Текущий кадр: получатель EE-EIDEIDE_EIDE_DeE_DeE_DeID_DeE_De_По_далдед_Выбр.даллдат_Позванив.далл. - ------- -------------------------- 0 48c8.4490 Предполагаемый (сортировка) ->
   5   48c8.4b74 Событие WAIT_CHAIN_COMMAND:  ~0 с;k;;~5 с;k;;

BLOCKING_THREAD:  00004b74

DEFAULT_BUCKET_ID:  APPLICATION_HANG_BlockedOn_EventHandle

PRIMARY_PROBLEM_CLASS:  APPLICATION_HANG_BlockedOn_EventHandle

LAST_CONTROL_TRANSFER: от 7c90df4a до 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 00000000 7a3b8d28 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! Поток:: ShouldChangeAbortToUnload 882fecc 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 тест EAX, EAX SYMBOL_STACK_INDEX:  4 symbol_name: mscorwks WKS::WaitForFinalizerEvent+77

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: mscorwks имя_образа:  mscorwks.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  492b82c1

STACK_COMMAND:  ~5 с; кб 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 Продолжение: MachineOwner
---------

0:000>!threads
ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 2
PendingThread: 0
DeadThread: 0 Размещенная среда выполнения: нет PreEmptive   GC Alloc           Lock
       ID OSID ThreadOBJ Состояние GC       Context       Domain   Count APT Exception
   0    1 4490 0019de20      4220 включено 09003658:09003fe8 001a86c0     0 STA
   5    2 4b74 001b1b08      b220 включено 00000000:00000000 001a86c0     0 MTA (финализатор)

2 ответа

Поток финализатора простаивает и ждет работы - его трассировка выглядит нормально. Theread 0 также выглядит нормально и бездействует - он ожидает следующего сообщения пользовательского интерфейса.

Можете ли вы рассказать подробнее о том, как вы "выходите" из приложения? Учитывая, что цикл сообщений все еще работает, мне кажется, что-то не так с вашей логикой близкого приложения.

Я согласен с J. Passing.

Поскольку один поток является управляемым кодом, вы пытались загрузить расширение отладки SOS в windbg, чтобы получить трассировку управляемого стека. Также вы можете попробовать команду " ! Analysis -v " от windbg и посмотреть, что это говорит.

Другие вопросы по тегам