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

Lors de l’interface utilisateur cesse de répondre, Visual Studio examine la pile des appels du thread d’interface utilisateur, en commençant par le nœud terminal et en progressant 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 appartient à un module qui fait partie d’une extension installée et activée, une notification s’affiche.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 (absence de réponse) Notification

La notification informe l’utilisateur que le délai de l’interface utilisateur (autrement dit, l’absence de réponse 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 (that is, 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 cause 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 de l’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, ce qui signifie 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 comme suit :An overview of the diagnostic process is as follows:

  1. Identifier le scénario de déclencheur.Identify the trigger scenario.
  2. Redémarrez Visual Studio avec l’activité de connexion.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 retard à l’étape 6.Analyze the ETW trace using delay ID from step 6.

Dans les sections suivantes, nous allons examiner 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éclencheurIdentify the trigger scenario

Pour de diagnostiquer un délai de l’interface utilisateur, vous devez d’abord identifier quelles (séquence d’actions) entraîne de Visual Studio 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 pour puisse vous en mesure de déclencher la notification plus tard avec la journalisation activée.This is in order for you to able to trigger the notification later with logging turned on.

Redémarrez Visual Studio avec l’activité de journalisationRestart 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 allumer 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 des informations supplémentaires sur les retards de l’interface utilisateur et les notifications associées.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 les analyser.PerfView provides an easy-to-use interface both for collecting an ETW trace and for analyzing it. Utilisez la commande suivante pour collecter 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 « Microsoft VisualStudio », qui est le fournisseur de que Visual Studio utilise pour les événements lié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 le threads des piles de temps vue.It also specifies the keyword for the kernel provider that PerfView can use to generate the Thread Time Stacks view.

Déclencher la notification de nouveau l’affichageTrigger the notification to appear again

Une fois que PerfView a démarré la collecte des traces, 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 collecte de trace pour PerfView traiter et générer le fichier de sortie.Once the notification is shown, you can stop trace collection for PerfView to process and generate the output trace file.

Arrêter le suivi ETWStop ETW tracing

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

Examinez le journal d’activité pour obtenir l’ID de délaiExamine 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 d’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 de 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 de Visual Studio à partir du début à la fermerThe session ID, which uniquely identifies your Visual Studio session from start to close
  • Ou non 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 tous les retards de l’interface utilisateur entraînent une notification.Not all UI delays result in a notification. Par conséquent, vous devez toujours vérifier le Notification indiquée ? valeur afin d’identifier correctement le délai de l’interface utilisateur de droite.Therefore, you should always check the Notification shown? 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. Vous allez utiliser l’ID pour 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.

Analyser le suivi ETWAnalyze 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 du dossier actuel dans l’angle supérieur 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

Sélectionnez le fichier de trace dans le volet gauche, puis ouvrez-le en choisissant ouvrir dans le menu contextuel.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, il décompresse l’archive automatiquement et que vous la trace est ouvert.When you open trace.zip, it automatically decompresses the archive and opens the trace. Vous pouvez ignorer cette étape en décochant la Zip boîte pendant la collecte de trace.You can skip this by unchecking the Zip box during trace collection. Toutefois, si vous envisagez de transférer et utiliser les traces sur différentes machines, nous recommandons vivement d’en décochant la Zip boîte.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 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 pour 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 « vues » différentes s’affichent sous ce dernier.Once the trace is open, a list of various "views" appear under it.

Vue Résumé de trace PerfView

Nous allons tout d’abord utiliser le événements afin d’obtenir l’intervalle 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 le événements vue en sélectionnant Events nœud sous la trace et en choisissant Open dans le menu contextuel.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 inclut une valeur de « Délai ID » qui doit correspondre à l’ID de retard dans le journal d’activité à partir 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 (à peu près) 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 entre l’horodatage de fin pour obtenir l’horodatage de lorsque le délai de l’interface utilisateur est démarré.We can subtract the duration from the end timestamp to obtain the timestamp of when the UI delay started.

Calcul de l’interface utilisateur délai-intervalle de temps

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.
  • L’intervalle de temps de retard 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 le événements afficher et ouvrir le piles de threads de temps (avec les activités de StartStop) vue.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 peut s’avérer utile, car il est souvent les extensions qui bloquent le thread d’interface utilisateur simplement en attente sur d’autres threads ou 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, le UC Stack vue, qui est l’option idéale pour la plupart des cas, ne peut pas capturer le temps du thread dans la mesure où 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. Le threads des piles de temps résout ce problème en correctement les temps montrant bloqué.The Thread Time Stacks solves this problem by properly showing blocked time.

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

Lors de l’ouverture threads des piles de temps afficher, choisissez la devenv processus 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 le threads des piles de temps afficher, en haut à gauche de la page, vous pouvez définir l’intervalle de temps pour les valeurs que nous avons calculé à l’étape précédente et appuyez sur entrée donc les piles sont ajustées pour cet intervalle 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étermination de thread qui est l’interface utilisateur de thread de (démarrage) peut être non intuitifs si la collection de trace est démarrée une fois que 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 DLL du système d’exploitation (ntdll.dll et kernel32.dll) suivie devenv!? , puis msenv!? .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!? 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 également filtrer cette vue 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.

  • Définissez GroupPats au texte vide à supprimer n’importe quel regroupement ajouté par défaut.Set GroupPats to empty text to remove any grouping added by default.
  • Définissez IncPats à inclure les parties 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 propose des conseils sous détaillés le aide menu que vous pouvez utiliser pour identifier les goulots d’étranglement 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 les API pour optimiser votre code de threading de Visual Studio :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 de 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 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 au fil du contrôle (par exemple, si votre extension doit appeler des services VS synchrones sur le thread d’interface utilisateur), nous aimerions en savoir plus.If you are unable to address the unresponsiveness due to dependencies you do not have control over (for example, 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 de partenaires Visual Studio, vous pouvez nous contacter en soumettant une demande de support 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.