зависание приложения отладки при создании потока с использованием beginthreadex - PullRequest
1 голос
/ 13 апреля 2011

Я сталкиваюсь со странной проблемой на сайте, когда наше приложение зависает при запуске. Я получаю краш-дамп, сгенерированный обычаем на месте, и он показывает, что основной поток застрял в beginthreadex api. Вот стек вызовов:

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

Я ничего не получаю из этого стека вызовов, но просто знаю, что основной поток застрял при создании нового потока. Это системная проблема?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Вы раскручиваете этот поток в DllMain (или какой-то инициализации DLL)? Кажется, он заблокирован на печально известной блокировке загрузчика. Смотрите следующие документы для получения подробной информации о том, что разрешено (очень мало) в DllMain:

В этом конкретном случае функция времени выполнения _initptd() вызывает GetModuleHandle("KERNEL32.DLL").

Для справки, вот несколько ссылок о блокировке загрузчика, которые могут быть полезны независимо от того, есть ли у вас DllMain в миксе:

Документы для DllMain, в которых есть некоторые строгие предупреждения: http://msdn.microsoft.com/en-us/library/ms682583.aspx

И ссылка-фестиваль из «Старого нового» Рэймонда Чена:

0 голосов
/ 13 апреля 2011

Что ж, он ждет, чтобы получить модуль для исполняемого файла (HMODULE).Возможно, вы захотите узнать, открыли ли вы такой дескриптор, особенно когда он заблокирован для совместного чтения.

Возможно, procexp.exe от Sysinternals ( Microsoft ) может помочь найти заблокированный дескриптор.Или вы можете изучить любые дескрипторы HMODULE, вызовы LoadLibrary, чтобы найти виновника

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