5

私は 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: アプリケーションがさまざまなクリティカル セクションで待機してハングしている複数のクラッシュ ダンプがあります。いずれの場合も、クリティカル セクションのポインターがクリティカル セクションを指していないように見えます。

4

2 に答える 2

2

!analyze -hang -v の出力を見ると、Application Verifier を使用していないようです。アプリケーション検証ツールの「ロック」オプションを有効にした後、ハング ダンプを収集することをお勧めします。それは確かにトラブルシューティングのためのより多くの情報を提供します.

アプリケーション検証ツールは、次の場所からダウンロードできます。

http://www.microsoft.com/en-us/download/details.aspx?id=20028

詳しくは:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd371695(v=vs.85).aspx

于 2012-09-11T20:22:45.557 に答える
1

これを引き起こしている原因を突き止めることを断念したことをお知らせします。プログラムが最大仮想メモリ空​​間 (2.1GB 32 ビット アプリ) に近づいたときにのみ発生したため、接続ごとに 1 つのスレッドを使用するアプローチが原因でした。

最終的に、クライアントを再設計して、クライアントはこのサーバー アプリケーションを使用しなくなり、代わりに SOAP サーバーを使用するようになりました。

SOAP サーバーは、使用している datasnap/Midas よりもはるかに優れた拡張性を備えていますが、最初の問題が発生したクライアント サイトでまだテスト中です。

于 2012-09-24T15:31:32.727 に答える