Comment déboguer un seul thread dans Visual Studio?
J'ai une solution à certains projets. Il y a plusieurs break-points dans les différents projets. Je veux tracer le premier thread frappé l'un de ces break-points et continuer le suivi ce thread unique malgré des autres threads d'entrer le même code-blocks.
Je sais que c'est possible grâce à la définition d'une condition sur le point de rupture, c'est le nom du thread = ... ou l'Id de thread = ... mais mon cas est un lourd chargé ASP.NET demande et dès que j'attache à w3wp.exe
nombre de threads que de frapper la pause-points. J'ai besoin de quelque chose comme un ThreadLocal<break-point>
.
Est-il possible? Si oui, comment?
- Pourquoi essayez-vous de débogage sur un serveur très chargé?
- Cette application web fonctionne comme le cœur d'une grande batterie de serveurs web et le buggy situation est impossible à simuler des scénarios de test.
Vous devez vous connecter pour publier un commentaire.
De gel/Dégel de threads est une mauvaise façon, parce que les autres threads ne pas exécuter n'importe quel code.
Le plus correct et utilisable est de:
Dans Visual Studio 2015 et plus récents, le processus est le même:
Donc tous les fils sont exécutés, mais le débogueur de visites sur le thread en cours seulement.
System.Threading.Thread.CurrentThread.ManagedThreadId
ou quelque chose?Voici ce que j'ai fait:
Définir un saut conditionnel point que je
savait seulement frapper sur le fil
que je cherchais.
Une fois que le point d'arrêt est atteint et que vous êtes dans le fil que vous voulez, dans Visual Studio fenêtre Threads (pendant le débogage, Debug -> Windows -> Fils), Ctrl + Un (pour sélectionner tous les threads), puis Ctrl + clic sur le fil que vous êtes actuellement sur. Vous devriez avoir tous les threads à l'exception de celui que vous souhaitez déboguer sélectionné.
Maintenant, Visual Studio n'intervient que par le biais de la décongelés fil. Il semble être beaucoup plus lent lorsque vous faites cela, sans doute, car il a une boucle par tous les congelés filets, mais il a apporté un peu de raison à mon multi-thread de débogage.
Je viens de sortir un Visual Studio 2010+ extension qui fait exactement ce que vous cherchez.
Et c'est gratuit :).
Vérifier ici sur la Galerie, sur la page officielle ou la Github.
Si plusieurs threads sont en train d'être engendré comme pour une application web, @MattFaus réponse ne fonctionnera pas. ce que j'ai fait au lieu de cela est la suivante
Un légèrement approche différente que j'ai utilisé:
Cela suppose que vous avez le temps de faire ci-dessus avant un deuxième thread hits votre point d'arrêt. Si non, et les autres threads frapper votre point d'arrêt avant que vous avez fait ci-dessus, vous pouvez cliquer droit dans les filets de la fenêtre et choisissez gel.
lock(m_someObject) { ; }
Je suggère l'ajout d'une autre instance de l'application sur le serveur live, que ce soit sur le même matériel ou une nouvelle machine (cluster) et puis debug uniquement cette instance. Je ne voudrais pas ajouter un point d'arrêt dans le code, les utilisateurs sont de déclenchement. Si ce n'est pas une option, j'aimerais ajouter plus de suivi.
Toutefois, si cela est absolument nécessaire et vous avez besoin d'une solution de stat, je suis sûr que vous pourriez ajouter un point d'arrêt qui casse uniquement si la demande est à venir à partir de votre adresse IP. Vous devez faire cela en ajoutant un point d'arrêt conditionnel qui inspecte
HttpContext.Request.UserHostAddress
. Notez cependant que cela ralentit votre application considérablement.Si vous ne voulez pas vous arrêter tous les autres threads (peut-être que vous allez fixer debugger de Visual Studio pour une application en cours d'exécution qui doit répondre à des demandes de), vous pouvez utiliser une macro pour créer et supprimer des points d'arrêt automatiquement.
Ce qui est suggéré dans une réponse à Débordement de Pile question "Step over" lorsque le débogage multithread programmes en Visual Studio.
Cependant, le lien seulement d'expliquer comment déboguer ligne par ligne. Je vous suggère de modifier la macro (si vous êtes à l'aise avec elle) pour faire modifier tous les points d'arrêt (dans une plage donnée de la ligne par exemple) pour s'arrêter sur le thread courant.
Je pense que c'est un peu différent dans Visual Studio 2015. Ils ont changé quelques choses dans les points d'arrêt, mais voici comment appliquer la accepté de répondre à de hzdbyte (ci-dessus):
Sur le point d'arrêt dans le codage de la marge, Cliquez-Droit > Conditions > Changement de 'Conditionnel' Expression de "Filtrer". Cela permet ensuite de filtrer par ThreadId.
Alternativement sur le point d'arrêt dans la fenêtre des points d'arrêt, Cliquez-Droit > Paramètres > cocher la case des Conditions et de faire la ci-dessus.