2010-03-01 51 views
0

死锁发生在我的应用程序中,当DLLMain入口点调用的函数发生本地静态变量的初始化时,参数DLL_THREAD_DETACH。帮助死锁分析

下面是WinDBG的分析

这通常是由另一个线程持有加载程序锁引起的。

以下是持有的锁。

CritSec NTDLL!LdrpLoaderLock + 0在7c97e178

锁定计数3

RecursionCount 1

OwningThread 17e8

EntryCount d

ContentionCount d

***锁定

CritSec MSVCR80!__ APP_TYPE + 94 781c3bc8

锁定计数1

RecursionCount 1

OwningThread 1100

EntryCount 1

ContentionCount 1 ***锁定

调用堆栈线程17e8

781c3bc8 78132bd9 0777fde4 NTDLL!RtlEnterCriticalSection + 0×46

00000008 b87d2630 00000000 MSVCR80!_lock + 0x2E之间

0864ae10 08631d7f 0864ae10 EPComUtilities32 !_onexit + 0x36

0864ae10 b87d2588 00000001 EPComUtilities32!atexit + 0x9

0777fea8 0864719f 08630000 EPComUtilities32!XCriticalSectionEx :: ThreadTerminated + 0x5F的

08630000 00000003 00000000 EPComUtilities32!的DllMain + 0×20

08630000 7c90118a 08630000 EPComUtilities32!__ DllMainCRTStartup + 0x7a

08630000 00000003 00000000 EPComUtilities32!_DllMainCRTStartup + 0x1d

调用堆栈线程1 100

000000b0 00000000 00000000 ntdll!ZwWaitForSingleObject + 0xC的

000000b0 FFFFFFFF 00000000 KERNEL32!WaitForSingleObjectEx + 0xa8

000000b0 FFFFFFFF 06ce64e0 KERNEL32!WaitForSingleObject的+ 0×12

000480ba 000f4240 00000000 CATSysMultiThreading!CATThreads ::加入+ 0xf5

0012fcc8 00000004 00000000 JS0GROUP !CATLM :: StopHB + 0xf4

d138509f 00416694 00000001 JS0GROUP!CATLM :: Unmake + 0x6b

00000000 00000000 00000000 MSVCR80!_cinit + 0xd6

00000000 0012fd6c 081e68d9 MSVCR80!出口+ 0xd中

00000000 06d404f0 0998fb90 JS0GROUP!CATExit + 0x1d

00000000 004ef366 0000000D DNBPLMProvider!DNBEPLMTransactionMgt :: OnApplicationExit + 0x229

00000000 0012fd9c 004eabfc JS0GROUP!CATCallExits + 0x2bc

00000000 0012ff7c 0040cefd JS0GROUP!CATError NormalEnd + 0X31 00000000 06ce71d0 06ce71d0 JS0GROUP!CATExit + 0xC的

00000007 06cdb120 059b61d8 DLMMfgContextSolver!主+ 0x146d

FFFFFFFF FFFFFFFF bffde000 DLMMfgContextSolver!__ tmainCRTStartup + 0x10f

请给你意见了解可能导致僵局的原因。 注:此刻我使静态变量非静态的问题,比如上下文消失此张贴在论坛Deadlock occurs in Function Scoped Static variables (Thread Unsafe in VC++)

+0

尝试使用全局变量。 – logout 2010-03-01 10:56:25

+0

使用全局变量可能会解决,但我想了解这个问题。为什么本地静态变量初始化导致锁定。当你看到线程17e8的调用堆栈时。 在功能 空隙XCriticalSectionEx :: ThreadTerminated() { const的静态XEPComBSTR bstrMethod = __FUNCTION__; } 执行上面的局部静态变量bstrMethod初始化时为什么MSVCR80!_lock ??? – IRFAN 2010-03-01 11:30:52

回答