293 votes

Comment déboguer un seul thread dans Visual Studio?

J'ai une solution à certains projets. Il y a plusieurs break-points dans les différents projets. Je veux tracer le premier thread frappé l'un de ces break-points et continuer le suivi ce thread unique malgré des autres threads d'entrer le même code-blocks.

Je sais que c'est possible grâce à la définition d'une condition sur le point de rupture, c'est le nom du thread = ... ou l'Id de thread = ... mais mon cas est un lourd chargé ASP.NET demande et dès que j'accorde à l' w3wp.exe nombre de threads que de frapper la pause-points. J'ai besoin de quelque chose comme un ThreadLocal<break-point>.

Est-il possible? Si oui, comment?

393voto

Matt Faus Points 2332

Voici ce que j'ai fait:

  1. Définir un saut conditionnel point que je savait seulement frapper sur le fil que je cherchais.

  2. Une fois que le point d'arrêt est atteint et que vous êtes dans le fil que vous voulez, dans Visual Studio fenêtre Threads (pendant le débogage, Debug -> Windows -> Threads), Ctrl + A (pour sélectionner tous les threads), puis Ctrl + clic sur le fil que vous êtes actuellement sur. Vous devriez avoir tous les threads à l'exception de celui que vous souhaitez déboguer sélectionné.

  3. Cliquez avec le bouton droit et choisissez "Geler".

Maintenant, Visual Studio n'intervient que par le biais de la décongelés fil. Il semble être beaucoup plus lent lorsque vous faites cela, sans doute, car il a une boucle par tous les congelés filets, mais il a apporté un peu de raison à mon multi-thread de débogage.

176voto

hzdbyte Points 146

Fils de gel/dégel est une manière incorrecte parce que les autres threads n’exécutent pas n’importe quel code.

La façon la plus correcte et utilisable est de :

  1. Appuyez sur Ctrl + A dans la fenêtre points d’arrêt (sélectionnez tous les points d’arrêt).
  2. Faites un clic droit et sélectionnez « filtre ».
  3. Entrez « ThreadId =(current thread id) ».

Si tous les threads sont exécutés, mais le débogueur accède sur le thread actuel uniquement.

20voto

Erwin Mayer Points 3427

Je ne sais pas pourquoi ma réponse a été supprimé (il est particulièrement pertinent à la question), il est donc ici de nouveau:

Je viens de sortir un Visual Studio 2010 extension qui fait exactement ce que vous cherchez. Et c'est gratuit :).

Présentation

Ce Visual Studio 2010 extension ajoute deux raccourcis et boutons de barre d'outils pour permettre aux développeurs de facilement se concentrer sur l'unique fils lors du débogage d'applications multi-thread.

Il réduit considérablement la nécessité d'aller manuellement dans la fenêtre Threads de gel/dégel tous les threads, mais celui qui doit être suivi, et, par conséquent, contribue à améliorer la productivité.

Caractéristiques

Restreindre la poursuite de l'exécution du thread courant. Geler tous les autres threads. Raccourci: CTRL+T+T ou Flocon de neige bouton. Passer à la prochaine thread (basée sur l'ID). Va changer de thread en cours et de geler tous les autres threads. Raccourci: CTRL+T+J ou bouton Suivant.

Check it out ici sur la Galerie, sur la page officielle ou la Codeplex référentiel.

11voto

Matt Points 46

Un légèrement différent de l'approche que j'ai utilisée:

  1. Créer un point d'arrêt normal et de le laisser se faire frapper
  2. Regardez dans votre threads de la fenêtre pour la gestion de l'ID de thread que vous êtes actuel de débogage
  3. Cliquez-droit sur votre point d'arrêt dans la fenêtre des points d'arrêt et filtre selecter
  4. Entrez ThreadId=xxx où xxx est l'ID de thread à partir de 2
  5. Vous pouvez maintenant déboguer sans arrêt les autres threads et sans eux, les coups de votre point d'arrêt

Cela suppose que vous avez le temps de faire ci-dessus avant un deuxième thread hits votre point d'arrêt. Si non, et les autres threads frapper votre point d'arrêt avant que vous avez fait ci-dessus, vous pouvez cliquer droit dans les filets de la fenêtre et choisissez gel.

1voto

steinar Points 4762

Je suggère l'ajout d'une autre instance de l'application sur le serveur live, que ce soit sur le même matériel ou une nouvelle machine (cluster) et puis debug uniquement cette instance. Je ne voudrais pas ajouter un point d'arrêt dans le code, les utilisateurs sont de déclenchement. Si ce n'est pas une option, j'aimerais ajouter plus de suivi.

Toutefois, si cela est absolument nécessaire et vous avez besoin d'une solution de stat, je suis sûr que vous pourriez ajouter un point d'arrêt qui casse uniquement si la demande est à venir à partir de votre adresse IP. Vous devez faire cela en ajoutant un point d'arrêt conditionnel qui inspecte HttpContext.Request.UserHostAddress. Notez cependant que cela ralentit votre application considérablement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X