2011-04-13 5 views
1

私たちのアプリケーションが起動中にハングアップするという奇妙な問題が発生しました。 サイトでカスタムによって生成されたクラッシュダンプを取得し、メインスレッドがbeginthreadex apiでスタックしていたことを示します。 はここにコールスタックです:beginthreadexを使用してスレッドを作成中にデバッグアプリケーションがハングアップする

0:006> kv 
ChildEBP 
0161ebb8 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 
0161ebbc ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0]) 
0161ebf8 ntdll!RtlpWaitOnCriticalSection+0x1a3 (FPO: [2,7,4]) 
0161ec18 ntdll!RtlEnterCriticalSection+0xa8 (FPO: [1,1,0]) 
0161ec4c ntdll!LdrLockLoaderLock+0x133 (FPO: [SEH]) 
0161ecc8 ntdll!LdrGetDllHandleEx+0x94 (FPO: [SEH]) 
0161ece4 ntdll!LdrGetDllHandle+0x18 (FPO: [4,0,0]) 
0161ed30 kernel32!GetModuleHandleForUnicodeString+0x20 (FPO: [SEH]) 
0161f1a8 kernel32!BasepGetModuleHandleExW+0x17f (FPO: [SEH]) 
0161f1c0 kernel32!GetModuleHandleW+0x29 (FPO: [1,0,0]) 
0161f1cc kernel32!GetModuleHandleA+0x2d (FPO: [1,0,0]) 
0161f204 msvcr80!initptd+0x17 
0161f224 msvcr80!beginthreadex+0x56 
0161f248 ZQCommonStlp!ZQ::common::NativeThread::NativeThread+0x59 (FPO: [Non-Fpo]) (CONV: thiscall) 
... 

私は、このコールスタックから何を取得ちょうど新しいスレッドを作成している間、メインスレッドが立ち往生した知っています。 これはシステムに問題がありますか?

答えて

3

DllMain(または何らかのDLL初期化)でこのスレッドをスピンアップしていますか?悪名高いローダーロックでデッドロックしているようです。 DllMain内で(非常に少ない)許可されているものの詳細については、以下のドキュメントを参照してください:この特定のケースで

を、ランタイム関数_initptd()GetModuleHandle("KERNEL32.DLL")を呼んでいます。参考のため

は、ここにあなたがミックスの中でのDllMainを持っているかどうかを、役に立つかもしれませんローダーロックについてのリンク数です:

いくつかの厳しい警告を持っているのDllMain、のためのドキュメントは:http://msdn.microsoft.com/en-us/library/ms682583.aspx

そして、レイモンド・チェンの "旧新シング" からのリンクフェスト:

+0

Ah - それは私自身のアンサーによる推論で、私には非常に意味があります。これは持っている必要があります – sehe

+0

このスレッドはDLLではなく、アプリケーションのスタートコードで作成されました。 – suds

+0

@suds: 'ZQCommonStlp'はアプリケーションモジュール/バイナリですか?それとも、アプリケーションがロードするDLLですか?ローダーロックを持つ可能性のある他のスレッドのスタックトレースを取得できますか(明らかに何かがありますか?)あなたは他のいくつかのDLLの慈悲であるかもしれません。 –

0

まあ実行されている(HMODULE)実行するためのモジュールを取得するために待っています。このようなハンドルを開いているかどうかは、特に共有読み取りのためにロックされているかどうかを確認したい場合があります。

おそらく(Sysinternalsから)(Microsoft)はブロックされたハンドルを見つけるのに役立ちます。または、HMODULEハンドル、LoadLibrary呼び出しを調べて、犯人を探すことができます。

関連する問題