J'ai une solution avec certains projets. Il existe plusieurs points d'arrêt dans différents projets. Je veux tracer le premier thread a atteint l'un de ces points d'arrêt et continuer à tracer ce thread unique malgré d'autres threads entrant 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 le nom du thread = ... ou l'ID du thread = ... mais mon cas est une application ASP.NET chargée et dès que je l'attache à w3wp.exe
plusieurs les 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?
Réponses:
Geler / Décongeler les threads est une manière incorrecte car les autres threads n'exécutent aucun code.
La manière la plus correcte et la plus utilisable consiste à:
Dans Visual Studio 2015 et versions ultérieures, le processus est similaire:
Tous les threads sont donc exécutés, mais le débogueur ne frappe que le thread actuel.
la source
System.Threading.Thread.CurrentThread.ManagedThreadId
ou quelque chose?Voici ce que j'ai fait:
Définissez un point d'arrêt conditionnel qui, je le savais, ne toucherait que le thread que je recherchais.
Une fois que le point d'arrêt atteint et que vous êtes dans le thread souhaité, dans la fenêtre Threads de Visual Studio (pendant le débogage, Débogage -> Windows -> Threads), Ctrl+ A(pour sélectionner tous les threads), puis Ctrl+ cliquez sur le thread sur lequel vous êtes actuellement . Vous devez avoir tous les threads à l'exception de celui que vous souhaitez déboguer sélectionné.
Maintenant, Visual Studio ne parcourra que le thread décongelé. Cela semble être beaucoup plus lent lors de cette opération, probablement parce qu'il doit parcourir tous les threads gelés, mais cela a apporté un peu de raison à mon débogage multithread.
la source
Je viens de publier une extension Visual Studio 2010+ qui fait exactement ce que vous recherchez. Et c'est gratuit :).
Découvrez-le ici sur la Galerie , sur la page officielle ou le référentiel Github .
la source
Si plusieurs threads sont générés comme pour une application Web, les réponses @MattFaus ne fonctionneront pas. ce que j'ai fait à la place est le suivant
la source
Une approche légèrement différente que j'ai utilisée:
Cela suppose que vous avez 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 fait ce qui précède, vous pouvez cliquer dessus avec le bouton droit de la souris dans la fenêtre des threads et choisir figer.
la source
lock(m_someObject) { ; }
Dans VS 2019:
la source
Je suggérerais d'ajouter une autre instance de l'application sur le serveur en direct, soit sur le même matériel ou sur une nouvelle machine (la mettre en cluster), puis de déboguer uniquement cette instance. Je n'ajouterais pas de point d'arrêt dans le code que les utilisateurs déclenchent. 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 stat de solution, je suis sûr que vous pouvez ajouter un point d'arrêt qui ne s'arrête que si la demande provient de votre adresse IP. Pour ce faire, vous ajoutez un point d'arrêt conditionnel qui inspecte
HttpContext.Request.UserHostAddress
. Notez cependant que cela ralentit considérablement votre application.la source
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 qui doit répondre aux demandes), vous pouvez utiliser une macro qui crée et supprime automatiquement des points d'arrêt.
Cela est suggéré dans une réponse à la question de dépassement de pile "Étape" lors du débogage de programmes multithread dans Visual Studio .
Cependant, le lien explique uniquement comment déboguer ligne par ligne. Je vous suggère de modifier la macro (si vous êtes à l'aise avec elle) pour lui faire modifier tous les points d'arrêt (dans une plage de ligne donnée par exemple) pour ne s'arrêter que sur le thread actuel.
la source
Je pense que c'est légèrement différent dans Visual Studio 2015. Ils ont changé quelques 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 dans la marge de codage, cliquez avec le bouton droit sur> Conditions> Passer de «Expression conditionnelle» à «Filtre». Cela vous permet ensuite de filtrer par ThreadId.
Sinon, sur le point d'arrêt dans la fenêtre Points d'arrêt, cliquez avec le bouton droit sur> Paramètres> cochez la case Conditions et procédez comme ci-dessus.
la source
Définissez une condition de point d'arrêt en cliquant avec le bouton droit sur la barre latérale de la ligne. Sélectionnez "Condition" et entrez ce qui suit avec le nom de votre fil entre guillemets:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
Alternativement, vous pouvez faire la même chose en récupérant l '"ID géré" du thread dans la fenêtre "Threads" et en utilisant:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
la source