Служба Windows / новая страница guard для стека не может быть создана
У меня есть служба windows, которая делает некоторую интенсивную работу каждую минуту (на самом деле она запускает новый поток каждый раз, когда он синхронизируется с различными системами через http). Проблема в том, что после через несколько дней он внезапно останавливается без сообщения об ошибке.
У меня NLog и я зарегистрирован на домене.CurrentDomain.События unhandledexception'. Последняя запись в textfile-log - это просто обычная запись без каких-либо проблем. Глядя в журнал, я также не удается найти сообщение в журнале приложений, однако в системном журнале есть две записи.
один в основном говорит, что служба была неожиданно завершена. Ничего больше. Второе событие (одновременно с первым) говорит: "...Не удается создать новую страницу guard для стека..."
из того, что я прочитал, это, вероятно, исключение переполнения стека. Я не анализирую XML, и я не делаю рекурсивную работу. Я размещаю веб-сервер, используя Gate, Nancy и SignalR и RavenDB работают в встроенном режиме. Каждую минуту новая задача запускается с помощью Taskfactory из .NET 4.0, и у меня также есть ContinueWith, где я снова запускаю систему.Таймеры.Таймер снова выстрелит через минуту.
Как я могу начать расследование этого вопроса? Каковы возможные причины такой ошибки?
4 ответов
основываясь на информации, которую вы предоставили, я бы, по крайней мере, как минимум, сделать следующее:
- обратите особое внимание на любые сторонние вызовы и добавьте дополнительную информацию, регистрирующуюся вокруг этих точек.
- существуют некоторые обстоятельства, при которых
AppDomain.CurrentDomain.UnhandledException
не поможет вам - aStackOverflowException
одно из них. Я считаю, что CLR просто даст вам строку в этом случае вместо трассировки стека. - обратите дополнительное внимание вокруг областей где больше чем вводится один поток.
пример часто забывают StackOverflowException
- это:
private string myString;
public string MyString { get { return MyString; } } //should be myString
Так же, как "для чего это стоит" - в моем случае эта ошибка была сообщена, когда код пытался записать в журнал событий Windows, и интерактивный пользователь не имел достаточного разрешения. Это было небольшое консольное приложение, которое регистрировало исключения из текстового файла и журнала событий (при желании). При исключении текстовый файл обновлялся, но затем эта ошибка была вызвана и не поймана обработкой ошибок. Отключение ведения журнала событий остановлена ошибка.
на всякий случай, если у любого другого человека такая же проблема, в моем случае я обнаружил, что моя служба windows случайно попала в бесконечный рекурсивный цикл. Поэтому, если у кого-то еще есть эта проблема, примите во внимание вызовы методов, которые могут вызывать огромные рекурсивные циклы.
Я получил это на определенном компьютере и проследил его до объекта c#, ссылающегося на себя изнутри инициализатора