web-dev-qa-db-fra.com

Comment déboguer un seul thread dans Visual Studio?

J'ai une solution avec quelques projets. Il existe plusieurs points de rupture dans différents projets. Je souhaite tracer le premier thread atteint l'un de ces points de rupture et continuer à tracer ce thread unique en dépit du fait que d'autres threads entrent dans les mêmes blocs de code.

Je sais que cela est possible en définissant une condition sur le point d'arrêt, c'est-à-dire thread name = ... ou thread Id = ... mais mon cas est une application chargée ASP.NET et dès que j'attache à w3wp.exe beaucoup de threads atteindront les points d'arrêt. J'ai besoin de quelque chose comme un ThreadLocal<break-point>.

C'est possible? Si c'est le cas, comment?

235
Xaqron

Freeze/Thaw threads est une méthode incorrecte car les autres threads n'exécutent aucun code.

La manière la plus correcte et la plus utilisable est de:

  1. Appuyez sur Ctrl + A dans la fenêtre des points d'arrêt (sélectionnez tous les points d'arrêt).
  2. Faites un clic droit et sélectionnez "Filtre ...".
  3. Entrez "ThreadId = (ID du thread actuel)".

Dans Visual Studio 2015 et plus récent, le processus est similaire:

  1. Appuyez sur Ctrl + A dans la fenêtre des points d'arrêt (sélectionnez tous les points d'arrêt).
  2. Faites un clic droit et sélectionnez "Paramètres ...".
  3. Vérifiez "Conditions" et sélectionnez "Filtre" dans la liste déroulante
  4. Entrez "ThreadId = (ID du thread actuel)".

Ainsi, tous les threads sont exécutés, mais le débogueur ne frappe que sur le thread actuel.

142
hzdbyte

Voici ce que j'ai fait:

  1. Définissez un point de rupture conditionnel qui, je le savais, ne toucherait que le fil que je cherchais.

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

  3. Cliquez avec le bouton droit de la souris et choisissez "Geler".

Maintenant, Visual Studio ne fera que parcourir le fil décongelé. Cela semble être beaucoup plus lent, probablement parce qu'il doit parcourir tous les threads gelés, mais cela a apporté un peu de raison à mon débogage multi-thread.

315
Matt Faus

Je viens de publier une extension Visual Studio 2010+ qui fait exactement ce que vous recherchez. Et c'est gratuit :).

Présentation

Cette extension Visual Studio ajoute deux raccourcis et des boutons de la barre d'outils pour permettre aux développeurs de se concentrer facilement sur des threads uniques tout en déboguant des applications multithreads.

Cela réduit considérablement le besoin d'aller manuellement dans la fenêtre Threads pour geler/dégeler tous les threads mais celui qui doit être suivi, et contribue donc à améliorer la productivité.

Caractéristiques

Restreindre l'exécution au seul thread actuel. Fera tous les autres threads. Raccourci clavier: CTRL + T + T ou bouton Flocon. Basculez vers le prochain thread unique (basé sur l'ID). Change le thread actuel et gèle tous les autres threads. Raccourci: CTRL + T + J ou bouton Suivant.

Allez voir ici sur la galerie , sur le page officielle ou le référentiel Github .

13
Erwin Mayer

Si plusieurs threads sont créés comme pour une application Web, les réponses @MattFaus ne fonctionneront pas. ce que j'ai fait à la place est le suivant

  • Configurez un point d'arrêt pour interrompre le thread dans la fonction souhaitée.
  • Une fois que le thread a atteint le point d'arrêt et qu'il est en pause, je le supprime et continue le débogage à l'aide de F8, F10 et F11, afin que les autres threads puissent s'exécuter.
10
Mikaël Mayer

Une légèrement approche différente que j'ai utilisée:

  1. Créez un point d'arrêt normal et laissez-le toucher
  2. Recherchez dans votre fenêtre de threads l'ID de thread géré que vous êtes en train de déboguer.
  3. Faites un clic droit sur votre point d'arrêt dans la fenêtre des points d'arrêt et dans le filtre de sélection
  4. Entrez ThreadId = xxx où xxx est l'ID de thread de 2
  5. Vous pouvez maintenant déboguer sans arrêter les autres threads et sans qu'ils atteignent votre point d'arrêt

Cela suppose que vous ayez le temps de faire ce qui précède avant qu'un deuxième thread atteigne votre point d'arrêt. Si ce n'est pas le cas et que d'autres threads atteignent votre point d'arrêt avant d'avoir effectué ce qui précède, vous pouvez cliquer dessus avec le bouton droit de la souris dans la fenêtre des discussions et choisir Figer.

8
Matt

Définissez une condition de point d'arrêt en cliquant avec le bouton droit de la souris sur la barre latérale de la ligne. Sélectionnez "Condition" et entrez le texte suivant avec le nom de votre fil entre guillemets:

System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"

Vous pouvez également faire de même en obtenant le "ID géré" du fil à partir de la fenêtre "Threads" et en utilisant:

System.Threading.Thread.CurrentThread.ManagedThreadId == votre_managed_thread_managed

1
James Sheridan

Je pense que cela est légèrement différent dans Visual Studio 2015. Ils ont modifié certaines choses dans les points d'arrêt, mais voici comment appliquer la réponse acceptée de hzdbyte (ci-dessus):

Sur le point d'arrêt de la marge de codage, cliquez avec le bouton droit de la souris sur> Conditions> Remplacer de 'Expression conditionnelle' par 'Filtrer'. Cela vous permet ensuite de filtrer par ThreadId.

Vous pouvez également sélectionner un point d'arrêt dans la fenêtre Points d'arrêt, clic droit> Paramètres>, cochez la case Conditions et procédez comme indiqué ci-dessus.

1
Patelos

Si vous ne souhaitez pas arrêter tous les autres threads (peut-être que vous attachez le débogueur Visual Studio à une application en cours d'exécution devant répondre à des demandes), vous pouvez utiliser une macro qui crée et supprime automatiquement des points d'arrêt.

Ceci est suggéré dans ne réponse à la question Stack Overflow "lors du débogage de programmes multithreads dans Visual Studio .

Cependant, le lien explique uniquement comment déboguer ligne par ligne. Je vous suggère de modifier la macro (si cela vous convient) pour lui faire modifier tous les points d'arrêt (dans une plage de ligne donnée, par exemple) pour qu'elle ne s'arrête que sur le fil actuel.

1
kamaradclimber

Je suggérerais d'ajouter une autre instance de l'application sur le serveur live, soit sur le même matériel, soit sur une nouvelle machine (en cluster), puis de déboguer uniquement cette instance. Je ne voudrais pas ajouter un point d'arrêt dans le code déclenchent les utilisateurs. Si ce n'est pas une option, j'ajouterais plus de traçage.

Cependant, si cela est absolument nécessaire et que vous avez besoin d'une solution stat, je suis sûr que vous pouvez ajouter un point d'arrêt qui ne se brise que si la demande provient de votre adresse IP. Vous feriez cela en ajoutant un point d'arrêt conditionnel qui inspecte HttpContext.Request.UserHostAddress. Notez cependant que cela ralentit considérablement votre application.

1
steinar