c ++ - ansøgningen bliver hængt mens freelibrary

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg fik en crashdump genereret af drwtsn32 på webstedet, som viser at applikationen er blokeret, mens man anvender system API FreeLibrary.
Her er klassestakken:


ChildEBP RetAddr  Args to Child
06f0fc14 7c827d29 7c83d266 00000718 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
06f0fc18 7c83d266 00000718 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
06f0fc54 7c83d2b1 00000718 00000004 00000000 ntdll!RtlpWaitOnCriticalSection+0x1a3 (FPO: [2,7,4])
06f0fc74 7c839874 7c8897a0 00000000 00000000 ntdll!RtlEnterCriticalSection+0xa8 (FPO: [1,1,0])
06f0fd7c 77e6b1bb 014e0000 00000000 02a67430 ntdll!LdrUnloadDll+0x35 (FPO: [SEH])
06f0fd90 005e8cdd 014e0000 02a4bc88 06f0fdbc kernel32!FreeLibrary+0x41 (FPO: [1,0,0])
....


Jeg bemærkede linjen ntdll! RtlEnterCriticalSection + 0xa8 (FPO: [[1,1,0]]), og jeg synes, at dette burde være critical\_section relative. Så jeg brugte dt kommandoen i windbg til at vise CRITICAL\_SECTION oplysningerne om det


0:037> dt 7c8897a0 RTL\_CRITICAL\_SECTION
SiteAdminSvc!RTL\_CRITICAL\_SECTION
   +0x000 DebugInfo        : 0x7c8897c0 \_RTL\_CRITICAL\_SECTION\_DEBUG
   +0x004 LockCount        : -18
   +0x008 RecursionCount   : 1
   +0x00c OwningThread     : 0x00002098 
   +0x010 LockSemaphore    : 0x00000718 
   +0x014 SpinCount        : 0


linjen + 0x00c OwningThread: 0x00002098 viser at critical\_section blev holdt af tråd 0x2098, men det er så mærkeligt, at jeg ikke engang kan finde en sådan tråd i trådliste.


Er der nogen anden metode til at finde ud af, hvorfor FreeLibrary bliver blokeret?


PS: Der er en anden historie om det hang. Hvis jeg fejler applikationen ved hjælp af fjern debugger, er ingen hængte opfyldt. Men hvis jeg starter applikationen på servermaskinen. det gør det
Mange tak

Bedste reference


Jeg antager, at du ringer FreeLibrary på et ulovligt tidspunkt (som DllMain)


Hvorfor ikke ringe FreeLibrary fra entry point funktion?


MSDN: LoaderLock MDA [4]


> Men jeg
tilsyneladende kan ikke kalde FreeLibrary fra DllMain PROCESS\_DETACH eventen [5]