![]() |
eXeL@B —› Программирование —› Недокументированный дедлок. Pipe и _LdrpLoaderLock |
Посл.ответ | Сообщение |
|
Создано: 07 мая 2013 11:54 · Поправил: DenCoder · Личное сообщение · #1 Всем доброго времени суток! Много различных задач вставало у меня. На этот раз потребовалось вставить в огромный исходник какую-то замену консоли, т.е. чтобы вывод текста происходил не в консоль, а по какому-то каналу. Выбор пал на пайпу - проще! Набросал простенький код Code:
и... зависло, DeadLock! (WinXP SP3 со всеми обновлениями до мая 2013 года) call stack в студии 2010 почти ничего не дал, ясно было только, что зависание связано с ntdll!_LdrpLoaderLock. Пришлось опять подебажить систему... установлена злополучная функция - iphlpapi!GetAdaptersAddresses()->GetIpAddrTable(), которая подгружает netman.dll, в свою очередь которая тянет за собой ещё кучу. Не стал пока разбираться с этим, т.к. времени мало, но сообразил, что пара экспериментов избавят от мучений )) Выкладываю 2 решения, которые могут помочь, дабы попавшие в аналогичную ситуацию быстрее его нашли. Мне лично 15минутный гугл-поиск ничего не дал, кроме 1. Вставляем HMODULE hmodNetman = LoadLibrary("netman.dll"); до создания потока с чтением из пайпы - куча dll по цепочке теперь спокойно грузится, ничего не виснет. При чём если загрузку модуля поставить после создания потока с чтением из пайпы - тот же дедлок; 2. Переносим SetStdHandle после отработки сетевых функций инициализации. Только вот какая связь stdio с загрузкой dll?. Хотелось бы узнать ответ на этот вопрос, но нет времени глубоко потрошить винду. Может кто из присутствующих и иногда заходящих знает? UPD. Оказалось, необходимо вынести в начало ещё загрузку провайдеров из ветки реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries, кроме mswsock.dll. И всё работает ----- IZ.RU ![]() |
![]() |
eXeL@B —› Программирование —› Недокументированный дедлок. Pipe и _LdrpLoaderLock |