Я разрабатываю приложение на C ++, над которым работаю годами. Недавно мы добавили около 4-х процессорных тестовых машин в нашу тестовую лабораторию.
После этого мы обнаружили, что определенный тест под нагрузкой периодически приводит к LdrpLoaderLock
тупик с нитью-владельцем больше не работает. Идентификатор потока-владельца обычно числовой, поскольку вероятный идентификатор потока экстраполируется из запущенных потоков, а структура памяти блокировки не выглядит поврежденной.
У меня нет этой проблемы в отладчике. Я просто могу посмотреть на это после того, как это произойдет. Я начал регистрировать все потоки, которые я создаю, и я не вижу там проблемного идентификатора. Это может не иметь смысла, хотя, возможно, регистрация не будет работать после возникновения тупика. Я думаю, что мне нужен способ отслеживать создание потоков и точки входа, чтобы я мог выяснить, какой поток это делает. Любая помощь приветствуется.
От ветра
0: 000>! Замки CritSec ntdll! LdrpLoaderLock + 0 при 775d20c0 WaiterWoken Нет LockCount 5 RecursionCount 2 OwningThread f38 EntryCount 0 ContentionCount 5 *** Заблокировано
Отсканировано 805 критических разделов
0: 000>! Темы Индекс TID 0 00000ab8 1 000008cc 2 00000e68 3 0000134c 4 00000c44 5 000011a0 6 00000f18 7 00000908 8 00001084 9 00000f08 10 00001098 11 00001010 12 00000d40 13 0000135c
Общее количество виртуальных машин, потребляемых стеками потоков 0x031cf000
0: 000> d 775d20c0 775d20c0 60 43 5d 77 ea ff ff ff ff-02 00 00 00 38 0f 00 00 `C] w ........ 8 ... 775d20d0 ac 04 00 00 00 00 00 00-40 43 5d 77 ff ff ff ff ff ........ @ C] w .... 775d20e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 02 ................ 775d20f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 775d2100 00 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 .I] w ............ 775d2110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 775d2120 20 49 5d 77 ff ff ff ff-00 00 00 00 00 00 00 00 I] w ............ 775d2130 00 00 00 00 a0 0f 00 00-00 00 00 00 00 00 00 00 ................
Раймонд Чен был прав. Я звоню стороннему ком-компоненту. Он создавал поток, а затем вызывал TerminateThread в деструкторе. К счастью, у меня была исходная лицензия, или я бы навсегда потерял сознание. комментирование вызова TerminateThread в этом деструкторе и перестройка исправили мою проблему. Теперь, чтобы сторонние поставщики исправили свой код.
Других решений пока нет …