В последние несколько месяцев я получил несколько отчетов от QA о том, что один из наших сервисов висит. Изучив вешалку с помощью WinDbg, каждый раз, когда я обнаружил одно и то же: критический раздел блокировки загрузчика заблокирован, но нигде нигде не найти нить. Поскольку поток пропал, и единственная трассировка, которую я вижу, - это глобальный критический раздел, который он оставил позади, я не вижу, какой код работал в потоке нити или даже с какой DLL-линией, из которой произошел поток, он может даже не быть одним из наш (т.е. сторонний поставщик).
Эта проблема очень спорадическая, ее видели только 3-4 раза за последние 6 месяцев, которые происходят естественным образом в дикой природе. Все остальные времена, обслуживание работает отлично. Поэтому это заставляет меня поверить в то, что это какое-то время/состояние гонки.
Недавно я решил взять это на себя, чтобы понять это. Я настраиваю машину с помощью WinTask script, которая постоянно запускает/останавливает указанную службу. Хорошая новость заключается в том, что в течение 5-6 часов я могу воспроизвести проблему.
Теперь для следующей части: как ее изолировать?
Это то, что я пробовал до сих пор:
-
используется поле "отладчик" в настройках изображения gflags для автоматического запуска службы в режиме cdb при каждом запуске. До сих пор это работало в течение двух дней и никогда не висело, поэтому я думаю, что отладчик представил достаточно временного изменения, чтобы сделать проблему невидимой.
-
Загрузите Application Verifier и настройте процесс для этого. Найден абсолютно несвязанный баг, в котором мы создаем временную переменную CComBSTR, присваиваем ее VARIANT и передаем вариант в вызов функции, хотя CComBSTR долго удалял выделенную строку этой точкой. Не верьте, что эта ошибка связана с тем, что строка доступна только для чтения, а поток, на котором работает, не умирает.
Я делаю этот пост на случай, если вы, ребята, можете подумать о чем-то, что я не рассматриваю.
Я, хотя была утилита Windows, которая искусственно загружала процессор и делала другие вещи, чтобы создать условия гонки, и я думал, что верификатор приложения сделал такую вещь, но, по-видимому, это не так. Кто-нибудь знает, что я принимаю, или мне просто снилось это?
Если в выходные дни ничего не произойдет, моим следующим шагом будет отключить все отладчики, вернуться к запасу и взломать один из DllMains для записи событий THREAD_ATTACH/THREAD_DETACH. По крайней мере, я смогу перехватить поток, который умирает, когда он будет создан. Это может пролить свет.