Ищу идеи для отладки хитрого гремлина при запуске службы Windows

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

Эта проблема носит очень спорадический характер, за последние 6 месяцев она наблюдалась только 3-4 раза в естественных условиях в дикой природе. В остальном сервис работает безупречно. Так что это заставляет меня поверить, что это что-то вроде условий гонки / времени.

Недавно я решил взять на себя ответственность разобраться в этом. Я настраиваю машину со сценарием WinTask, который постоянно запускает / останавливает указанную службу. Хорошая новость в том, что в течение 5-6 часов я могу воспроизвести проблему.

Теперь перейдем к следующей части: как мне его изолировать?

Это то, что я пробовал до сих пор:

  1. использовал поле «debugger» в настройках изображения gflags для автоматического запуска службы под cdb при ее запуске. До сих пор это работало в течение двух дней и никогда не зависало, поэтому я думаю, что отладчик внес изменения времени, достаточный для того, чтобы сделать проблему невидимой.

  2. Загрузил Application Verifier и настроил процесс для работы с ним. Обнаружена совершенно не связанная с этим ошибка, при которой мы создаем временную переменную CComBSTR, назначаем ее VARIANT и передаем вариант в вызов функции, хотя CComBSTR уже давно удалил выделенную строку к этому моменту. Не верьте, что эта ошибка связана с тем, что строка доступна только для чтения, а поток, в котором она выполняется, не тот, который умирает.

Я пишу этот пост на случай, если вы, ребята, подумаете о чем-то, что я не рассматриваю.

Я думал, что существовала утилита для Windows, которая искусственно нагружала ЦП и делала другие вещи, чтобы выскакивать условия гонки, и я думал, что верификатор приложений делал это, но, видимо, это не так. Кто-нибудь знает, о чем я говорю, или мне это просто приснилось?

Если что-то не случится в выходные, моим следующим шагом будет отключение всех отладчиков, возврат к исходному состоянию и взлом одного из DllMains для записи THREAD_ATTACH / THREAD_DETACH события.По крайней мере, я смогу перехватить умирающий поток, когда он будет создан. Это могло бы пролить свет.

11
задан DXM 15 January 2012 в 06:15
поделиться