Sdílet prostřednictvím


Diagnostika zpoždění uživatelského rozhraní způsobených rozšířeními

Když přestane uživatelské rozhraní reagovat, Visual Studio prozkoumá zásobník volání vlákna uživatelského rozhraní, počínaje listem a pracuje na základu. Pokud sada Visual Studio zjistí, že rámec zásobníku volání patří do modulu, který je součástí nainstalovaného a povoleného rozšíření, zobrazí se oznámení.

Oznámení o zpoždění uživatelského rozhraní (nereagující)

Oznámení informuje uživatele, že zpoždění uživatelského rozhraní (tj. nereagující v uživatelském rozhraní) mohlo být výsledkem kódu z rozšíření. Poskytuje také uživatelům možnosti zakázat rozšíření nebo budoucí oznámení pro toto rozšíření.

Tento dokument popisuje, jak diagnostikovat, co v kódu rozšíření způsobuje oznámení o zpoždění uživatelského rozhraní.

Poznámka:

K diagnostice zpoždění uživatelského rozhraní nepoužívejte experimentální instanci sady Visual Studio. Některé části analýzy zásobníku volání vyžadované pro oznámení zpoždění uživatelského rozhraní jsou při použití experimentální instance vypnuté, což znamená, že se nemusí zobrazovat oznámení zpoždění uživatelského rozhraní.

Přehled diagnostického procesu je následující:

  1. Identifikujte scénář triggeru.
  2. Restartujte VS s protokolováním aktivit.
  3. Spusťte trasování trasování událostí pro Windows.
  4. Aktivujte oznámení, aby se znovu zobrazilo.
  5. Zastavení trasování trasování Trasování událostí pro Windows
  6. Zkontrolujte protokol aktivit a získejte ID zpoždění.
  7. Analyzujte trasování trasování Trasování pro Windows pomocí ID zpoždění z kroku 6.

V následujících částech si podrobněji projdeme tyto kroky.

Identifikace scénáře triggeru

Pokud chcete diagnostikovat zpoždění uživatelského rozhraní, musíte nejprve zjistit, co (posloupnost akcí) způsobí, že Visual Studio zobrazí oznámení. To znamená, že budete moct oznámení aktivovat později se zapnutým protokolováním.

Restartování VS s protokolováním aktivit

Visual Studio může vygenerovat "protokol aktivit", který poskytuje užitečné informace při ladění problému. Pokud chcete zapnout protokolování aktivit v sadě Visual Studio, otevřete Visual Studio s možností příkazového /log řádku. Po spuštění sady Visual Studio se protokol aktivit uloží do následujícího umístění:

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

Další informace o tom, jak najít ID instance VS, najdete v tématu Nástroje pro detekci a správu instancí sady Visual Studio. Tento protokol aktivit použijeme později k vyhledání dalších informací o zpožděních uživatelského rozhraní a souvisejících oznámeních.

Spuštění trasování trasování Trasování událostí pro Windows

Pomocí nástroje PerfView můžete shromáždit trasování trasování Trasování událostí pro Windows. PerfView poskytuje snadno použitelné rozhraní jak pro shromažďování trasování Trasování událostí pro Windows, tak pro jeho analýzu. Pomocí následujícího příkazu shromážděte trasování:

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

To umožňuje poskytovateli Microsoft-VisualStudio, což je poskytovatel, který Visual Studio používá pro události související s oznámeními zpoždění uživatelského rozhraní. Určuje také klíčové slovo pro zprostředkovatele jádra, které perfView může použít k vygenerování zobrazení Zásobníky času vlákna.

Aktivujte oznámení, aby se znovu zobrazilo.

Jakmile perfView spustí shromažďování trasování, můžete pro opětovné zobrazení oznámení použít posloupnost akcí triggeru (od kroku 1). Jakmile se zobrazí oznámení, můžete zastavit kolekci trasování pro PerfView ke zpracování a vygenerovat výstupní trasovací soubor.

Zastavení trasování trasování trasování Trasování událostí pro Windows

Pokud chcete zastavit kolekci trasování, jednoduše použijte tlačítko Zastavit kolekci v okně PerfView. Po zastavení shromažďování trasování perfView automaticky zpracuje události trasování událostí pro Windows a vygeneruje výstupní trasovací soubor.

Zkontrolujte protokol aktivit a získejte ID zpoždění.

Jak už jsme zmínili dříve, protokol aktivit najdete na adrese %APPDATA%\Microsoft\VisualStudio<vs_instance_id>\ActivityLog.xml. Pokaždé, když Visual Studio zjistí zpoždění uživatelského rozhraní rozšíření, zapíše uzel do protokolu UIDelayNotifications aktivit jako zdroj. Tento uzel obsahuje čtyři informace o zpoždění uživatelského rozhraní:

  • ID zpoždění uživatelského rozhraní, pořadové číslo, které jednoznačně identifikuje zpoždění uživatelského rozhraní v relaci VS
  • ID relace, které jednoznačně identifikuje relaci sady Visual Studio od začátku do ukončení
  • Zda se zobrazilo oznámení o zpoždění uživatelského rozhraní
  • Rozšíření, které pravděpodobně způsobilo zpoždění uživatelského rozhraní
<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>

Poznámka:

Ne všechna zpoždění uživatelského rozhraní vedou k oznámení. Proto byste měli vždy zkontrolovat zobrazenou hodnotu oznámení? a správně identifikovat správné zpoždění uživatelského rozhraní.

Jakmile v protokolu aktivit najdete správné zpoždění uživatelského rozhraní, poznamenejte si ID zpoždění uživatelského rozhraní zadané v uzlu. ID použijete k vyhledání odpovídající události Trasování událostí pro Windows v dalším kroku.

Analýza trasování Trasování událostí pro Windows

Pak otevřete trasovací soubor. Můžete to provést buď pomocí stejné instance perfView, nebo spuštěním nové instance a nastavením aktuální cesty ke složce v levém horním rohu okna na umístění trasovacího souboru.

Nastavení cesty ke složce v nástroji Perfview

Potom vyberte trasovací soubor v levém podokně a otevřete ho tak, že v místní nabídce kliknete pravým tlačítkem myši nebo ji otevřete.

Poznámka:

Ve výchozím nastavení perfView zobrazí výstup archiv zip. Když otevřete trace.zip, automaticky dekomprimuje archiv a otevře trasování. Tuto možnost můžete přeskočit zrušením zaškrtnutí políčka Zip během shromažďování trasování. Pokud ale plánujete převést a používat trasování na různých počítačích, důrazně doporučujeme zrušit zaškrtnutí políčka Zip . Bez této možnosti nebudou požadované soubory PDB pro sestavení Ngen doprovázet trasování, a proto se symboly ze sestavení Ngen na cílovém počítači nepřeloží. (Další informace o souborech PDB pro sestavení Ngen najdete v tomto blogovém příspěvku .)

Zpracování a otevření trasování může trvat několik minut. Po otevření trasování se pod ním zobrazí seznam různých zobrazení.

Souhrnné zobrazení trasování perfView

Nejprve použijeme zobrazení Události k získání časového rozsahu zpoždění uživatelského rozhraní:

  1. Otevřete zobrazení Události výběrem Events uzlu pod trasováním a výběrem možnosti Otevřít v místní nabídce nebo po kliknutí pravým tlačítkem myši.
  2. V levém podokně vyberte "Microsoft-VisualStudio/ExtensionUIUnresponsiveness".
  3. Stiskněte klávesu Enter.

Výběr se použije a všechny ExtensionUIUnresponsiveness události se zobrazí v pravém podokně.

Výběr událostí v zobrazení Události

Každý řádek v pravém podokně odpovídá zpoždění uživatelského rozhraní. Událost obsahuje hodnotu "ID zpoždění", která by se měla shodovat s ID zpoždění v protokolu aktivit z kroku 6. Vzhledem k tomu ExtensionUIUnresponsiveness , že se aktivuje na konci zpoždění uživatelského rozhraní, časové razítko události (zhruba) označuje koncový čas zpoždění uživatelského rozhraní. Událost také obsahuje dobu trvání zpoždění. Dobu trvání můžeme odečíst od koncového časového razítka, abychom získali časové razítko, kdy se spustilo zpoždění uživatelského rozhraní.

Výpočet časového rozsahu zpoždění uživatelského rozhraní

Na předchozím snímku obrazovky je například časové razítko události 12 125,679 a doba trvání zpoždění je 6 143,085 (ms). Tedy,

  • Začátek zpoždění je 12 125,679 – 6 143,085 = 5 982,594.
  • Časový rozsah zpoždění uživatelského rozhraní je 5 982,594 až 125,679.

Jakmile budeme mít časový rozsah, můžeme se ze zobrazení Události zavřít a otevřít zásobníky čas vlákna (s aktivitami StartStop). Toto zobrazení je užitečné hlavně proto, že často rozšíření blokující vlákno uživatelského rozhraní pouze čekají na jiná vlákna nebo na vstupně-výstupní operaci. Proto zobrazení zásobníku procesoru, což je možnost přechodu pro většinu případů, nemusí zachytit čas, který vlákno stráví blokováním, protože během této doby nepoužívá procesor. Zásobníky času vláken tento problém řeší tak, že správně zobrazují blokovaný čas.

Čas vlákna (s aktivitami StartStop) – uzel Zásobníky v souhrnném zobrazení PerfView

Při otevírání zobrazení Zásobníky času vláken zvolte proces odstranění, který chcete zahájit analýzu.

Zobrazení zásobníků času vláken pro analýzu zpoždění uživatelského rozhraní

V zobrazení Zásobníky času vláken v levém horním rohu stránky můžete nastavit časový rozsah na hodnoty, které jsme vypočítali v předchozím kroku, a stiskněte Enter, aby se zásobníky upravily na tento časový rozsah.

Poznámka:

Určení vlákna, které je vlákno uživatelského rozhraní (po spuštění), může být neintuitivní, pokud je kolekce trasování spuštěna po spuštění sady Visual Studio. První prvky v zásobníku vlákna uživatelského rozhraní (startup) jsou však s největší pravděpodobností vždy knihovny DLL operačního systému (ntdll.dll a kernel32.dll) následované a pak .devenv!?msenv!? Tato sekvence může pomoct identifikovat vlákno uživatelského rozhraní.

Identifikace spouštěcího vlákna

Toto zobrazení můžete také dále filtrovat tak, že zahrnete pouze zásobníky, které obsahují moduly z balíčku.

  • Nastavte GroupPats na prázdný text, aby se ve výchozím nastavení odebraly všechny přidané seskupení.
  • Nastavte IncPats tak, aby zahrnovala část názvu sestavení kromě existujícího filtru procesů. V tomto případě by měl být devenv; UIDelayR2.

Nastavení GroupPath a IncPath v zobrazení Zásobníky času vláken

Nástroj PerfView obsahuje podrobné pokyny v nabídce Nápověda , které můžete použít k identifikaci kritických bodů výkonu v kódu. Kromě toho následující odkazy poskytují další informace o tom, jak využít rozhraní API pro dělení vláken sady Visual Studio k optimalizaci kódu:

Můžete také použít nové statické analyzátory sady Visual Studio pro rozšíření (balíček NuGet zde), které poskytují pokyny k osvědčeným postupům pro psaní efektivních rozšíření. Podívejte se na seznam analyzátorů VSSDK a analyzátorů vláken.

Poznámka:

Pokud nemůžete reagovat kvůli závislostem, které nemáte pod kontrolou (například pokud vaše rozšíření musí volat synchronní služby VS ve vlákně uživatelského rozhraní), rádi bychom o tom věděli. Pokud jste členem našeho programu Visual Studio Partner, můžete nás kontaktovat odesláním žádosti o podporu pro vývojáře. V opačném případě použijte nástroj Nahlásit problém a odešlete svůj názor a uveďte "Extension UI Delay Notifications" ho do názvu. Uveďte také podrobný popis analýzy.