приложение зависает в то время как бесплатный - PullRequest
1 голос
/ 29 апреля 2011

Я получил аварийный дамп, созданный drwtsn32 на сайте, который показывает, что приложение блокируется при вызове системного API FreeLibrary. Вот стек классов:

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

Я заметил строку ntdll! RtlEnterCriticalSection + 0xa8 (FPO: [1,1,0]), и я думаю, что это должно быть относительное критическое сечение. Поэтому я использовал команду dt в windbg, чтобы показать информацию о CRITICAL_SECTION

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

строка + 0x00c OwningThread: 0x00002098 показывает, что критическое_сечение удерживалось потоком 0x2098, но это так странно, что я даже не могу найти такой поток в списке потоков.

Есть ли другой способ выяснить, почему FreeLibrary заблокирован?

PS: есть еще одна история о зависании. Если я отлаживаю приложение с помощью удаленного отладчика, никаких зависаний не будет. Но если я запускаю приложение на серверной машине. оно делает Большое спасибо

1 Ответ

1 голос
/ 29 апреля 2011

Я предполагаю, что вы вызываете FreeLibrary в запрещенный момент времени (например, DllMain)

Почему бы не вызвать FreeLibrary из функции точки входа?

MSDN: loaderLock MDA

> Однако я, очевидно, не могу вызвать FreeLibrary из события DllMain PROCESS_DETACH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...