Comment : diagnostiquer l’interface utilisateur des retards causés par des extensionsHow to: Diagnose UI delays caused by extensions

Lorsque l’interface utilisateur cesse de répondre, Visual Studio examine la pile des appels du thread d’interface utilisateur, en commençant par la feuille et progresse vers la base.When UI becomes unresponsive, Visual Studio examines the call-stack of the UI thread, starting with the leaf and working towards the base. Si Visual Studio détermine qu’un frame de pile des appels appartienne à un module qui fait partie d’une extension installée et activée, il affiche une notification.If Visual Studio determines that a call-stack frame belongs to a module that is part of an installed and enabled extension, it shows a notification.

Délai d’interface utilisateur (problème de blocage) Notification

La notification informe l’utilisateur que le délai de l’interface utilisateur (par exemple, le problème de blocage dans l’interface utilisateur) est peut-être le résultat du code à partir d’une extension.The notification informs the user that the UI delay (i.e. the unresponsiveness in the UI) might have been the result of code from an extension. Il fournit également l’utilisateur avec des options pour désactiver l’extension ou les futures notifications pour cette extension.It also provides the user with options to disable the extension or future notifications for that extension.

Ce document décrit comment vous pouvez diagnostiquer dans votre code d’extension de l’origine des notifications de délai de l’interface utilisateur.This document describes how you can diagnose what in your extension code is causing UI delay notifications.

Note

N’utilisez pas l’instance expérimentale de Visual Studio pour diagnostiquer les retards d’interface utilisateur.Do not use the Visual Studio experimental instance to diagnose UI delays. Certaines parties de l’analyse de la pile des appels requis pour les notifications de délai de l’interface utilisateur sont désactivées lors de l’utilisation de l’instance expérimentale, c'est-à-dire que les notifications de délai de l’interface utilisateur ne peuvent pas être affichées.Some parts of the call-stack analysis required for UI delay notifications are turned off when using the experimental instance, meaning that UI delay notifications may not be shown.

Une vue d’ensemble du processus de diagnostic est la suivante :An overview of the diagnostic process is as follows:

  1. Identifiez le scénario de déclencheur.Identify the trigger scenario.
  2. Redémarrez Visual Studio avec l’activité d’ouverture de session.Restart VS with activity logging on.
  3. Démarrer le suivi ETW.Start ETW tracing.
  4. Déclencher la notification s’affiche plus.Trigger the notification to appear again.
  5. Arrêter le suivi ETW.Stop ETW tracing.
  6. Examinez le journal d’activité pour obtenir l’ID de délai.Examine the activity log to get the delay ID.
  7. Analyser le suivi ETW à l’aide des ID de délai à l’étape 6.Analyze the ETW trace using delay ID from step 6.

Dans les sections suivantes, nous verrons ces étapes plus en détail.In the following sections, we will go through these steps in more detail.

Identifier le scénario de déclencheurIdentifying the trigger scenario

Pour diagnostiquer les un délai de l’interface utilisateur, vous devez tout d’abord identifier quelles (séquence d’actions) provoque Visual Studio pour afficher la notification.To do diagnose a UI delay, you first need to identify what (sequence of actions) causes Visual Studio to show the notification. Il s’agit afin de vous en mesure de déclencher la notification ultérieurement avec la journalisation activée.This is in order for you to able to trigger the notification later with logging turned on.

Le redémarrage de Visual Studio avec l’activité d’ouverture de sessionRestarting VS with activity logging on

Visual Studio peut générer un journal d’activité « » qui fournit des informations utiles lors du débogage d’un problème.Visual Studio can generate an "activity log" that provides information helpful when debugging an issue. Pour activer sur l’activité de journalisation dans Visual Studio, démarrez Visual Studio avec le /log option de ligne de commande.To turn on activity logging in Visual Studio, start Visual Studio with the /log command line option. Après le démarrage de Visual Studio, le journal d’activité est stocké dans l’emplacement suivant :After Visual Studio starts, the activity log is stored in the following location:

%APPDATA%\Microsoft\VisualStudio\<vs_instance_id>\ActivityLog.xml

Pour en savoir plus sur la façon dont vous pouvez trouver votre VS ID d’instance, consultez outils de détection et la gestion des instances de Visual Studio.To learn more about how you can find your VS instance ID, see Tools for detecting and managing Visual Studio instances. Plus tard, nous utiliserons ce journal d’activité pour obtenir plus d’informations sur les retards d’interface utilisateur et notifications relatives.We will use this activity log later to find out more information about UI delays and related notifications.

Démarrer le suivi ETWStarting ETW tracing

Vous pouvez utiliser PerfView pour collecter un suivi ETW.You can use PerfView to collect an ETW trace. PerfView fournit une interface facile à utiliser pour collecter un suivi ETW et pour les analyser.PerfView provides an easy-to-use interface both for collecting an ETW trace and for analyzing it. Utilisez la commande suivante pour recueillir une trace :Use the following command to collect a trace:

Perfview.exe collect C:\trace.etl /BufferSizeMB=1024 -CircularMB:2048 -Merge:true -Providers:*Microsoft-VisualStudio:@StacksEnabled=true -NoV2Rundown /kernelEvents=default+FileIOInit+ContextSwitch+Dispatcher

Ainsi, le fournisseur de « Microsoft-VisualStudio », qui est le fournisseur de que Visual Studio utilise pour les événements associés aux notifications de délai de l’interface utilisateur.This enables the "Microsoft-VisualStudio" provider, which is the provider Visual Studio uses for events related to UI delay notifications. Il spécifie également le mot clé pour le fournisseur de noyau PerfView peut utiliser pour générer la vue « Threads des piles de temps ».It also specifies the keyword for the kernel provider that PerfView can use to generate the "Thread Time Stacks" view.

Déclenche la notification s’affiche plusTriggering the notification to appear again

Une fois que PerfView a démarré la collection de la trace, vous pouvez utiliser la séquence d’actions de déclencheur (à l’étape 1) pour la notification s’affiche plus.Once PerfView has started trace collection, you can use the trigger action sequence (from step 1) for the notification to appear again. Une fois la notification est affichée, vous pouvez arrêter la collection de PerfView traiter et générer le fichier de sortie de trace.Once the notification is shown, you can stop trace collection for PerfView to process and generate the output trace file.

Arrêter le suivi ETWStopping ETW tracing

Pour arrêter la collecte de trace, utilisez simplement le Stop collection bouton dans la fenêtre PerfView.To stop trace collection, simply use the Stop collection button on the PerfView window. Après avoir arrêté la collection de la trace, PerfView traitera automatiquement les événements ETW et génère un fichier de sortie.After you stop trace collection, PerfView will automatically process the ETW events and generates an output trace file.

Examiner le journal d’activité pour obtenir l’ID de délaiExamining the activity log to get the delay ID

Comme mentionné précédemment, vous pouvez trouver le journal d’activité à %APPDATA%\Microsoft\VisualStudio\<vs_instance_id>\ActivityLog.xml.As mentioned earlier, you can find the activity log at %APPDATA%\Microsoft\VisualStudio\<vs_instance_id>\ActivityLog.xml. Chaque fois que Visual Studio détecte une extension du délai de l’interface utilisateur, il écrit un nœud dans le journal d’activité avec UIDelayNotifications comme source.Every time Visual Studio detects an extension UI delay, it writes a node to the activity log with UIDelayNotifications as the source. Ce nœud contient quatre éléments d’information sur le délai de l’interface utilisateur :This node contains four pieces of information about the UI delay:

  • L’ID de délai de l’interface utilisateur, un numéro séquentiel qui identifie de façon unique un délai de l’interface utilisateur dans une session Visual StudioThe UI delay ID, a sequential number that uniquely identifies a UI delay in a VS session
  • L’ID de session, qui identifie de façon unique votre session Visual Studio à partir du début à la fermetureThe session ID, which uniquely identifies your Visual Studio session from start to close
  • Indique si une notification a été indiquée pour le délai de l’interface utilisateurWhether or not a notification was shown for the UI delay
  • L’extension qui est probablement le délai de l’interface utilisateurThe extension that likely caused the UI delay
<entry>
  <record>271</record>
  <time>2018/02/03 12:02:52.867</time>
  <type>Information</type>
  <source>UIDelayNotifications</source>
  <description>A UI delay (Delay ID = 0) has been detected. (Session ID=16e49d4b-26c2-4247-ad1c-488edeb185e0; Blamed extension="UIDelayR2"; Notification shown? Yes.)</description>
</entry>

Note

Pas de tous les retards d’interface utilisateur génère une notification.Not all UI delays result in a notification. Par conséquent, vous devez toujours vérifier la « Notification indiquée ? »Therefore, you should always check the "Notification shown?" valeur à identifier correctement le délai de l’interface utilisateur de droite.value to correctly identify the right UI delay.

Après avoir trouvé le délai de l’interface utilisateur correct dans le journal d’activité, notez l’ID de délai de l’interface utilisateur spécifié dans le nœud.After you find the correct UI delay in the activity log, write down the UI delay ID specified in the node. L’ID vous permet de rechercher l’événement ETW correspondant à l’étape suivante.You'll use the ID to look for the corresponding ETW event in the next step.

Analyse le suivi ETWAnalyzing the ETW trace

Ensuite, ouvrez le fichier de trace.Next, open the trace file. Pour cela, soit à l’aide de la même instance de PerfView ou en démarre une nouvelle instance et en définissant le chemin d’accès du dossier en cours en haut à gauche de la fenêtre à l’emplacement du fichier de trace.You can do this either using the same instance of PerfView or by starting a new instance and setting the current folder path in the top-left of the window to the location of the trace file.

Définir le chemin d’accès du dossier dans Perfview

Ensuite, sélectionnez le fichier de trace dans le volet gauche et ouvrez-le en choisissant Ouvrir dans le menu contextuel ou le contexte.Then, select the trace file in the left pane and open it by choosing Open from the right-click or context menu.

Note

Par défaut, PerfView génère une archive Zip.By default PerfView outputs a Zip archive. Lorsque vous ouvrez trace.zip, elle automatiquement décompresse l’archive et ouvre la trace.When you open trace.zip, it automatically decompresses the archive and opens the trace. Vous pouvez ignorer cette en désactivant la case « Zip » pendant la collecte de la trace.You can skip this by unchecking the "Zip" box during trace collection. Toutefois, si vous souhaitez transférer et utiliser les traces sur différentes machines, nous déconseillons fortement décochez la case « Zip ».However, if you are planning to transfer and use traces across different machines, we strongly recommend against unchecking the "Zip" box. Sans cette option, les fichiers PDB requis pour les assemblys de Ngen seront accompagnent pas la trace et par conséquent, les symboles à partir des assemblys de Ngen ne seront pas résolus sur l’ordinateur de destination.Without this option, the required PDBs for Ngen assemblies will not accompany the trace and thus symbols from Ngen assemblies will not be resolved on the destination machine. (Consultez ce billet de blog pour plus d’informations sur les fichiers PDB pour les assemblys de Ngen.)(See this blog post for more information on PDBs for Ngen assemblies.)

Il peut prendre plusieurs minutes avant que PerfView traiter et ouvrir la trace.It can take several minutes for PerfView to process and open the trace. Une fois que la trace est ouverte, une liste de différents « vues » s’affichent dans cette section.Once the trace is open, a list of various "views" appear under it.

Affichage de résumé de trace PerfView

Nous allons tout d’abord utiliser l’affichage « Événements » pour obtenir la plage de temps du délai de l’interface utilisateur :We will first use the "Events" view to obtain the time-range of the UI delay:

  1. Ouvrez l’affichage « Événements » en sélectionnant le nœud « Événements » dans la trace, ouvrir dans le menu contextuel ou le contexte.Open the "Events" view by selecting "Events" node under the trace and choosing Open from the right-click or context menu.
  2. Sélectionnez «Microsoft-VisualStudio/ExtensionUIUnresponsiveness» dans le volet gauche.Select "Microsoft-VisualStudio/ExtensionUIUnresponsiveness" in the left pane.
  3. Appuyez sur entréePress Enter

La sélection est appliquée et toutes les ExtensionUIUnresponsiveness événements sont affichés dans le volet droit.The selection is applied and all ExtensionUIUnresponsiveness events are displayed in the right pane.

Sélection des événements dans l’affichage des événements

Chaque ligne dans le volet droit correspond à un délai de l’interface utilisateur.Each row in the right pane corresponds to a UI delay. L’événement contient une valeur de « Délai ID » qui doit correspondre à l’ID de retard dans le journal d’activité de l’étape 6.The event includes a "Delay ID" value which should match the delay ID in the activity log from the step 6. Étant donné que ExtensionUIUnresponsiveness est déclenché à la fin du délai de l’interface utilisateur, l’horodatage de l’événement (environ) marque l’heure de fin du délai de l’interface utilisateur.Since ExtensionUIUnresponsiveness is fired at the end of the UI delay, the timestamp of the event (roughly) marks the end time of the UI delay. L’événement contient également la durée du délai.The event also contains the duration of the delay. Nous pouvons soustraire la durée de l’horodatage de fin pour obtenir l’horodatage de lorsque le délai de l’interface utilisateur a démarré.We can subtract the duration from the end timestamp to obtain the timestamp of when the UI delay started.

Calcul de la plage horaire délai de l’interface utilisateur

Dans la capture d’écran précédente, par exemple, l’horodatage de l’événement est 12,125.679 et la durée du délai est 6,143.085 (ms).In the previous screenshot, for example, the timestamp of the event is 12,125.679 and the delay duration is 6,143.085 (ms). DoncThus,

  • Le délai de démarrage est 12,125.679-6,143.085 = 5,982.594.The delay start is 12,125.679 - 6,143.085 = 5,982.594.
  • La période de délai de l’interface utilisateur est 5,982.594 à 12,125.679.The UI delay time range is 5,982.594 to 12,125.679.

Une fois l’intervalle de temps, nous pouvons fermer l’affichage des événements et ouvrez la vue de « Piles de threads heure (avec les activités de StartStop) ».Once we have the time range, we can close out of the Events view and open the "Thread Time (with StartStop Activities) Stacks" view. Cette vue est particulièrement utile, car il est souvent les extensions qui bloquent le thread d’interface utilisateur sont en attente simplement sur les autres threads ou d’une opération d’e/S.This view is especially handy because often extensions that are blocking the UI thread are merely waiting on other threads or an I/O-bound operation. Par conséquent, la vue « Pile du processeur », qui est l’option incontournable pour la plupart des cas, ne peut pas capturer le temps du thread, car il n’utilise pas l’UC pendant cette période de blocage.Thus, the "CPU Stack" view, which is the go-to option for most cases, may not capture the time the thread spends blocking since it is not using the CPU during that time. Les piles de threads de temps « » résout ce problème en correctement montrant bloqué heure.The "Thread Time Stacks" solves this problem by properly showing blocked time.

Nœud de piles de temps (avec les activités de StartStop) de thread dans la vue Résumé de PerfView

Lors de l’ouverture de « Threads des piles de temps » afficher, sélectionnez le processus de « devenv » pour démarrer l’analyse.While opening "Thread Time Stacks" view, choose the "devenv" process to start analysis.

Affichage des piles de temps pour l’analyse de délai de l’interface utilisateur de thread

Dans la vue « Threads des piles de temps », en haut à gauche de la page, vous pouvez définir l’intervalle de temps pour les valeurs que nous avons calculé dans l’étape précédente et appuyez sur ENTRÉE pour les piles sont ajustées à cette plage de temps.In the "Thread Time Stacks" view, in the top-left of the page, you can set the time-range to the values we calculated in the previous step and press Enter so the stacks are adjusted to that time range.

Note

Déterminer le thread est l’interface utilisateur de thread de (démarrage) peut être non intuitive si la collection de la trace est démarrée une fois Visual Studio est déjà ouvert.Determining which thread is the UI (startup) thread can be counterintuitive if trace collection is started after Visual Studio is already open. Toutefois, les premiers éléments sur la pile du thread d’interface utilisateur (démarrage) sont plus probable toujours les DLL système d’exploitation (ntdll.dll et kernel32.dll) suivies de devenv ! ?However, the first elements on the stack of the UI (startup) thread are most-likely always operating system DLLs (ntdll.dll and kernel32.dll) followed by devenv!? et puis msenv ! ?.and then msenv!?. Cette séquence peut aider à identifier le thread d’interface utilisateur.This sequence can help identify the UI thread.

Qui identifie le thread de démarrage

Vous pouvez aussi filtrer cet affichage en incluant uniquement les piles qui contiennent des modules à partir de votre package.You can also further filter this view by only including stacks that contain modules from your package.

  • Texte vide à supprimer n’importe quel regroupement ajouté par défaut la valeur « GroupPats ».Set "GroupPats" to empty text to remove any grouping added by default.
  • Ensemble « IncPats » pour inclure la partie de votre nom de l’assembly en plus de filtre de processus existant.Set "IncPats" to include part of your assembly name in addition to existing process filter. Dans ce cas, il doit être « devenv ; UIDelayR2 ».In this case, it should be "devenv;UIDelayR2".

Paramètre GroupPath et IncPath dans la vue threads des piles de temps

PerfView détaille les instructions dans le menu d’aide que vous pouvez utiliser pour identifier les goulots d’étranglement de performances dans votre code.PerfView has detailed guidance under the Help menu that you can use to identify performance bottlenecks in your code. En outre, les liens suivants fournissent plus d’informations sur la façon d’utiliser Visual Studio threading API pour optimiser votre code :Additionally, the following links provide more information on how to utilize Visual Studio threading APIs to optimize your code:

Vous pouvez également utiliser les nouveaux analyseurs de statique Visual Studio pour les extensions (package NuGet ici), qui fournissent des conseils sur les meilleures pratiques pour l’écriture d’extensions efficace.You can also use the new Visual Studio static analyzers for extensions (NuGet package here), that provide guidance on best practices for writing efficient extensions. Afficher la liste des des analyseurs de kit de développement logiciel Visual Studio et threading analyseurs.See a list of VS SDK analyzers and threading analyzers.

Note

Si vous ne parvenez pas à résoudre le problème de blocage en raison de dépendances vous n’avez pas de contrôle sur (par exemple, si votre extension doit appeler des services VS synchrones sur le thread d’interface utilisateur), nous aimerions en être informés.If you are unable to address the unresponsiveness due to dependencies you do not have control over (e.g. if your extension has to call synchronous VS services on the UI thread), we would like to know about it. Si vous êtes un membre de notre programme partenaire Visual Studio, vous pouvez contacter nous en envoyant une demande de prise en charge du développeur.If you are a member of our Visual Studio Partner program, you can contact us by submitting a developer support request. Sinon, utilisez l’outil « Signaler un problème » pour envoyer vos commentaires et inclure "Extension UI Delay Notifications" dans le titre.Otherwise, use the 'Report a Problem' tool to submit your feedback and include "Extension UI Delay Notifications" in the title. Veuillez également inclure une description détaillée de votre analyse.Please also include a detailed description of your analysis.