私は Windbg を使用して、デルファイで作成されたデータ スナップ アプリケーション サーバーで発生しているデッドロックを分析しています。
私が走るとき
!analyze -hang -v
私はこれを取得します
:000:x86> !分析 -ハング -v ****************************************************** **************************** * * * 例外分析 * * * ****************************************************** **************************** GetPageUrlData が失敗し、サーバーが HTTP ステータス 404 を返しました 要求された URL: http://watson.microsoft.com/00000000.htm?Retriage=1 FAULTING_IP: +6ced240 00000000?? ??? EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) 例外アドレス: 0000000000000000 ExceptionCode: 80000003 (ブレーク命令例外) 例外フラグ: 00000000 数値パラメーター: 0 FAULTING_THREAD: 0000000000000000 BUGCHECK_STR: ハング DEFAULT_BUCKET_ID: APPLICATION_HANG PROCESS_NAME: ********.exe ERROR_CODE: (NTSTATUS) 0xcfffffff - EXCEPTION_CODE: (NTSTATUS) 0xcfffffff - MOD_LIST: NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 DERIVED_WAIT_CHAIN: Dl Eid Cid WaitType -- --- ------- -------------------------- 0 c7c.2634 クリティカル セクション WAIT_CHAIN_COMMAND: ~0s;k;; ブロッキング_スレッド: 0000000000002634 PRIMARY_PROBLEM_CLASS: APPLICATION_HANG LAST_CONTROL_TRANSFER: 0000000077138df4 から 000000007711f8b1 まで STACK_TEXT: 0018fc50 77138df4 00000c6c 00000000 00000000 ntdll_77100000!NtWaitForSingleObject+0x15 0018fcb4 77138cd8 00000000 00000000 03fe0940 ntdll_77100000!RtlpWaitOnCriticalSection+0x13e 0018fcdc 7369324f 736a3134 00000000 03fe0940 ntdll_77100000!RtlEnterCriticalSection+0x150 警告: スタック アンワインド情報は利用できません。次のフレームは間違っている可能性があります。 0018fcec 7369af5f 00000388 00000000 003d1e00 mswsock!GetLspGuid+0x19af 0018fd08 76366958 00000388 0018fd84 0018fd9c mswsock!GetLspGuid+0x96bf 0018fd38 0018fd58 763668cd 00000388 0018fd84 ws2_32!WSAAccept+0x84 00000000 00000000 00000000 00000000 00000000 0x18fd58 FOLLOWUP_IP: mswsock!GetLspGuid+19af 7369324f 33db xor ebx,ebx SYMBOL_STACK_INDEX: 3 SYMBOL_NAME: mswsock!GetLspGuid+19af FOLLOWUP_NAME: MachineOwner MODULE_NAME: C:\Windows\System32\mswsock IMAGE_NAME: lld DEBUG_FLR_IMAGE_TIMESTAMP: 4ce7c83d STACK_COMMAND: ~0s ; キロバイト FAILURE_BUCKET_ID: APPLICATION_HANG_cfffffff_lld!アンロードされました BUCKET_ID: X64_HANG_mswsock!GetLspGuid+19af WATSON_STAGEONE_URL: http://watson.microsoft.com/00000000.htm?Retriage=1 フォローアップ: MachineOwner ----------
私はそれからやった
!locks -V
待っているロックを確認すると、驚いたことにこれが返されました。
0:000:x86> !locks -V CritSec ntdll!RtlCriticalSectionLock+0 at 0000000077057060 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec ntdll!LdrpLoaderLock+0 at 0000000077057490 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec ntdll!RtlpDynamicFunctionTableLock+0 at 0000000077057468 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec ntdll!FastPebLock+0 at 000000007705a900 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec ntdll!RtlpProcessHeapsListLock+0 at 000000007705a240 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec +270208 at 0000000000270208 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 1 CritSec ntdll!EtwProvCritSect+0 at 000000007705a120 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec ntdll!EtwPrivSessionCritSect+0 at 000000007705a1e0 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec +10208 at 0000000000010208 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 CritSec +276f40 at 0000000000276f40 LockCount はロックされていません 再帰カウント 0 所有スレッド 0 エントリ数 0 競合数 0 10 個のクリティカル セクションをスキャンしました
コールスタックを見ると
STACK_TEXT: 0018fc50 77138df4 00000c6c 00000000 00000000 ntdll_77100000!NtWaitForSingleObject+0x15 0018fcb4 77138cd8 00000000 00000000 03fe0940 ntdll_77100000!RtlpWaitOnCriticalSection+0x13e 0018fcdc 7369324f 736a3134 00000000 03fe0940 ntdll_77100000!RtlEnterCriticalSection+0x150 警告: スタック アンワインド情報は利用できません。次のフレームは間違っている可能性があります。 0018fcec 7369af5f 00000388 00000000 003d1e00 mswsock!GetLspGuid+0x19af 0018fd08 76366958 00000388 0018fd84 0018fd9c mswsock!GetLspGuid+0x96bf 0018fd38 0018fd58 763668cd 00000388 0018fd84 ws2_32!WSAAccept+0x84 00000000 00000000 00000000 00000000 00000000 0x18fd58
アドレス 0x736a3134 (RtlEnterCriticalSection に渡される最初のパラメーター) でクリティカル セクションを待機していると判断したので、これを実行しました。
!critsec 736a3134
それは私にこの出力を与えました
0:000:x86> !critsec 736a3134 00000000736a3134 の CritSec の DebugInfo がクリティカル セクションを指していない 初期化されたクリティカル セクションではありません。 CritSec mswsock!WSPStartup+6f64 at 00000000736a3134 はい LockCount -1 再帰回数 11028 所有スレッド c6c EntryCount 1f49dad6 競合数 88000000 *** ロックされています
ペニーが落ちたので、クリティカル セクションへのポインターが破損しました。これは、同時スレッド アクセスと、コード内の他の場所での同期の欠如が原因である可能性があります。
私の質問は、これがどこにあるかを追跡する方法、または別の問題であるかどうかを確認する方法です。
PS: このバグは、アプリケーションの負荷が高く、接続しているクライアントが 700 台程度の場合にのみ発生します。
(接続ごとに 1 つのスレッドを使用しており、32 ビット アプリケーションはデフォルトのスレッド スタック サイズで約 2000 スレッドに制限されることがわかっており、これは最善の方法ではありません)
PPS: アプリケーションがさまざまなクリティカル セクションで待機してハングしている複数のクラッシュ ダンプがあります。いずれの場合も、クリティカル セクションのポインターがクリティカル セクションを指していないように見えます。