Visual Studio, déboguer l’un des plusieurs threads

J’ai une application avec 4 threads travaillant sur le même code. Cependant, quand je le fais, il saute entre les différents threads. Comment puis-je le verrouiller sur un thread afin que les autres threads soient ignorés pour le débogage?

Oui.

Dans la fenêtre Threads (Debug -> Windows -> Threads), cliquez avec le bouton droit de la souris sur le thread souhaité et sélectionnez “passer à un thread”.

Vous pouvez également choisir “geler” sur les threads que vous ne souhaitez pas déboguer pour les empêcher de fonctionner. N’oubliez pas de les “dégeler” si vous vous attendez à ce qu’ils fassent du travail, cependant.

Lectures complémentaires

Un simple passage à travers un seul thread semble être le plus souvent corrigé dans VS 2012 (avec quelques avertissements que vous pouvez voir dans mon lien ci-dessous). Les points d’arrêt sont une douleur.

La congélation et la décongélation des threads est la solution de contournement habituelle, comme les réponses précédentes l’ont indiqué, mais elle est fastidieuse et peut causer des blocages lorsque votre thread attend un autre thread qui est figé. Celles-ci peuvent être difficiles à récupérer sans perdre votre place dans votre fil d’intérêt.

Un autre stream de travail utile consiste à appliquer un filtre de thread sur vos points d’arrêt, également indiqué dans certaines des réponses:

Créez un point d’arrêt, cliquez avec le bouton droit sur le point d’arrêt, cliquez sur Filtre et entrez ThreadId = 7740 (votre identifiant de thread dans la fenêtre des threads).

Cela peut être très fastidieux.

Ma suggestion à Microsoft est de corriger les étapes simples (et leurs variantes) pour ne jamais changer de thread, sauf si un point d’arrêt explicite est atteint dans un autre thread. Ils devraient également append un raccourci (peut-être Ctrl-F9) pour créer un point d’arrêt avec l’ID de thread actuel comme filtre. Cela rendrait le deuxième workflow beaucoup plus pratique.

Votez pour la suggestion si vous acceptez que cela soit utile ou ajoutez vos propres suggestions:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst

Vous pouvez également placer un point d’arrêt conditionnel dans votre code et mettre le thread.Id == [someValue] ou Thread.Name == "[Somename]" dans la condition du point d’arrêt …

Cela ressemble fortement à un problème très similaire dans Visual Studio 2008 SP1. Il a été corrigé avec un correctif post-SP. Mais il existe d’autres preuves que le correctif n’a pas été incorporé dans la base de code, cet élément de commentaire était également un problème. Ce n’est pas si inhabituel que les correctifs ne soient pas intégrés.

Il n’y a pas d’article de rétroaction décrivant exactement votre problème, du moins que je peux trouver. Je vous recommande de déposer un. Étant donné les problèmes habituels liés à la reproduction de bogues comme celui-ci, je vous recommande fortement d’inclure un projet de reproduction présentant ce problème avec des instructions sur la manière de reproduire le problème.

Il existe une solution de contournement pour votre problème, vous pouvez aller dans Debug + Windows + Threads, cliquez avec le bouton droit sur les threads que vous ne souhaitez pas déboguer et sélectionnez Figer. N’oubliez pas de les dégeler plus tard.

Ces bogues ont été corrigés à nouveau dans Visual Studio 2010 Service Pack 1.

Une solution de contournement beaucoup plus rapide existe pour les cas simples – voir les commentaires dans le lien de Steve.

le débogueur ne terminera qu’une étape sur le thread à l’origine de l’étape. Donc, si vous appuyez sur un point d’arrêt, désactivez-le, puis commencez à marcher, vous ne devez pas vous arrêter sur un thread différent. Si vous avez d’autres points d’arrêt dans votre application et qu’un autre thread en atteint un, vous allez déboguer à l’état de thread mixte comme décrit

Donc, dans mon cas, une fois que les différents threads ont commencé à atteindre mon point d’arrêt, je viens d’appuyer sur Continue plusieurs fois jusqu’à ce que j’identifie l’appel que je cherchais. le rest d’entre eux.

Cela devient évidemment un problème si vous souhaitez conserver plusieurs points d’arrêt, etc., mais encore une fois, pour des cas simples, cela est beaucoup plus facile à faire.