Diagnostisera fördröjningar i användargränssnittet som orsakas av tillägg
När användargränssnittet inte svarar undersöker Visual Studio anropsstacken för användargränssnittstråden, börjar med bladet och arbetar mot basen. Om Visual Studio fastställer att en ram för anropsstack tillhör en modul som ingår i ett installerat och aktiverat tillägg visas ett meddelande.
Meddelandet informerar användaren om att UI-fördröjningen (dvs. att användargränssnittet inte svarar) kan ha varit resultatet av kod från ett tillägg. Det ger också användaren alternativ för att inaktivera tillägget eller framtida meddelanden för tillägget.
Det här dokumentet beskriver hur du kan diagnostisera vad i tilläggskoden som orsakar UI-fördröjningsmeddelanden.
Notis
Använd inte den experimentella Visual Studio-instansen för att diagnostisera fördröjningar i användargränssnittet. Vissa delar av anropsstackanalysen som krävs för UI-fördröjningsmeddelanden inaktiveras när du använder den experimentella instansen, vilket innebär att meddelanden om UI-fördröjning kanske inte visas.
En översikt över diagnostikprocessen är följande:
- Identifiera utlösarscenariot.
- Starta om VS med aktivitetsloggning på.
- Starta ETW-spårning.
- Utlös meddelandet för att visas igen.
- Stoppa ETW-spårning.
- Granska aktivitetsloggen för att hämta fördröjnings-ID:t.
- Analysera ETW-spårningen med hjälp av fördröjnings-ID från steg 6.
I följande avsnitt går vi igenom de här stegen mer detaljerat.
Identifiera utlösarscenariot
För att kunna diagnostisera en fördröjning i användargränssnittet måste du först identifiera vad (sekvens med åtgärder) som gör att Visual Studio visar meddelandet. Detta för att du ska kunna utlösa meddelandet senare med loggning aktiverat.
Starta om VS med aktivitetsloggning på
Visual Studio kan generera en "aktivitetslogg" som ger information som är användbar när du felsöker ett problem. Om du vill aktivera aktivitetsloggning i Visual Studio öppnar du Visual Studio med kommandoradsalternativet /log
. När Visual Studio startar lagras aktivitetsloggen på följande plats:
%APPDATA%\Microsoft\VisualStudio\<vs_instance_id>\ActivityLog.xml
Mer information om hur du hittar ditt VS-instans-ID finns i Verktyg för att identifiera och hantera Visual Studio-instanser. Vi använder den här aktivitetsloggen senare för att ta reda på mer information om fördröjningar i användargränssnittet och relaterade meddelanden.
Starta ETW-spårning
Du kan använda PerfView för att samla in en ETW-spårning. PerfView tillhandahåller ett lätthanterad gränssnitt både för att samla in en ETW-spårning och för att analysera den. Använd följande kommando för att samla in en spårning:
Perfview.exe collect C:\trace.etl /BufferSizeMB=1024 -CircularMB:2048 -Merge:true -Providers:*Microsoft-VisualStudio:@StacksEnabled=true -NoV2Rundown /kernelEvents=default+FileIOInit+ContextSwitch+Dispatcher
Detta aktiverar providern "Microsoft-VisualStudio", som är providern Som Visual Studio använder för händelser relaterade till UI-fördröjningsmeddelanden. Det anger också nyckelordet för kernelprovidern som PerfView kan använda för att generera Trådtidsstackar vy.
Utlös meddelandet så att det visas igen
När PerfView har startat spårningssamlingen kan du använda utlösaråtgärdssekvensen (från steg 1) för att meddelandet ska visas igen. När meddelandet visas kan du stoppa spårningssamlingen för PerfView för att bearbeta och generera utdataspårningsfilen.
Stoppa ETW-spårning
Om du vill stoppa spårningsinsamlingen använder du bara knappen Stoppa samling i PerfView-fönstret. När du har stoppat spårningssamlingen bearbetar PerfView automatiskt ETW-händelserna och genererar en spårningsfil för utdata.
Granska aktivitetsloggen för att hämta fördröjnings-ID:t
Som tidigare nämnts hittar du aktivitetsloggen på %APPDATA%\Microsoft\VisualStudio<vs_instance_id>\ActivityLog.xml. Varje gång Visual Studio identifierar en tilläggs-UI-fördröjning skriver den en nod till aktivitetsloggen med UIDelayNotifications
som källa. Den här noden innehåller fyra informationsdelar om UI-fördröjningen:
- Användargränssnittets fördröjnings-ID, ett sekventiellt nummer som unikt identifierar en UI-fördröjning i en VS-session
- Sessions-ID:t, som unikt identifierar din Visual Studio-session från början till slut
- Om ett meddelande visades för UI-fördröjningen eller inte
- Tillägget som troligen orsakade UI-fördröjningen
<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>
Not
Alla fördröjningar i användargränssnittet resulterar inte i ett meddelande. Därför bör du alltid kontrollera det meddelande som visas? värde för att korrekt identifiera rätt UI-fördröjning.
När du har hittat rätt UI-fördröjning i aktivitetsloggen skriver du ned det gränssnittsfördröjnings-ID som anges i noden. Du använder ID:t för att leta efter motsvarande ETW-händelse i nästa steg.
Analysera ETW-spårningen
Öppna sedan spårningsfilen. Du kan göra detta antingen med samma instans av PerfView eller genom att starta en ny instans och ange den aktuella mappsökvägen längst upp till vänster i fönstret till platsen för spårningsfilen.
Välj sedan spårningsfilen i den vänstra rutan och öppna den genom att välja Öppna från snabbmenyn eller högerklicka.
Obs
PerfView matar som standard ut ett Zip-arkiv. När du öppnar trace.zipexpanderas arkivet automatiskt och spårningen öppnas. Du kan hoppa över detta genom att avmarkera rutan Zip under spårningssamlingen. Men om du planerar att överföra och använda spårningar på olika datorer rekommenderar vi starkt att du inte avmarkerar rutan Zip. Utan det här alternativet medföljer inte de obligatoriska PDB:erna för Ngen-sammansättningar spårningen och därför matchas inte symboler från Ngen-sammansättningar på måldatorn. (Mer information om PDB för Ngen-sammansättningar finns i det här blogginlägget.)
Det kan ta flera minuter för PerfView att bearbeta och öppna spårningen. När spårningen är öppen visas en lista med olika "vyer" under den.
Vi använder först vyn Händelser för att hämta tidsintervallet för UI-fördröjningen:
- Öppna händelser-vyn genom att välja
Events
-noden under spåret och välja Öppna från snabbmenyn eller kontextmenyn. - Välj "
Microsoft-VisualStudio/ExtensionUIUnresponsiveness
" i den vänstra rutan. - Tryck på Enter
Urvalet tillämpas och alla ExtensionUIUnresponsiveness
-händelser visas i den högra panelen.
Varje rad i den högra rutan motsvarar en UI-fördröjning. Händelsen innehåller värdet "Fördröjnings-ID" som ska matcha fördröjnings-ID:t i aktivitetsloggen från steg 6. Eftersom ExtensionUIUnresponsiveness
utlöses i slutet av UI-fördröjningen markerar tidsstämpeln för händelsen (ungefär) sluttiden för UI-fördröjningen. Händelsen innehåller också fördröjningens varaktighet. Vi kan subtrahera varaktigheten från sluttidsstämpeln för att hämta tidsstämpeln för när UI-fördröjningen startade.
I föregående skärmbild är till exempel tidsstämpeln för händelsen 12 125,679 och fördröjningstiden är 6 143,085 (ms). Sålunda
- Fördröjningsstarten är 12 125,679 – 6 143,085 = 5 982,594.
- Tidsintervallet för UI-fördröjning är 5 982,594 till 12 125,679.
När vi har tidsintervallet kan vi stänga vy för händelser och öppna trådtid (med StartStop-aktiviteter) stackarna vy. Den här vyn är särskilt praktisk eftersom tillägg som blockerar användargränssnittstråden ofta bara väntar på andra trådar eller en I/O-bunden åtgärd. Därför kanske CPU Stack- vy, vilket är det go-to alternativet för de flesta fall, inte fånga den tid som tråden ägnar åt blockering eftersom den inte använder processorn under den tiden. Tråd Tidsstaplar löser det här problemet genom att korrekt visa blockerat tid.
När du öppnar trådtidsstackar vy väljer du processen devenv för att starta analysen.
I vyn Thread Time Stacks, längst upp till vänster på sidan, kan du ställa in tidsintervallet enligt de värden vi beräknade i föregående steg och tryck på Enter så att staplarna justeras till det tidsintervallet.
Not
Det kan vara kontraintuitivt att avgöra vilken tråd som är användargränssnittstråden (starttråden) när spårningen påbörjas efter att Visual Studio redan har öppnats. De första elementen i stacken i användargränssnittstråden (start) är dock troligtvis alltid DLL:er för operativsystem (ntdll.dll och kernel32.dll) följt av devenv!?
och sedan msenv!?
. Den här sekvensen kan hjälpa dig att identifiera användargränssnittstråden.
Du kan också filtrera den här vyn ytterligare genom att endast inkludera staplar som innehåller moduler från paketet.
- Ange GroupPats till tom text för att ta bort alla grupper som läggs till som standard.
- Ange IncPats för att inkludera en del av sammansättningsnamnet utöver det befintliga processfiltret. I det här fallet bör det vara devenv; UIDelayR2.
PerfView har detaljerad vägledning under menyn Hjälp som du kan använda för att identifiera flaskhalsar i koden. Dessutom innehåller följande länkar mer information om hur du använder Visual Studio-trådnings-API:er för att optimera koden:
https://github.com/Microsoft/vs-threading/blob/main/doc/index.md
https://github.com/Microsoft/vs-threading/blob/main/doc/cookbook_vs.md
Du kan också använda de nya statiska Analysverktygen för Visual Studio för tillägg (NuGet-paket här), som ger vägledning om metodtips för att skriva effektiva tillägg. Se en lista över VSSDK-analysverktyg och trådanalysverktyg.
Obs
Om du inte kan hantera svarsfelet på grund av beroenden som du inte har kontroll över (till exempel om tillägget måste anropa synkrona VS-tjänster i användargränssnittstråden) vill vi veta mer om det. Om du är medlem i vårt Visual Studio-partnerprogram kan du kontakta oss genom att skicka in en supportbegäran för utvecklare. Annars kan du använda verktyget Rapportera ett problem för att skicka feedback och ta med "Extension UI Delay Notifications"
i rubriken. Ange även en detaljerad beskrivning av din analys.