Служба Windows / новая страница guard для стека не может быть создана

У меня есть служба windows, которая делает некоторую интенсивную работу каждую минуту (на самом деле она запускает новый поток каждый раз, когда он синхронизируется с различными системами через http). Проблема в том, что после через несколько дней он внезапно останавливается без сообщения об ошибке.

У меня NLog и я зарегистрирован на домене.CurrentDomain.События unhandledexception'. Последняя запись в textfile-log - это просто обычная запись без каких-либо проблем. Глядя в журнал, я также не удается найти сообщение в журнале приложений, однако в системном журнале есть две записи.

один в основном говорит, что служба была неожиданно завершена. Ничего больше. Второе событие (одновременно с первым) говорит: "...Не удается создать новую страницу guard для стека..."

из того, что я прочитал, это, вероятно, исключение переполнения стека. Я не анализирую XML, и я не делаю рекурсивную работу. Я размещаю веб-сервер, используя Gate, Nancy и SignalR и RavenDB работают в встроенном режиме. Каждую минуту новая задача запускается с помощью Taskfactory из .NET 4.0, и у меня также есть ContinueWith, где я снова запускаю систему.Таймеры.Таймер снова выстрелит через минуту.

Как я могу начать расследование этого вопроса? Каковы возможные причины такой ошибки?

4 ответов


основываясь на информации, которую вы предоставили, я бы, по крайней мере, как минимум, сделать следующее:

  1. обратите особое внимание на любые сторонние вызовы и добавьте дополнительную информацию, регистрирующуюся вокруг этих точек.
  2. существуют некоторые обстоятельства, при которых AppDomain.CurrentDomain.UnhandledException не поможет вам - a StackOverflowException одно из них. Я считаю, что CLR просто даст вам строку в этом случае вместо трассировки стека.
  3. обратите дополнительное внимание вокруг областей где больше чем вводится один поток.

пример часто забывают StackOverflowException - это:

private string myString;
public string MyString { get { return MyString; } }  //should be myString

Так же, как "для чего это стоит" - в моем случае эта ошибка была сообщена, когда код пытался записать в журнал событий Windows, и интерактивный пользователь не имел достаточного разрешения. Это было небольшое консольное приложение, которое регистрировало исключения из текстового файла и журнала событий (при желании). При исключении текстовый файл обновлялся, но затем эта ошибка была вызвана и не поймана обработкой ошибок. Отключение ведения журнала событий остановлена ошибка.


на всякий случай, если у любого другого человека такая же проблема, в моем случае я обнаружил, что моя служба windows случайно попала в бесконечный рекурсивный цикл. Поэтому, если у кого-то еще есть эта проблема, примите во внимание вызовы методов, которые могут вызывать огромные рекурсивные циклы.


Я получил это на определенном компьютере и проследил его до объекта c#, ссылающегося на себя изнутри инициализатора