2010-09-18 6 views
4

J'ai hérité d'un projet de service C# windows volumineux et complexe qui se bloque de temps en temps. Le système de journalisation n'enregistre aucun message que je pensais initialement étrange mais je comprends maintenant que la journalisation peut échouer s'il y a un débordement de pile ou une exception de mémoire insuffisante.Recherche d'exceptions de dépassement de pile dans un service Windows

donc l'une des tâches que j'ai est d'essayer de trouver toutes les fonctions récursives qui pourrait souffler la pile. Existe-t-il des outils dans VS2010 ou d'autres logiciels d'analyse de code qui pourraient aider à détecter le code récursif?

En deuxième question: Que pourrait faire échouer la connexion à un service de fenêtres?

(projet utilise VS2010 mais elle cible encore .net 3.5 avec C# 3,0)

+2

+1 pour utiliser le dépassement de pile dans le titre de la question. –

+1

Une erreur dans le mécanisme de journalisation lui-même pourrait provoquer le SO. Si la journalisation échoue, une exception est lancée, qui essaiera de se connecter, ... – StuartLC

+1

Quel framework de journalisation utilisez-vous? Par exemple, log4net est le meilleur-effort - il ne plantera pas votre application si elle ne peut pas se connecter. –

Répondre

3

Télécharger Debug Diagnostic Tool, pointer vers votre service et ajouter un débordement de pile dans les listes d'exceptions et le laisser courir. Lorsque le service échoue, il va vider la mémoire. Ouvrez la sauvegarde dans Visual Studio et vérifiez toutes les piles sur tous les threads pour identifier le code offensif. Vous pourriez avoir besoin des symboles de débogage d'origine pour votre service pour obtenir des informations intelligibles.

En savoir plus sur le débogage avec mémoire décharges VS2010 here. Plus d'informations sur le débogage de ce type de problèmes avec Tess Ferrandez montre this

Mise à jour: Tutorial sur une exception de dépassement de pile avec des détails. Il est basé sur une application web dans IIS mais vous pouvez facilement appliquer la même technique à un service, c'est juste la façon dont vous prenez le vidage mémoire qui est différent.

HTH

1

Êtes-vous attachés aux AppDomain.UnHandledException événement? Il devrait déclencher un événement si une exception non gérée se produit. Aussi, avez-vous vérifié le journal des événements?

Il est très difficile d'essayer de deviner ce qui pourrait causer votre service crash. Si vous êtes attaché à l'événement que j'ai mentionné, je suppose que cela ne pourrait être qu'un des rares événements, une exception StackOverflow en étant un. Si vous ne vous attachez pas à cet événement, cela pourrait être n'importe quoi.

Si vous êtes vraiment à une perte, vous pouvez toujours essayer de run the service as a console application à partir de Visual Studio. Visual Studio devrait alors vous montrer l'erreur si elle se produit. Ce n'est pas toujours possible en fonction de votre environnement.

Questions connexes