Détection de blocages dans une application C# [dupliquer]

possibilité de dupliquer:

c#/. outil D'analyse Net pour trouver les conditions de course /blocages

je suis en train de déboguer une application que je soupçonne d'être bloquée et suspendue. Toutefois, cela ne se produit que tous les quelques jours, et il n'arrive jamais sur mon ordinateur donc je ne peux pas le crochet d'un débogueur. Y a-t-il des utilités ou des méthodes que je peux utiliser pour interroger l'exécution application et trouver quelles méthodes / serrures / quoi que ce soit qui est bloqué?

mise à jour: typiquement, l'application fonctionne chez le client et je n'ai pas accès à la machine, et je ne suis pas tout à fait à l'aise de leur demander d'installer des tonnes de logiciels.

22
demandé sur Community 2009-02-03 21:47:57

7 réponses

au lieu d'utiliser l'approche habituelle lock & Monitor.Enter pour verrouiller certaines données, vous pouvez également utiliser une structure 'TimedLock'. Ce TimedLock lance une exception si la serrure ne pouvait pas être acquise en temps opportun, et il peut également vous donner un avertissement si vous avez des serrures que vous n'avez pas relâché.

cet" article de 151960920 " par Ian Griffiths pourrait peut-être aider.

8
répondu Frederik Gheysels 2009-02-03 19:25:11

vous pouvez utiliser WinDbg pour inspecter les fils dans l'application. Voici un petit plan de ce que vous pourriez faire.

  • lorsque L'application est suspendue, copiez les fichiers WinDbg sur la machine.
  • soit fixer WinDbg au procédé, soit utiliser ADPlus pour obtenir un dump pendu du procédé. Si vous choisissez ADPlus, vous chargez alors le dump dans WinDbg.
  • de WinDbg vous chargez sos.dll, pour que vous puissiez inspecter code géré.
  • la commande !threads vous montrera tous les threads dans l'application et la commande !clrstack , vous montrera ce qu'ils font. Utilisez ~e!clrstack pour vider la pile d'appels de tous les threads. Recherchez les appels à attendre les méthodes qui indiquent le verrouillage.
  • la commande !syncblk vous donnera des informations sur les fils qui tiennent les différentes serrures.
  • pour découvrir quelle serrure un fil donné essaie pour acquérir, basculer sur le thread et inspecter les objets stack ( !dso ). De là, vous devriez être en mesure de trouver la serrure le fil est d'essayer d'acquérir.

Clarification: WinDbg ne nécessite pas d'installation régulière. Il suffit de copier les fichiers. En outre, si vous prenez la décharge hang, vous pouvez continuer à déboguer sur une autre machine si vous le souhaitez.

: Sosex a la !dlk commande automatiquement identifie des blocages dans de nombreuses situations. Ça ne marche pas tout le temps, mais quand ça marche, ça fait tout le travail pour toi, donc ça devrait être ton premier choix.

22
répondu Brian Rasmussen 2013-10-15 15:52:39

délais d'attente dans la programmation simultanée est une idée horrible. Cela conduit à un non-déterminisme et donc à un comportement qui ne peut pas être reproduit. Essayez d'utiliser un outil de détection de blocage comme Echecs . Mieux encore, minimisez le nombre de serrures utilisées avec des algorithmes sans serrure, ou évitez les serrures entièrement et cloisonnez votre programme en compartiments à filetage simple et utilisez des files d'attente pour passer des données entre les compartiments (mieux connu sous le nom de message-passing/acteur concurrence).

6
répondu naasking 2010-03-08 19:10:30

the end of http://blogs.technet.com/askperf/archive/2007/06/15/capturing-application-crash-dumps.aspx dit que sur Vista au moins vous pouvez obtenir un dump crash d'un processus en cours d'exécution en utilisant le Gestionnaire de tâches.

1
répondu ChrisW 2009-02-03 18:53:38

vous avez en fait un problème très intéressant là-bas. Il y a plusieurs choses que vous pouvez faire:

utilisez un bon logger: une des façons de reproduire une erreur de thread multiple est d'avoir un logger qui imprimera les actions prises et le thread qui les a effectuées, de cette façon vous pouvez trouver une trace qui vous guide vers l'erreur. C'est assez facile, solution si vous pouvez ajouter l'enregistreur.

utiliser FSP: Définissez votre système multi threaded en utilisant FSP. Ce façon vous serez en mesure de créer une machine à états finis du processus que vous pouvez marcher à travers pour trouver l'erreur. Cette solution est plus mathématique.

les deux solutions/procédures que je vous présente sont exactement les principales différences d'approche du développement multi-threadé entre certains universitis Britanniques et les Américains. Au Royaume-Uni, les professeurs sont plus gentils d'essayer de prouver que leur système n'a pas d'erreurs en utilisant FSP avant de le programmer, et les Américains préfèrent tester pour prouver qu'ils fonctionnent correctement, est une question de goût.

je recommande vivement de lire ce livre: Jeff Magee and Jeff Kramer: Competiency: State Models and Java Programs, Wiley, 1999

1
répondu mandel 2009-02-03 19:08:35

c'est un problème très intéressant et une douleur parce qu'il n'arrive que quelques jours. J'ai trouvé cet article sur le Codeprojet . Il pourrait être un début pour vous.

une approche ancienne consiste à enregistrer une tonne de messages et à utiliser des fichiers journaux pour essayer de détecter quand cela se produit. :)

0
répondu Szymon Rozga 2009-02-03 19:01:39

en plus des réponses ici, une autre chose que vous trouveriez utile avec la programmation de thread en général est de s'assurer que votre dev box est une machine multiprocesseur, les blocages en particulier sont (généralement) beaucoup plus reproductibles.

0
répondu Tim Jarvis 2009-02-03 21:42:29