Служба Windows не останавливается и не перезапускается - PullRequest
1 голос
/ 07 октября 2010

Я написал службу Windows на C ++, которая должна перезапускаться каждую ночь в полночь, поэтому я вызываю exit (1) для нее, чтобы SCM мог перезапустить ее. Проблема в том, что каждую ночь он запускается частично и зависает. В журнале событий я получаю это:

Всплывающее окно приложения - Ошибка приложения: инструкция на «0x0043c145» ссылается на память на «0x00000035». Память не может быть «прочитана».

Кажется, что происходит сбой прямо перед открытием соединения ODBC с базой данных SQL Server 2008. Я могу подтвердить, что служба действительно завершает работу до ее перезапуска; тем не менее, я получаю эту ошибку время от времени, когда она останавливается и перезапускается сама, но если я снова и снова останавливаю и перезапускаю службу, я никогда не получу ее сбой, и если я буду контролировать процесс через порт терминала и выйду вручную оттуда это никогда не подведет.

Если я пытаюсь подключить отладчик, процесс завершается, поэтому я не могу получить какую-либо полезную информацию таким образом.

Я рву волосы, пытаясь понять, что происходит, но я не знаю, с чего начать. У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

Настройка автоматического создания дампов процесса для этого процесса с использованием Process Dumper . Вы должны быть в состоянии отладить дамп после вскрытия, чтобы понять, почему происходит это спорадическое исключение.

Также было бы полезно добавить диагностику доступа к вашей БД, чтобы увидеть, какой прогресс был достигнут до того, как произойдет исключение. Интересно, будет ли ваша стратегия выхода / перезапуска работать лучше, если вы запланируете задачу по закрытию службы в полночь, а затем снова запустите ее после завершения работы.

Возможно, ODBC на коробке становится странным после предыдущего закрытия с использованием exit(1). Когда вы пытаетесь повторить это, вы говорите, что останавливаетесь и запускаете его - режим выхода такой же в этом случае? Можете ли вы ввести небольшую задержку между выходом и перезапуском на целевом сервере, чтобы очистить состояние соединения ODBC?

0 голосов
/ 07 октября 2010

Не прямой ответ, но если у вас в Vista (и после этого, я думаю) есть шанс, что вы можете попробовать:

"Служба уведомляет SCM, чтобы поставить в очередь действие отказавход в состояние SERVICE_STOPPED и установка параметра dwWin32ExitCode функции SetServiceExitCode в любое значение, отличное от ERROR_SUCCESS. "

В Windows Vista введен новый флаг FailureActionsOnNonCrashFailures, которые устанавливаются службами, если они хотят иметь возможность уведомить SCM о необходимости инициировать сбой: Подробнее об услугах Vista

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...