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?
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:
Dans Visual Studio 2015 et plus récent, le processus est similaire:
Ainsi, tous les threads sont exécutés, mais le débogueur ne frappe que sur le thread actuel.
Voici ce que j'ai fait:
Définissez un point de rupture conditionnel qui, je le savais, ne toucherait que le fil que je cherchais.
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é.
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.
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 .
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
Une légèrement approche différente que j'ai utilisée:
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.
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
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.
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.
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.