2012-06-26 7 views
9

Mam usługę Windows, która wykonuje intensywną pracę co minutę (w rzeczywistości zaczyna nowy wątek za każdym razem, gdy jest synchronizowany z innymi systemami za pośrednictwem protokołu HTTP). Problem polega na tym, że po kilka dni nagle zatrzymuje się bez żadnego komunikatu o błędzie.Usługa Windows/Nowa strona strażnika dla stosu nie może zostać utworzona

Mam NLog na miejscu i mam zarejestrowany dla "AppDomain.CurrentDomain.UnhandledException". Ostatni wpis w logu tekstowym jest normalnym wpisem bez żadnych problemów. Patrząc w dzienniku zdarzeń, nie mogę znaleźć żadnej wiadomości w dzienniku aplikacji, jednak w dzienniku systemu są dwa wpisy.

Mówi się, że usługa została niespodziewanie zakończona. Nic więcej. Drugie zdarzenie (w tym samym czasie co pierwsze) mówi: "... Nie można utworzyć nowej strony strażnika dla stosu ..."

Z tego, co przeczytałem, wynika prawdopodobnie przepełnienie stosu wyjątek. Nie parsuję żadnego XML i nie wykonuję pracy rekurencyjnej. Hostuję serwer WWW za pomocą Gate, Nancy i SignalR, a RavenDB działa w trybie embedded. Co minutę uruchamiane jest nowe zadanie za pomocą Taskfactory z .NET 4.0 i mam także ContinueWith, gdzie ponownie uruchamiam System.Timers.Timer, aby ponownie uruchomić w ciągu jednej minuty.

Jak mogę rozpocząć badanie tego problemu? Jakie mogą być przyczyny takiego błędu?

+3

Tak, jest to SO. Nie jest to kod zarządzany, inaczej zgłasza wyjątek. Masz garść kodu, którego nie napisałeś, to wszystko jest podejrzane. –

Odpowiedz

9

Na podstawie informacji, które podałeś, chciałbym przynajmniej na minimum, wykonaj następujące czynności:

  1. dopłacać uwagę na wszelkie połączeń zewnętrznych, a także dodać dodatkowe informacje zalogowaniem wokół tych punktów.
  2. Istnieją pewne okoliczności, w których AppDomain.CurrentDomain.UnhandledException nie pomoże, a mianowicie StackOverflowException. Wierzę, że CLR po prostu da ci ciąg znaków w tym przypadku zamiast śledzenia stosu.
  3. Należy zwrócić szczególną uwagę na obszary, w których wprowadzono więcej niż jeden wątek.

Przykładem często pomijany StackOverflowException jest:

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

Dzięki za odpowiedź! Postaram się odrzucić Task.New.ContinueWith rzeczy i zobacz, czy to robi jakąkolwiek różnicę. Jedno pytanie - czy może to być również wyjątek System.OutOfMemoryException? –

+1

@DanielLang: Tak, jest to również możliwe. –

+0

@BryanCrosby jest możliwe, aby uzyskać wyjątek System.OutOfMemoryException i nie zostać zarejestrowanym w sekcji Appliaction przeglądarki zdarzeń? –

2

Podobnie jak „co to jest warte” - w moim przypadku ten błąd został zgłoszony, gdy kod został próby zapisu do Windows Dziennik zdarzeń i użytkownik interaktywny nie mają wystarczających uprawnień. Była to niewielka aplikacja konsolowa, która rejestrowała wyjątki do pliku tekstowego i dziennika zdarzeń (w razie potrzeby). W przypadku wyjątku plik tekstowy był aktualizowany, ale następnie ten błąd został zgłoszony i nie został przechwycony przez obsługę błędów. Wyłączenie rejestrowania zdarzeń zatrzymało wystąpienie błędu.

0

Na wszelki wypadek, gdy jakakolwiek inna osoba ma ten sam problem, w moim przypadku okazało się, że moja usługa Windows została przypadkowo uwięziona w nieskończonej pętli rekurencyjnej. Więc jeśli ktokolwiek inny ma ten problem, weź pod uwagę wywołania metod, które mogą powodować ogromne pętle rekurencyjne.

Powiązane problemy