2009-10-10 6 views
5

Lorsque je travaille sur des threads multithreads, comment puis-je déboguer pour savoir quel thread provoque un comportement anormal? Puis-je utiliser permonitor pour le débogage ou existe-t-il d'autres outils ou fonctionnalités de débogage disponibles?Débogage des threads C#

Répondre

1

Vous pouvez utiliser Visual Studio pour définir des points d'arrêt sur certains threads. Voir here et here pour savoir comment le faire.

1

Cela dépend de ce que vous entendez par « comportement anormal » ...

pour la plupart du temps, le débogueur studio visuel devrait être suffisant. les fenêtres Threads et CallStack vous donneront beaucoup d'informations sur ce qui se passe.

Pour les travaux lourds, vous pouvez utiliser WinDbg + SOS. Lisez à propos des commandes! threads,! threadpool et! runaway.

+0

Habituellement il serait plus confortable d'utiliser ces commandes via le panneau Intermediate en VS (pas besoin de lancer WinDbg en tant que processus séparé ..) –

+0

@opc: vous avez raison tant que vous n'avez pas besoin des autres commandes WinDbg. ce qui n'est pas toujours le cas. –

1

Si vous avez plusieurs threads du même type * vous pouvez modifier votre code pour exécuter un seul de chaque type de fil (ou peut-être mettre dans le fichier de configuration de l'application afin que vous puissiez le changer rapidement pendant le débogage).

Si l'application se comporte toujours mal, alors vous savez qu'il s'agit d'une interaction entre les différents types de threads à l'origine du problème. Si ce n'est pas le cas, il se peut qu'il y ait une ressource que vous n'avez pas verrouillée correctement (par exemple). Ce que j'essaie de dire est de simplifier votre application au point où il utilise le nombre minimum de threads pour toujours être votre conception originale.

* Pas le meilleur mot à utiliser, mais par exemple si vous engendrez 10 threads pour traiter avec le fichier i/o Spawn seulement 1.

+0

Très bonne suggestion M. Chris. – user186973

1

Comment définissez-vous un comportement anormal? Serait-ce une exception? Je ne sais pas si cela vous aidera, mais ce que je fais souvent, c'est nommer l'objet thread lorsque je le crée, puis si j'attrape une exception ou si certains critères existent, j'écris dans le journal des événements. J'inclus l'heure, le nom de l'application, le nom du thread et les informations d'exception. Je ne l'utilise pas seulement pour le débogage, je l'utilise si un utilisateur se plaint d'un comportement étrange ou signale une erreur. Ensuite, je peux revenir en arrière et obtenir des informations à ce sujet.