Partage via


Afficher les threads dans le débogueur Visual Studio (C#, Visual Basic, C++)

La fenêtre Threads dans le débogueur Visual Studio vous permet d’examiner et d’utiliser des threads dans l’application que vous déboguez. La fenêtre fournit des fonctionnalités pour regrouper, trier, marquer, figer, dégeler et rechercher des threads dans votre code et afficher des piles d’appels.

La fenêtre Threads n’est disponible que lorsque le débogueur Visual Studio est en cours d’exécution. Pendant une session de débogage, vous pouvez ouvrir la fenêtre en sélectionnant Déboguer>Windows>Threads.

Cet article explique comment utiliser la fenêtre Threads pour vos programmes C#, Visual Basic ou C++. Si vous recherchez des instructions pas à pas sur l’utilisation de la fenêtre Threads, consultez Guide détaillé : Déboguer à l’aide de la fenêtre Threads.

Explorer la table de fenêtre Threads

La fenêtre Threads présente une table dans laquelle chaque ligne correspond à un thread distinct dans votre application. Dans la vue par défaut, le tableau affiche tous les threads de votre application. Vous pouvez configurer les paramètres de table pour afficher uniquement les threads qui vous intéressent. La table fournit plusieurs colonnes pour décrire les threads en détail. Vous pouvez ajuster l’emplacement des colonnes et masquer les colonnes inutiles.

Le tableau suivant décrit toutes les colonnes disponibles pour la table de fenêtres threads et indique si la colonne est visible ou masquée dans la vue par défaut. Les colonnes sont répertoriées en fonction de leur position de table par défaut de gauche à droite.

Colonne Par défaut Description
Marquer Visible, sans étiquette Les indicateurs rouges de cette colonne indiquent les threads marqués pour une attention particulière. Sélectionnez le drapeau (la couleur de l'icône change en rouge) pour marquer ou désélectionner (l'icône revient à son contour) un fil de discussion. L’icône d’indicateur coloré permet de distinguer un thread marqué d’autres threads du tableau. Pour plus d’informations, consultez Ajouter et supprimer les indicateurs des threads.
Thread en cours Visible, sans étiquette L’icône de flèche jaune de cette colonne indique le thread actuel dans l’application en cours d’exécution dans le débogueur. Un icône de contour de flèche dans cette colomne indique le contexte actuel du débogueur pour un thread non actif.
ID Visible Fournit le numéro d’identification de chaque thread.
ID managé Visible Affiche les numéros d’identification gérés pour les threads gérés.
Catégorie Visible Indique la catégorie de threads en tant que threads d’interface utilisateur, gestionnaires d’appels de procédure distante ou threads de travail. Une catégorie spéciale identifie le thread principal de l’application.
Name Visible Identifie chaque thread par son nom ou <Aucun nom> si le thread n’a pas de nom spécifié. Lorsqu’un thread n’existe plus, le thread a l’étiquette [Thread Destroyed].
Emplacement Visible Indique où le thread est en cours d’exécution dans la pile des appels d’application. Sélectionnez la flèche déroulante pour afficher la pile d’appels complète du thread. Lorsqu’un thread n’existe plus, l’emplacement est étiqueté comme <non disponible>.
Priorité Hidden Affiche la priorité ou l'ordre de priorité attribué par le système à chaque thread.
Masque d'affinité Hidden Affiche le masque d’affinité du processeur pour chaque thread. Dans un système multiprocesseur, le masque d’affinité détermine les processeurs sur lesquels un thread peut s’exécuter.
Compteur suspendu Hidden Fournit le compteur suspendu. Ce nombre détermine si un thread peut s’exécuter. Pour plus d’informations, consultez Geler et dégeler des threads.
nom du processus Hidden Affiche le processus auquel appartient chaque thread. Les données de cette colonne peuvent être utiles lorsque vous déboguez de nombreux processus.
ID du processus Hidden Affiche l’ID de processus auquel appartient chaque thread.
Qualificateur de transport Hidden Identifie de manière unique la machine à laquelle le débogueur est connecté.

Afficher et masquer les colonnes de tableau

Dans la barre d’outils Threads, la liste déroulante Colonnes affiche les colonnes disponibles. Développez la liste déroulante et sélectionnez un nom de colonne pour activer sa visibilité dans la table. Les colonnes visibles sont indiquées avec une marque de coche dans la liste.

Marquer des threads pour une attention particulière

Utilisez l’icône d’indicateur pour marquer les threads pour une attention particulière. Les threads marqués sont indiqués par une icône d’indicateur rouge dans la table de fenêtres Threads. Pour plus d’informations, consultez Ajouter et Supprimer les indicateurs des threads.

Afficher uniquement les threads avec indicateur

Vous pouvez filtrer la fenêtre Threads pour afficher uniquement les threads avec indicateur. Dans la barre d’outils de la fenêtre Threads, sélectionnez Afficher uniquement les fils marqués (icône à double drapeau). Vous pouvez également utiliser le raccourci clavier Ctrl + 9. Cette action est disponible uniquement lorsqu’il existe des threads avec indicateur.

Geler et libérer les threads

Lorsque vous figez un thread, le système ne démarre pas l’exécution du thread, même si les ressources sont disponibles.

Dans le code natif, vous pouvez suspendre ou reprendre des threads en appelant les fonctions Windows SuspendThread et ResumeThread. Vous pouvez également utiliser les fonctions MFC CWinThread::SuspendThread et CWinThread::ResumeThread. Si vous appelez la fonction SuspendThread ou ResumeThread, le nombre suspendu affiché dans la fenêtre Threads change. Le nombre suspendu ne change pas si vous figez ou dégelez un thread natif. Un thread ne peut pas s’exécuter dans du code natif, sauf si le thread est dégelé et a un nombre suspendu de zéro.

Dans le code managé, le nombre suspendu change lorsque vous figez ou dégelez un thread. Si vous figez un thread dans du code managé, son nombre suspendu est de 1. Lorsque vous figez un thread dans le code natif, son nombre suspendu est égal à 0, sauf si vous utilisez l’appel SuspendThread.

Remarque

Lorsque vous déboguez un appel de code natif vers du code managé, le code managé s’exécute dans le même thread physique que le code natif appelant. La suspension ou le gel du thread natif fige également le code managé.

Modifier l’exécution des threads sélectionnés

Vous pouvez suspendre ou dégeler l’exécution d’un ou plusieurs threads. Dans la fenêtre Threads, sélectionnez les threads pour lesquels vous souhaitez mettre à jour l’état d’exécution. Dans la barre d’outils Threads, sélectionnez Geler les threads (icône de pause) ou Libérer les threads (icône de lecture en vert). L’action s’applique uniquement aux threads actuellement sélectionnés. Les actions de gel et de dégel sont également disponibles dans le menu contextuel de chaque fil.

Modifier le thread actuel

Une icône de flèche jaune dans la table Threads indique le thread actuel (et l’emplacement du pointeur d’exécution). Le marqueur de fil actuel original reste visible lui aussi, illustré par une icône de contour en forme de flèche.

Une icône de flèche jaune dans la table Threads indique le thread actuel (et l’emplacement du pointeur d’exécution). Une icone flèche verte avec une queue bouclée indique qu’un thread non actif a le contexte actuel du débogueur.

Basculer vers un autre thread

Il existe deux façons de changer le thread actuel dans le débogueur. Double-cliquez sur n’importe quel thread dans la table de fenêtres Threads pour le rendre actuel. Vous pouvez également cliquer avec le bouton droit sur un thread et sélectionner Basculer vers le thread.

Appliquer le regroupement et le tri aux threads

Vous pouvez regrouper des threads dans la table de fenêtres Threads en utilisant les mêmes critères que les colonnes disponibles. Tous les critères sont toujours disponibles pour le regroupement, que la colonne correspondante soit visible ou non dans l’affichage actuel. Vous ne pouvez sélectionner qu’un seul regroupement pour le tableau.

Lorsque vous regroupez des threads, un titre apparaît dans le tableau de chaque groupe. Le titre inclut une description de groupe ainsi que le nombre de membres du groupe. Si vous regroupez par Nom, vous pouvez voir des regroupements avec des titres tels que Thread de travail ou Threads non marqués. Une icône de flèche de développement/réduction apparaît à côté de chaque titre de groupe.

Une fois que vous avez appliqué un critère de regroupement, l'affichage de la table de la fenêtre des threads est mis à jour pour afficher les threads membres de chaque groupe sous l'en-tête correspondant. Utilisez la flèche pour développer ou réduire un groupe afin d'afficher ou de masquer les membres dans l'affichage actuel.

Vous pouvez également appliquer un critère de tri unique aux threads dans la table de fenêtres Threads. Le regroupement est prioritaire sur le tri. Par exemple, vous pouvez regrouper des threads par Catégorie, puis les trier par ID dans chaque Catégorie.

Regrouper des threads dans la table

Dans la barre d’outils de la fenêtre Threads, développez la liste déroulante Grouper par, puis sélectionnez les critères de regroupement des fils. Vous pouvez également supprimer le regroupement appliqué en sélectionnant Aucun dans la liste déroulante Regrouper par.

Trier les threads dans la table

Vous appliquez le tri aux threads dans le tableau de la fenêtre Threads en sélectionnant les en-têtes de colonne en haut de la table, tels que Nom ou ID.

Lorsque vous sélectionnez un en-tête de colonne, l’affichage de la table de fenêtres threads est mis à jour pour afficher les threads triés par les valeurs de la colonne sélectionnée. La colonne sélectionnée affiche également une icône de flèche haut/bas. L’icône flèche vers le haut indique le tri par la colonne sélectionnée dans l’ordre croissant. L’icône de flèche vers le bas indique le tri par la colonne sélectionnée dans l’ordre décroissant. Sélectionnez l’en-tête de colonne pour modifier l’ordre de tri.

Trier des threads au sein de groupes

Pour trier les threads au sein des groupes dans la fenêtre Threads, utilisez d'abord la liste déroulante Group by pour appliquer les critères de regroupement. Sélectionnez ensuite l’en-tête de colonne pour trier les threads groupés en fonction des valeurs de la colonne sélectionnée.

Développer ou réduire tous les groupes

Il existe un moyen rapide d’afficher ou de masquer tous les regroupements dans la vue actuelle. Dans la barre d’outils de la fenêtre Threads, sélectionnez Développer les groupes (icône de double boîte avec un symbole plus) ou Réduire les groupes (icône de double boîte avec un symbole moins).

Rechercher des threads

Vous pouvez rechercher des threads dans la table de fenêtres Threads et rechercher du contenu spécifique dans l’une des colonnes de la table visible. Lorsque vous effectuez la recherche, Visual Studio affiche les lignes de thread qui ont des données de colonne qui correspondent à la chaîne de recherche. La recherche analyse également l’emplacement du thread qui apparaît en haut de la pile des appels dans la colonne Emplacement.

Rechercher du contenu spécifique dans les threads

Il existe plusieurs façons de rechercher des contenus spécifiques dans les discussions. Dans la barre d’outils de la fenêtre des Threads, entrez la chaîne à rechercher dans la zone de Recherche, puis sélectionnez Entrée. Vous pouvez spécifier des lettres, des chiffres et des caractères spéciaux comme < dans votre chaîne de recherche. Une fois la recherche terminée, la fenêtre Threads met à jour la table pour afficher les threads avec des résultats correspondants. Visual Studio met en évidence les instances spécifiques qui correspondent à votre chaîne de recherche. Pour revenir à l’affichage de fil normal, sélectionnez l’icône X à côté de la zone de recherche .

Vous pouvez également rechercher une chaîne que vous avez précédemment consultée. Utilisez la zone de liste déroulante Rechercher et sélectionnez une chaîne de recherche précédente.

Rechercher dans la pile d’appels complète

Par défaut, la pile d’appels complète n’est pas recherchée. Visual Studio recherche une correspondance uniquement dans les threads visibles dans la table de fenêtres Threads.

Vous pouvez inclure la pile d'appels complète en sélectionnant Inclure les piles d'appels dans la recherche (icône d'élément de liste) dans la barre d'outils de la fenêtre Threads. Lorsque l’option est activée, l’icône d’élément de liste a une bordure.

Afficher les piles des appels et basculer entre les frames

Dans un programme multithread, chaque thread possède sa propre pile des appels. La fenêtre Threads permet d’afficher facilement ces piles.

Conseil

Pour obtenir une représentation visuelle de la pile des appels pour chaque thread, utilisez la fenêtre Piles parallèles.

Afficher la pile des appels pour le thread

Dans la fenêtre Threads, recherchez le thread pour lequel vous souhaitez examiner la pile des appels complète. Dans la colonne Emplacement, sélectionnez la flèche développer/réduire à gauche de l’emplacement du thread. L'emplacement se développe pour indiquer la pile des appels complète du thread. Sélectionnez à nouveau la flèche pour afficher uniquement l’emplacement.

Afficher ou réduire toutes les piles d’appels

Vous pouvez contrôler si la fenêtre Threads affiche toujours les piles d’appels complètes pour tous les threads de la table. Dans la barre d’outils de la fenêtre Threads, sélectionnez Développer les piles d’appels (icône de boîte avec un symbole plus) ou Réduire les piles d’appels (icône de boîte avec un symbole moins).