it-swarm.com.ru

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

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

У меня есть NLog, и я зарегистрировался для «AppDomain.CurrentDomain.UnhandledException». Последняя запись в textfile-log - это обычная запись без проблем. Просматривая журнал событий, я также не могу найти ни одного сообщения в журнале приложений, однако в системном журнале есть две записи. 

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

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

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

12
Daniel Lang

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

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

Пример часто пропускаемого StackOverflowException:

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

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

2
Kevin Newton

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

1
Kirsten Greed

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

0
Rolando Retana