Partager via


Déboguer des applications multithread dans Visual Studio

Un thread est une séquence d’instructions auxquelles le système d’exploitation accorde du temps processeur. Chaque processus en cours d’exécution dans le système d’exploitation se compose d’au moins un thread. Les processus qui ont plusieurs threads sont appelés multithreads.

Les ordinateurs avec plusieurs processeurs, processeurs multicœurs ou processus d’hyperthreading peuvent exécuter plusieurs threads simultanés. Le traitement parallèle à l’aide de nombreux threads peut considérablement améliorer les performances du programme, mais cela peut également rendre le débogage plus difficile, car vous effectuez le suivi de nombreux threads.

Le traitement parallèle parfait n’est pas toujours possible. Les threads doivent parfois être synchronisés. Un thread peut avoir besoin d’attendre un résultat d’un autre thread, ou un thread peut avoir besoin d’un accès exclusif à une ressource utilisée par un autre thread. Les problèmes de synchronisation sont une cause courante de bogues dans les applications multithread. Parfois, les threads peuvent finir par attendre une ressource qui ne devient jamais disponible. Cela entraîne une condition appelée interblocage.

Threads et processus

Les threads et les processus sont des concepts connexes dans la science informatique. Les deux représentent des séquences d’instructions qui doivent s’exécuter dans un ordre spécifique. Les instructions dans des threads ou processus distincts peuvent toutefois s’exécuter en parallèle.

Les processus existent dans le système d’exploitation et correspondent à ce que les utilisateurs voient en tant que programmes ou applications. En revanche, un thread existe dans un processus. Pour cette raison, les threads sont parfois appelés processus légers. Chaque processus se compose d’un ou plusieurs threads.

L’existence de plusieurs processus permet à un ordinateur d’effectuer plusieurs tâches à la fois. L’existence de plusieurs threads permet à un processus de séparer le travail en parallèle. Sur un ordinateur avec plusieurs processeurs, processus ou threads peuvent s’exécuter sur différents processeurs. Cela active le traitement parallèle vrai.

Outils pour le débogage d’applications multithread

Visual Studio fournit différents outils à utiliser pour déboguer des applications multithreads.

  • Pour le débogage de threads sur le GPU, l’outil principal est la fenêtre Threads GPU . Découvrez comment : utiliser la fenêtre Threads GPU.

  • Pour les processus, les outils principaux sont la boîte de dialogue Attacher au processus , la fenêtre Processus et la barre d’outils Emplacement du débogage .

Visual Studio fournit également des points d’arrêt puissants et des points de trace, qui peuvent être utiles lorsque vous déboguez des applications multithread. Utilisez des conditions de point d’arrêt et des filtres pour placer des points d’arrêt sur des threads individuels. Les points de trace vous permettent de suivre l’exécution de votre programme sans rupture, afin d’étudier les problèmes tels que les interblocages. Pour plus d’informations, consultez actions de point d’arrêt et points de trace.

Le débogage d’une application multithread qui a une interface utilisateur peut être particulièrement difficile. Vous pouvez envisager d’exécuter l’application sur un deuxième ordinateur et d’utiliser le débogage à distance. Pour plus d’informations, consultez Débogage à distance.

Le tableau suivant présente les informations disponibles et les actions que vous pouvez effectuer à chacun de ces emplacements :

Interface utilisateur Informations disponibles Actions que vous pouvez effectuer
Boîte de dialogue Attacher au processus Processus disponibles auquel vous pouvez vous attacher :

- Nom du processus (.exe)
- Numéro d’ID de processus
- Titre de la barre de menus
- Type (managed v4.0 ; Managed v2.0, v1.1, v1.0 ; x86 ; x64 ; IA64)
- Nom d’utilisateur (nom de compte)
- Numéro de session
Sélectionnez un processus à attacher à

Sélectionner un ordinateur distant

Modifier le type de transport pour la connexion à des ordinateurs distants
Fenêtre Processus Processus attachés :

- Nom du processus
- Numéro d’ID de processus
- Chemin d’accès au processus .exe
- Titre de la barre de menus
- État (arrêt. En cours d’exécution)
- Débogage (natif, managé, et ainsi de suite.)
- Type de transport (par défaut, natif sans authentification)
- Qualificateur de transport (ordinateur distant)
Outils :

-Joindre
-Détacher
-Terminer

Menu contextuel :

-Joindre
-Détacher
- Détacher lors de l’arrêt du débogage
-Terminer
Barre d’outils Emplacement du débogage - Processus actuel
- Suspendre l’application
- Reprendre l’application
- Suspendre et arrêter l’application
- Thread actuel
- Activer/désactiver l’état de l’indicateur de thread actuel
- Afficher uniquement les threads avec indicateur
- Afficher uniquement le processus actuel
- Trame de pile actuelle
- Basculer vers un autre processus
- Suspendre, reprendre ou arrêter l’application
- Basculer vers un autre thread dans le processus actuel
- Basculer vers une autre trame de pile dans le thread actuel
- Marquer ou annuler le décalage des threads actuels
- Afficher uniquement les threads avec indicateur
- Afficher uniquement le processus actuel
Fenêtre Piles parallèles - Piles d’appels pour plusieurs threads dans une fenêtre.
- Trame de pile active pour chaque thread.
- Appelants et appelés pour n’importe quelle méthode.
- Détection d’interblocage
- Filtrer les threads spécifiés
- Filtrer les piles de code externe
- Basculer vers la vue Tâches
- Marquer ou annuler le décalage d’un thread
-Zoom
- Copier des images de pile
- Enregistrer/Exporter toutes les piles sous forme d’image
Fenêtre Espion parallèle - Colonne d’indicateur, dans laquelle vous pouvez marquer un thread auquel vous souhaitez accorder une attention particulière.
- Colonne d’images, dans laquelle une flèche indique le cadre sélectionné.
- Colonne configurable qui peut afficher l’ordinateur, le processus, la vignette, la tâche et le thread.
- Marquer ou annuler le décalage d’un thread
- Afficher uniquement les threads avec indicateur
- Changer de trames
- Trier une colonne
- Regrouper des threads
- Figer ou dégeler des threads
- exporter les données dans la fenêtre Espion parallèle
Fenêtre Threads Threads dans le processus actuel :

- ID de thread
- ID managé
- Catégorie (thread principal, thread d’interface, gestionnaire d’appels de procédure distante ou thread de travail)
- Nom du thread
- Emplacement où le thread est créé
-Priorité
- Mask d’affinité
- Nombre suspendu
- Nom du processus
- Indicateur
- Indicateur suspendu
Outils :

-Rechercher
- Pile des appels de recherche
- Marquer uniquement mon code
- Marquer une sélection de module personnalisé
- Regrouper par
-Colonnes
- Développer/Réduire les piles d’appels
- Développer/réduire les groupes
- Figer/dégeler des threads

Menu contextuel :

- Afficher les threads dans la source
- Basculer vers un thread
- Figer un thread en cours d’exécution
- Dégeler un thread figé
- Marquer un thread pour une étude supplémentaire
- Dissocier un thread
- Renommer un thread
- Afficher et masquer les threads

Autres actions :

- Afficher la pile des appels d’un thread dans une info-bulle de données
Fenêtre source Les indicateurs de thread dans la coupe gauche indiquent un ou plusieurs threads (désactivés par défaut, activés à l’aide du menu contextuel dans la fenêtre Threads ) Menu contextuel :

- Basculer vers un thread
- Marquer un thread pour une étude supplémentaire
- Dissocier un thread
Fenêtre Tâches - Affichez des informations sur Task les objets, notamment l’ID de tâche, l’état de la tâche (planifié, en cours d’exécution, en attente, bloqué) et le thread affecté à la tâche.
- Emplacement actuel dans la pile des appels.
- Délégué passé à la tâche au moment de la création
- Basculer vers la tâche actuelle
- Marquer ou annuler le décalage d’une tâche
- Figer ou dégeler une tâche
Fenêtre Threads GPU - Colonne d’indicateur, dans laquelle vous pouvez marquer un thread auquel vous souhaitez accorder une attention particulière.
- Colonne de thread actuelle, dans laquelle une flèche jaune indique le thread actuel.
- Colonne Nombre de threads, qui affiche le nombre de threads au même emplacement.
- Colonne Ligne , qui affiche la ligne de code où se trouve chaque groupe de threads.
- Colonne Adresse , qui affiche l’adresse d’instruction où se trouve chaque groupe de threads.
- Colonne Emplacement , qui est l’emplacement dans le code de l’adresse.
- Colonne État , qui indique si le thread est actif ou bloqué.
- Colonne Vignette , qui affiche l’index de vignette pour les threads de la ligne.
- Passer à un autre thread
- Afficher une vignette et un thread particuliers
- Afficher ou masquer une colonne
- Trier par une colonne
- Regrouper des threads
- Figer ou dégeler des threads
- Marquer ou annuler le décalage d’un thread
- Afficher uniquement les threads avec indicateur