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í, začíná od nejnižší úrovně a postupuje k základně. Visual Studio zjistí, že rámec zásobníku volání patří modulu, který je součástí nainstalovaného a povoleného rozšíření, a je zobrazeno 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ář spouštěče.
  2. Restartujte VS se zapnutým protokolováním aktivit.
  3. Spusťte trasování událostí pro Windows.
  4. Aktivujte oznámení, aby se znovu zobrazilo.
  5. Zastavení trasování ETW
  6. Zkontrolujte protokol aktivit a získejte ID zpoždění.
  7. Analyzujte ETW trasu 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í. Abyste mohli oznámení aktivovat později, je třeba mít zapnuté protokolování.

Restartování VS s aktivovaným 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í /log příkazového řá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 Tools 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í ETW (Event Tracing for Windows)

Ke shromažďování trasování událostí pro Windows můžete použít PerfView. PerfView poskytuje snadno použitelné rozhraní jak pro shromažďování trasování ETW, tak pro jeho analýzu. Pomocí následujícího příkazu k zaevidování záznamu:

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

Tím se povolí poskytovatel „Microsoft-VisualStudio“, který Visual Studio používá pro události související s oznámeními o 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í zásobníků času vláken zobrazení.

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 sekvenci akcí spouštěče (z kroku 1). Jakmile se zobrazí oznámení, můžete zastavit sběr trasování, aby PerfView mohl zpracovat a vygenerovat výstupní trasovací soubor.

Zastavit trasování ETW

Pokud chcete zastavit shromažďování trasování, jednoduše použijte tlačítko Zastavit shromažďování v okně PerfView. Po zastavení shromažďování trasování PerfView automaticky zpracuje události ETW 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 v %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 aktivit s UIDelayNotifications jako zdrojem. 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, zda se zobrazuje oznámení , a hodnotu pro správné určení 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ího události ETW v dalším kroku.

Analyzujte ETW trasování

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 na Otevřít.

Poznámka

Ve výchozím nastavení PerfView vytváří výstup jako 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 však plánujete převést a používat trasování na různých počítačích, důrazně doporučujeme nezaškrtávat políčko 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 .)

Může trvat několik minut, než PerfView zpracuje a otevře sledování. Po otevření stopy se pod ní zobrazí seznam různých zobrazení.

zobrazení souhrnu trasování PerfView

Nejprve použijeme zobrazení Události k určení časového úseku zpoždění uživatelského rozhraní:

  1. Otevřete zobrazení Události pravým kliknutím na uzel Events pod trasováním a v zobrazené kontextové nabídce vyberte Otevřít.
  2. V levém podokně vyberte "Microsoft-VisualStudio/ExtensionUIUnresponsiveness".
  3. Stiskněte Enter.

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

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

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, že ExtensionUIUnresponsiveness 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 máme časový rozsah, můžeme opustit zobrazení Události a otevřít zobrazení Č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 go-to možnost ve většině případů, nemusí zachytit čas, kdy vlákno stráví blokováním, protože během této doby nepoužívá procesor. Zásobníky času vláken řeší tento problém tím, že správně zobrazují blokovaný čas.

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

Při otevírání časových zásobníků vláken zobrazení vyberte proces devenv a spusťte 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 můžete nastavit časový rozsah v levém horním rohu stránky na hodnoty, které jsme vypočítali v předchozím kroku, a stisknout Enter, aby se zásobníky přizpůsobily tomuto časovému rozsahu.

Poznámka

Určení, které vlákno je vlákno uživatelského rozhraní (startupové), může být neintuitivní, pokud je sběr trasování spuštěn poté, co je Visual Studio již otevřeno. První prvky v zásobníku vlákna uživatelského rozhraní (spouštění) jsou však s největší pravděpodobností vždy knihovny DLL operačního systému (ntdll.dll a kernel32.dll), následované devenv!? a pak 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 sady, které obsahují moduly z vašeho balíčku.

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

nastavení GroupPath a IncPath v zobrazení zásobníků času vláken

Nástroj PerfView obsahuje podrobné pokyny v nabídce Nápověda, které můžete použít k identifikaci výkonnostních úzkých míst 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í. Prohlédněte si 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ě pomocí nástroje Nahlásit problém odešlete zpětnou vazbu a do názvu zahrňte "Extension UI Delay Notifications". Uveďte také podrobný popis analýzy.