4

私は何年も取り組んできた C++ アプリケーションを開発しています。最近、テスト ラボに 4 台のプロセッサ テスト マシンを追加しました。

それを行った後、負荷がかかっている特定のテストで断続的にLdrpLoaderLockデッドロックが発生し、所有しているスレッドが実行されなくなることがわかりました。所有スレッド ID は通常、実行中のスレッドから外挿された可能性の高いスレッド ID であり、ロック メモリ構造が破損していないように見えるため、数値的に示唆的です。

デバッガーでこの問題は発生していません。それが起こった後、私はそれを見ることができます。作成しているすべてのスレッドのログを記録し始めましたが、そこに問題のスレッド ID が表示されません。ただし、デッドロックが発生した後にログが機能しない可能性があるため、意味がない場合があります。どのスレッドがこれを行っているかを把握できるように、スレッドの作成とエントリ ポイントを追跡する方法が必要だと思います。どんな助けでも大歓迎です。

ウィンドバックから

0:000> !ロック
CritSec ntdll!LdrpLoaderLock+0 (775d20c0)
ウェイター目覚めない
ロックカウント 5
再帰回数 2
所有スレッド f38
エントリ数 0
競合数 5
*** ロックされています

スキャンされた 805 個のクリティカル セクション

0:000> !スレッド
インデックス TID
0 00000ab8
1 000008cc
2 00000e68
3 0000134c
4 00000c44
5 000011a0
6 00000f18
7 00000908
8 00001084
9 00000f08
10 00001098
11 00001010
12 00000d40
13 0000135c

スレッド スタックによって消費される合計 VM 0x031cf000

0:000> 日 775d20c0
775d20c0 60 43 5d 77 ea ff ff ff-02 00 00 00 38 0f 00 00 `C]w........8...
775d20d0 ac 04 00 00 00 00 00 00-40 43 5d 77 ff ff ff ff ........@C]w....
775d20e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 02 ......
775d20f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......
775d2100 00 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 .I]w............
775d2110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ......
775d2120 20 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 I]w............
775d2130 00 00 00 00 a0 0f 00 00-00 00 00 00 00 00 00 00 ......
4

1 に答える 1

1

レイモンド・チェンは正しかった。サードパーティの com コンポーネントを呼び出しています。スレッドを作成してから、デストラクタで TerminateThread を呼び出していました。幸いなことに、ソース ライセンスを持っていなければ、永遠に途方に暮れていたでしょう。そのデストラクタで TerminateThread 呼び出しをコメントアウトし、再構築すると問題が解決しました。次に、サードパーティにコードを修正してもらいます。

于 2012-12-13T21:34:46.430 に答える