> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Analyser les blocages et les changements de contexte dans les Timing Captures

> Analyser les blocages et les changements de contexte dans les Timing Captures

Cette rubrique décrit comment utiliser PIX pour analyser les blocages et les changements de contexte. Un changement de contexte se produit lorsqu'un cœur de processeur cesse d'exécuter le code d'un thread pour exécuter celui d'un autre thread ou passer à l'état inactif. Lorsque le système d'exploitation change le thread qui s'exécute sur un processeur, il doit enregistrer et restaurer l'état du thread sortant et celui du thread entrant. Cet état, ou contexte, inclut des données comme les valeurs actuelles de tous les registres et le compteur de programme. L'enregistrement et la restauration de cet état sont coûteux en termes de performances; réduire le nombre total de changements de contexte est donc souvent essentiel pour obtenir des temps d'image prévisibles et constants.

Pour une démonstration vidéo, consultez [Thread Dependency for PIX](https://www.youtube.com/embed/QzOsAic-GD4).

Les changements de contexte peuvent se produire pour diverses raisons, par exemple lorsqu'un thread attend un objet de synchronisation ou lorsque le planificateur du système d'exploitation détermine que le quantum d'un thread a expiré (et qu'un autre thread est prêt à s'exécuter sur ce cœur).

Les Timing Captures de PIX disposent de plusieurs fonctionnalités qui vous aident à déterminer quand se produisent les changements de contexte et à analyser la cause de chacun d'eux.

## Collecter des données sur les changements de contexte

Pour analyser les changements de contexte, vous devez collecter les piles d'appels de chaque changement de contexte. Pour cela, assurez-vous que la case **Callstacks on context switches** est cochée (figure 1) avant de démarrer une capture. Cette case est cochée par défaut.

**Figure 1.   Volet Options de Start Timing Capture.**

<img src="https://mintcdn.com/microsoft-4404708b/6TXzXmujKayly5Sf/images/gdk/tools/pix_newtiming_capture_cswitch_callstacks_option.png?fit=max&auto=format&n=6TXzXmujKayly5Sf&q=85&s=16edd0f090a155357156375832aeefbd" alt="Capture d'écran montrant l'emplacement de la case Callstacks on context switches dans le volet Options de Start Timing Capture" width="420" height="320" data-path="images/gdk/tools/pix_newtiming_capture_cswitch_callstacks_option.png" />

Lorsque Callstacks on context switches est sélectionné, vous pouvez aussi choisir de collecter les piles d'appels du thread qui rend prêt (ready thread). Si vous connaissez bien les interactions entre vos threads, vous pourrez peut-être effectuer votre analyse sans les piles d'appels du thread qui rend prêt. Dans ce cas, vous pouvez réduire la surcharge d'exécution d'une Timing Capture en ne collectant pas ces piles d'appels.

## Trouver les blocages et les changements de contexte

Par défaut, les changements de contexte sont affichés sous forme de petites lignes verticales rouges dans les lignes Thread et Core de la chronologie. Les périodes pendant lesquelles un thread ne s'exécute pas, appelées *temps de thread non planifié* ou *blocages*, sont dessinées par défaut avec un motif hachuré. Chaque blocage est encadré par un changement de contexte sortant au début et un changement de contexte entrant à la fin. La visualisation par défaut des changements de contexte et des blocages est illustrée à la figure 2.

**Figure 2.   Visualisation par défaut des changements de contexte et des blocages.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_core_lane_cswitch.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=1b9e70cfcce6ccfe8cb90717d1892d72" alt="Capture d'écran annotée montrant la visualisation par défaut des changements de contexte et des blocages" width="712" height="364" data-path="images/gdk/tools/pix_new_timing_capture_core_lane_cswitch.png" />

Si vous examinez une Timing Capture spécifiquement pour trouver et analyser des changements de contexte, vous pouvez modifier la visualisation par défaut pour les rendre plus visibles. Utilisez l'option **Bold Context Switches** du volet de configuration des lignes pour étendre les lignes verticales rouges qui identifient un changement de contexte sur toute la hauteur de la ligne Thread ou Core (figure 3).

**Figure 3.   Emplacement et effet de l'option Bold Context Switches.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_bold_cswitch.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=e3f53d4edf3168797953a63b86c1b30c" alt="Capture d'écran montrant l'emplacement et l'effet de l'option Bold Context Switches" width="881" height="306" data-path="images/gdk/tools/pix_new_timing_capture_bold_cswitch.png" />

Pour identifier rapidement les blocages et les changements de contexte qui se produisent pendant l'exécution d'un événement PIX, sélectionnez l'événement dans la vue **Timeline** ou **Range Details**. Les informations de la vue **Element Details** incluent la liste de tous les blocages dans l'ordre où ils se sont produits. Par exemple, la figure 4 montre une instance d'un événement nommé `UpdatePlayerArmor` qui a subi huit blocages.

**Figure 4.   Affichage des blocages d'un événement sélectionné.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_event_element_details.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=37784ac5d22998272a36623c7eb25b46" alt="Capture d'écran montrant un événement sélectionné dans la vue Timeline et une liste de blocages dans le volet Element Details" width="611" height="579" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_event_element_details.png" />

Les changements de contexte apparaissent aussi dans la vue **Range Details**. Pour afficher la liste de tous les changements de contexte d'une période, ouvrez le menu déroulant **Items to show**, puis sélectionnez **Context switches**. Pour exclure certains cœurs de la liste des changements de contexte, utilisez le panneau **Selector** situé à gauche de la vue (figure 5).

**Figure 5.   Changements de contexte dans la vue Range Details.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_range_details.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=a6fae26cce744b5e08c88250751cd7f3" alt="Capture d'écran montrant les détails des changements de contexte dans la vue Range Details" width="767" height="768" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_range_details.png" />

## Analyser les blocages et les changements de contexte

La sélection d'un changement de contexte dans la vue Timeline ou Range Details renseigne la vue Element Details avec des informations sur ce changement de contexte. Element Details indique le cœur sur lequel le changement s'est produit, l'heure à laquelle il s'est produit, ainsi que les piles d'appels du thread qui s'exécutait avant le changement et du thread (le cas échéant) qui s'exécutait après. Les données d'affinité et de priorité de chaque thread sont aussi affichées. La figure 6 montre qu'un appel du thread `AppMain` d'un titre à l'API Win32 `ReadFile` a provoqué un changement de contexte. Après l'appel, `AppMain` est passé de l'état en cours d'exécution à l'état Idle.

**Figure 6.   Détails d'un changement de contexte.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_element_details.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=eab4c002dd9ee63a5087ca32e7c2dfaf" alt="Capture d'écran montrant les détails d'un changement de contexte" width="795" height="549" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_element_details.png" />

Si un thread commence à s'exécuter en raison d'une action effectuée sur un autre thread, les informations du thread qui l'a rendu prêt sont affichées à la fois dans les vues Timeline et Element Details. Le changement de contexte de la figure 7 montre que le cœur 0 passe de l'état Idle à l'exécution du thread `AppMain`, et que `AppMain` a été rendu prêt par un thread nommé `Worker`. La vue Element Details inclut la pile d'appels du thread qui a rendu prêt, l'heure à laquelle il l'a fait et la raison. Dans la chronologie, une flèche relie le thread qui a rendu prêt (`Worker`) au thread maintenant en cours d'exécution (`AppMain`).

**Figure 7.   Détails d'un thread qui rend prêt.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_readythread.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=dec4abeba0dfbfa8d6c84577537e0425" alt="Capture d'écran montrant des informations sur le thread qui rend prêt pour un changement de contexte" width="664" height="719" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_readythread.png" />

Si un changement de contexte implique un processus autre que le titre, PIX affiche le nom et l'ID du processus dans Element Details. La figure 8, issue d'une capture de PIX sur Windows, montre que le cœur 0 est passé de l'exécution du processus *devenv.exe*, qui n'appartient pas au titre, à l'exécution d'un thread du titre nommé `AP1`. Dans ce cas, la raison de l'attente indique que ce changement s'est produit en raison du planificateur de threads du système d'exploitation.

**Figure 8.   Détails d'un changement de contexte sortant d'un processus autre que le titre.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_otherproc.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=24e4bae8878d99918d8f57dfba6091d6" alt="Capture d'écran montrant un changement de contexte impliquant un autre processus" width="757" height="592" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_otherproc.png" />

Vous n'êtes pas limité à la sélection de changements de contexte individuels. Vous pouvez sélectionner un blocage entier pour accéder rapidement aux trois piles d'appels associées : la pile d'appels du changement sortant, celle du changement entrant et celle du thread qui a rendu prêt, le cas échéant. Ces piles d'appels sont affichées dans Element Details avec d'autres informations sur le blocage, notamment sa durée (figure 9).

**Figure 9.   Détails d'un blocage sélectionné.**

<img src="https://mintcdn.com/microsoft-4404708b/ynPBhpDOnKuaKPrv/images/gdk/tools/pix_new_timing_capture_cswitch_stallselect.png?fit=max&auto=format&n=ynPBhpDOnKuaKPrv&q=85&s=5866e567496ede4dd5b79be3c0a98285" alt="Capture d'écran montrant des informations sur un blocage de thread sélectionné" width="612" height="848" data-path="images/gdk/tools/pix_new_timing_capture_cswitch_stallselect.png" />

## Voir aussi

[Timing Captures](/fr-CA/tools/tools-console/pix/new-timing-captures) [PIX](/fr-CA/tools/tools-console/pix/pix)


## Related topics

- [PIX sur XBOX et Windows pour les titres GDK](/fr-CA/tools/tools-console/pix/index.md)
- [Répertoire des rubriques NDA : liens actifs vers Microsoft Learn](/fr-CA/nda/nda-topic-directory.md)
- [Cas de test les plus souvent en échec](/fr-CA/publishing/certification/xr-top-failing.md)
- [Capture du trafic réseau sur les trousses de développement XBOX One](/fr-CA/build/console-features/networking/tools/netcap-networking.md)
- [Captures PIX GPU Trace sur les consoles XBOX Series](/fr-CA/tools/tools-console/pix/gpu-trace/index.md)
