Что вызывает ошибку StartServiceCtrlDispatcher() с 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

Я вижу странную ошибку в моей сервисной программе Windows. Моя служебная программа вызывает StartServiceCtrlDispatcher() в самом начале ее main(), но она иногда терпит неудачу с 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT).

Я знаю, что эта ошибка возникает, если пользователь запускает программу вручную (в качестве консольной программы). Но это не так. Я добавил код для проверки родительского процесса сервисной программы при возникновении этой ошибки, и он сообщает, что services.exe является родительским процессом (я думаю, что безопасно предположить, что моя программа была правильно запущен SCM).

К сожалению, эта ошибка не воспроизводится на моей машине dev и не может отлаживать ее самостоятельно, но журналы ошибок, записанные в пользовательских системах, указывают:

  • Эта проблема возникает только у немногих% всех пользователей этой программы.
  • Даже если проблема возникает, она, похоже, не повторяется. В следующий раз служба обычно запускается успешно.
  • Когда эта проблема возникает, StartServiceCtrlDispatcher() останавливается около секунды, прежде чем она вернется с ошибкой.

Кто-нибудь видел подобную ошибку? Если да, то в чем причина ошибки?

Ответ 1

Как вы уже можете видеть из-за отсутствия ответов и всего на google, проблема не распространена. Я считаю, что проблема в вашей службе, и она находится в коде, выполняемом с начала процесса, до StartServiceCtrlDispatcher(), и, скорее всего, он принимает некоторую форму развращения системных ресурсов, вероятной кучи или HANDLE.

Вы можете сожалеть об этом, но у меня не будет волшебного ответа на ваши проблемы. Вместо этого я могу предложить некоторые способы устранения неполадок.

Microsoft Application Verifier бесценен в поиске коррупции. Я предлагаю вам:

  • Установите его на свою машину dev.
  • Добавьте свой сервис exe к нему.
  • Впервые выберите Basics\Heaps.
  • Нажмите "Сохранить". Не имеет значения, если вы оставите верификатор приложения открытым.
  • Запустите службу несколько раз.
  • Если он сработает, отлаживайте его, и авария укажет на вашу проблему.
  • Если это не сбой, добавьте Basics\Handles. В отличие от Basics\Heaps, это может иногда запускать "ложные срабатывания" - ошибки в коде, которые не сильно вредят. Во всяком случае, поскольку вы на охоте, вам лучше исправить все, что вы можете найти. Меня больше всего беспокоит двойное освобождение HANDLE или что-то в этом роде. Освобождение менеджера сервиса HANDLE по ошибке может привести к вашей проблеме.
  • Если он все еще не сбой, вы можете попробовать другие параметры в Basics\*, но я не думаю, что это поможет.
  • На этом этапе вам может потребоваться проверить код между программами main() и StartServiceCtrlDispatcher() и любыми глобальными конструкторами, которые вы можете иметь. Найдите потенциальные переполнения буфера и ошибки с помощью HANDLE.
  • Следующим шагом может быть установка Application Verifier на клиентскую машину. Там не так много вреда, я иногда делаю это, когда сам не могу найти ошибку.

Ответ 2

СОВЕТ. Я использовал _wfopen/fwrite/fclose для регистрации некоторых сообщений. Как-то 183 было брошено внутренне и привело к этой неудаче 1063. Я удалил журнал, и он начал нормально работать, поскольку ничего не случилось. Любая минута может привести к этому. Начните с услуг, и он перечислит ошибку заработной платы (183 в моем случае).