Comment déboguer un seul thread dans Visual Studio [dupliquer]

cette question a déjà une réponse ici:

j'aimerais pouvoir suivre l'exécution d'un seul thread pendant le débogage. J'utilise un threadpool pour que le débogueur continue de passer entre les threads et cela rend le débogage très inconfortable.

Lecture:

j'obtiens une solution qui est des points de rupture conditionnels (basés sur le nom du thread). Cependant, Je ne peut pas dire "le fil #3" sera toujours celui de traiter le cas intéressant, je voudrais donc avoir à changer la condition pour chaque exécution. Trop de travail.

une autre solution est d'utiliser la fonction freeze/thaw pour ne faire que mon intéressant thread run. Cependant, cela rend certaines informations indisponibles parce que tous les threads sont mis en pause.

Ce que j'utilise maintenant à faire fonctionner le programme jusqu'à ce que j'arrive à un point d'arrêt où je suis sûr d'être dans le bon fil. Puis je mets en pause tous les autres fils de threadpool et essaye de reprendre l'exécution. Si les programmes semblent coincés, Je m'arrête, et je dégèle le fil courant.

La solution idéale serait de trouver le bon fil, d'un drapeau, et puis de dire à Visual Studio: " casser que si le thread actuel est marqué ".

est-ce possible ?

25
demandé sur Community 2011-11-18 18:00:18

3 réponses

pendant le débogage, vous pouvez geler tous les threads dans la fenêtre Threads et ne reprendre que celui qui vous intéresse.

6
répondu Bode 2014-02-05 23:21:55

j'utiliserais les points de rupture conditionnels que vous avez mentionnés, mais au lieu de comparer à une chaîne fixe comparer à une variable semi-globale (peut-être une propriété statique sur votre classe principale?).

lorsque vous identifiez quel thread devient intéressant, vous pouvez utiliser la fenêtre immédiate pour définir le nom de la variable et permettre à vos points de rupture conditionnels d'être touchés.

2
répondu MBirchmeier 2011-11-18 20:10:53

un peu en retard mais cela est apparu comme la première réponse dans une recherche.

j'utilise ce qui suit dans VS 2015...

var thread = System.Threading.Thread.CurrentThread;
if (thread.Name == null)
            thread.Name = "Main";

puis au point de rupture...

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

Pour le rendre plus souple, vous pouvez intégrer le Fil dans une classe personnalisée.

FYI: vous ne pouvez pas utiliser des variables statiques dans un point de rupture conditionnel car elles ne sont pas dans le contexte. Jamais vraiment compris pourquoi la statique ne sont pas toujours en contexte.

1
répondu Paulustrious 2017-01-24 12:38:40