web-dev-qa-db-fra.com

Service Windows/Impossible de créer une nouvelle page de garde pour la pile

J'ai un service Windows qui effectue un travail intensif toutes les minutes (en fait, il démarre un nouveau thread à chaque fois dans lequel il se synchronise sur différents systèmes via http). Le problème est que, après quelques jours il s’arrête soudainement sans message d’erreur.

J'ai NLog en place et je me suis inscrit pour 'AppDomain.CurrentDomain.UnhandledException'. La dernière entrée de textfile-log est juste une entrée normale sans aucun problème. En regardant dans le journal des événements, je ne trouve pas non plus de message dans le journal des applications, cependant, il y a deux entrées dans le journal système. 

On dit essentiellement que le service a été interrompu de manière inattendue. Rien de plus. Le deuxième événement (en même temps que le premier) indique: "... Une nouvelle page de garde pour la pile ne peut pas être créée ..."

D'après ce que j'ai lu, il s'agit probablement d'une exception de débordement de pile. Je n'analyse aucun XML et je ne fais pas de travail récursif. J'héberge un serveur Web utilisant Gate, Nancy et SignalR, et RavenDB s'exécute en mode intégré. Chaque minute, une nouvelle tâche est démarrée à l'aide de Taskfactory à partir de .NET 4.0 et j'ai également un ContinueWith avec lequel je redémarre un System.Timers.Timer pour qu'il se déclenche à nouveau en une minute.

Comment puis-je commencer à enquêter sur ce problème? Quelles pourraient être les raisons possibles d'une telle erreur?

12
Daniel Lang

Sur la base des informations que vous avez fournies, je voudrais au moins procéder comme suit:

  1. Portez une attention particulière aux appels de tiers et ajoutez des informations supplémentaires se rapportant à ces points.
  2. Il existe certaines circonstances dans lesquelles AppDomain.CurrentDomain.UnhandledException ne vous aidera pas - une StackOverflowException étant l'une d'entre elles. Je crois que le CLR va simplement vous donner une chaîne dans ce cas au lieu d'une trace de pile.
  3. Portez une attention particulière autour des zones où plusieurs threads sont introduits.

Un exemple de StackOverflowException souvent négligé est:

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

Juste comme un «pour ce que cela vaut» - dans mon cas, cette erreur a été signalée lorsque le code tentait d'écrire dans le journal des événements Windows et que l'utilisateur interactif ne disposait pas de l'autorisation suffisante. Il s'agissait d'une petite application de console qui consignait les exceptions dans un fichier texte et le journal des événements (si nécessaire). Exceptionnellement, le fichier texte était en cours de mise à jour, mais cette erreur a été renvoyée et n'a pas été interceptée par la gestion des erreurs. La désactivation de la journalisation des événements a arrêté l’erreur survenue.

2
Kevin Newton

Je l'ai eu sur un ordinateur particulier et l'ai tracé à un objet c # se référant lui-même à partir d'un initialiseur

1
Kirsten Greed

Juste au cas où une autre personne aurait le même problème, dans mon cas, j’ai constaté que mon service Windows était coincé dans une boucle récursive sans fin accidentellement. Donc, si quelqu'un d'autre a ce problème, prenez en compte les appels de méthode qui peuvent causer d'énormes boucles récursives.

0
Rolando Retana