5

私たちの Windows アプリはメモリ内でハングアップすることが多く、windbg を使用して問題を追跡しようとしています。私はwindbgに非常に慣れていないため、いくつかのアドバイスを使用できます(ただし、Advanced Windows Debuggingを読み始めました)。

このアプリは、VB で記述された C++ オブジェクトと COM オブジェクトが混在しています。時折、アプリを終了すると、アプリが消えたように見えますが、タスク マネージャーでは、アプリがメモリ内でぶらぶらしていて、明らかにアイドル状態であると表示されます。

!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 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

ここで少しコースを修正していただければ幸いです。ブロックされたファイナライザーの推測が妥当であると思われる場合は、お知らせください。また、何がブロックされているのかを正確に把握するためのアドバイスをいただければ幸いです。

編集:

Shane は !analyze からの出力を求めました。これは実際には別のダンプからのものです - 私はそれらをたくさん持っていますが、それらはすべてほとんど同じように見えます.

FAULTING_IP:
+18a952f00ebdf74
00000000?? ???

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
例外アドレス: 00000000
   ExceptionCode: 80000007 (Wake デバッガー)
  例外フラグ: 00000000
数値パラメーター: 0

BUGCHECK_STR: 80000007

PROCESS_NAME: OurApp.exe

OVERLAPPED_MODULE: 「OurApp」と「Unknown_Module_00350062」のアドレス領域が重複しています

ERROR_CODE: (NTSTATUS) 0x80000007 - {Kernel Debugger Awakened} システム デバッガーが割り込みによって起動されました。

EXCEPTION_CODE: (HRESULT) 0x80000007 (2147483655) - 操作が中止されました

NTGLOBALFLAG: 0

APPLICATION_VERIFIER_FLAGS: 0

MANAGED_STACK: !dumpstack -EE
OS スレッド ID: 0x4490 (0)
現在のフレーム:
ChildEBP RetAddr 呼び出し元、呼び出し先

DERIVED_WAIT_CHAIN:  

Dl Eid Cid WaitType
-- ------ ------- --------------------------
   0 48c8.4490 推測 (トリアージ) -->
   5 48c8.4b74 イベント                  

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

ブロッキング_スレッド: 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 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 テスト 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: ~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/bbbbbb4/80000007/00000000.htm?Retriage=1

フォローアップ: MachineOwner
----------

0:000> !スレッド
スレッド数: 2
未開始スレッド: 0
背景スレッド: 2
保留スレッド: 0
デッドスレッド: 0
ホステッド ランタイム: いいえ
                                      プリエンプティブ GC 割り当てロック
       ID OSID ThreadOBJ 状態 GC コンテキスト ドメイン カウント APT 例外
   0 1 4490 0019de20 4220 有効 09003658:09003fe8 001a86c0 0 STA
   5 2 4b74 001b1b08 b220 有効 00000000:00000000 001a86c0 0 MTA (ファイナライザー)
4

2 に答える 2

3

ファイナライザー スレッドはアイドル状態で、作業を待機しています。そのトレースは正常に見えます。読み取り 0 も正常に見え、アイドル状態です。次の UI メッセージを待ちます。

アプリケーションを「終了」する方法について詳しく教えてください。メッセージ ループがまだ実行されていることを考えると、アプリケーションを閉じるロジックに何か問題があるように思えます。

于 2009-06-10T15:46:27.400 に答える
2

J.Passingに同意します。

1つのスレッドがマネージコードであるため、SOSデバッグ拡張機能をwindbgにロードして、マネージスタックトレースを取得してみましたか。また、windbgの「!analyze-v」コマンドを試して、その内容を確認することもできます。

于 2009-06-10T20:43:43.273 に答える