c ++ - fejlsøgningsprogrammet hang mens du oprettede en tråd ved hjælp af startthreadex

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg støder på et mærkeligt problem på stedet, at vores ansøgning bliver hængt, mens du starter.
Jeg får crashdumpen genereret af brugerdefinerede på webstedet, og det viser at hovedtråden blev fast ved begyndelsen af ​​apoteket.
Her er callstacken:


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) 
...


Jeg får ikke noget fra denne callstack, men ved bare, at hovedtråden sidder fast, mens du laver en ny tråd.
Er dette et systemproblem?

Bedste reference


Spinder du denne tråd i DllMain (eller nogle DLL-initialiseringer)? Det ser ud til at være dødlåst på den berygtede læsserlås. Se følgende dokumenter for detaljer om, hvad der er tilladt (meget lidt) i DllMain:



  • http://msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx



I dette særlige tilfælde kalder runtime-funktionen \_initptd() GetModuleHandle("KERNEL32.DLL"). [5]


Til reference, her er et antal links om loader-lås, der kan være nyttigt, uanset om du har en DllMain i blandingen:


Dokumenterne for DllMain, som har nogle strenge advarsler: http://msdn.microsoft.com/en-us/library/ms682583.aspx[6]


Og en link-fest fra Raymond Chens 'Old New Thing':



  • Nogle grunde til ikke at gøre noget skræmmende i din DllMain

  • En anden grund til ikke at gøre noget skræmmende i din DllMain: Utilsigtet dødlås

  • En processtopspille

  • Opretter en tråd fra DllMain deadlock eller gør det ikke?


Andre referencer 1


Nå venter det på at få modulet til kørslen (HMODULE) eksekverbar. Du kan måske se, om du har åbnet et sådant håndtag, især når det er låst til delt læsning. [7] [8] [9] [10]


Måske procexp.exe fra Sysinternals (Microsoft) kunne hjælpe med at finde det blokerede håndtag. Eller du kan undersøge eventuelle HMODULE håndtag, LoadLibrary opkald for at finde synderen [11]