Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Visual Studio har omfattande stöd för felsökning och profilering av program med flera trådar.
Felsökning
Visual Studio-felsökningsprogrammet innehåller fönstret Parallella staplar , fönstret Parallella uppgifter och fönstret Parallell bevakning . Mer information finns i Genomgång: Felsöka ett parallellt program och Så här använder du fönstret Parallell bevakning.
Profilering
Profileringsverktygen innehåller tre datavyer som visar grafisk, tabellbaserad och numerisk information om hur ett program med flera trådar interagerar med sig själv och med andra program. Med vyerna kan du snabbt identifiera problemområden och navigera från punkter i de grafiska visningarna till att se anropsstaplar, samtalsplatser och källkod. Mer information finns i Concurrency Visualizer.
Händelsespårning
Concurrency Runtime använder Händelsespårning för Windows (ETW) för att meddela instrumenteringsverktyg, till exempel profilerare, när olika händelser inträffar. Dessa händelser inkluderar när en schemaläggare aktiveras eller inaktiveras, när en kontext börjar, slutar, blockerar, avblockerar eller ger och när en parallell algoritm börjar eller slutar.
Verktyg som Concurrency Visualizer använder den här funktionen. Därför behöver du vanligtvis inte arbeta med dessa händelser direkt. Dessa händelser är dock användbara när du utvecklar en anpassad profilerare eller när du använder verktyg för händelsespårning, till exempel Windows Performance Toolkit.
Concurrency Runtime genererar endast dessa händelser när spårning är aktiverat. Anropa funktionen concurrency::EnableTracing för att aktivera händelsespårning och funktionen concurrency::D isableTracing för att inaktivera spårning.
I följande tabell beskrivs de händelser som körningen genererar när händelsespårning är aktiverad:
| Evenemang | Beskrivning | Värde | 
|---|---|---|
| concurrency::ConcRT_ProviderGuid | ETW-provideridentifieraren för Concurrency Runtime. | f7b697a3-4db5-4d3b-be71-c4d284e6592f | 
| concurrency::ContextEventGuid | Markerar händelser som är relaterade till kontexter. | 5727a00f-50be-4519-8256-f7699871fecb | 
| concurrency::P PLParallelForEventGuid | Markerar början och slut på anrop till algoritmen concurrency::parallel_for. | 31c8da6b-6165-4042-8b92-949e315f4d84 | 
| concurrency::P PLParallelForeachEventGuid | Markerar ingång och utgång till anrop till algoritmen concurrency::p arallel_for_each . | 5cb7d785-9d66-465d-bae1-4611061b5434 | 
| concurrency::P PLParallelInvokeEventGuid | Märker ingångs- och utgångspunkter för anrop till algoritmen concurrency::parallel_invoke. | d1b5b133-ec3d-49f4-98a3-464d1a9e4682 | 
| concurrency::SchedulerEventGuid | Markerar händelser som är relaterade till Aktivitetsschemaläggare. | e2091f8a-1e0a-4731-84a2-0dd57c8a5261 | 
| concurrency::VirtualProcessorEventGuid | Markerar händelser som är relaterade till virtuella processorer. | 2f27805f-1676-4ecc-96fa-7eb09d44302f | 
Concurrency Runtime definierar, men genererar för närvarande inte, följande händelser. Körtiden reserverar dessa händelser för framtida användning.
              Konkurrens::ConcRT_EventType uppräkningstyp anger de möjliga åtgärder som en händelse spårar. Vid ingången till algoritmen parallel_for genererar körningen PPLParallelForEventGuid till exempel händelsen och tillhandahåller CONCRT_EVENT_START som åtgärd. Innan parallel_for algoritmen returneras, höjer körtiden återigen PPLParallelForEventGuid händelsen och tillhandahåller CONCRT_EVENT_END som operation.
I följande exempel visas hur du aktiverar spårning för ett anrop till parallel_for. Körtiden spårar inte det första anropet till parallel_for eftersom spårning inte är aktiverad. Anropet till EnableTracing gör att körmiljön kan spåra det andra anropet till parallel_for.
// etw.cpp
// compile with: /EHsc 
#include <ppl.h>
using namespace concurrency;
int wmain()
{
   // Perform some parallel work. 
   // Event tracing is disabled at this point.
   parallel_for(0, 10000, [](int i) {
      // TODO: Perform work.
   });
   // Enable tracing for a second call to parallel_for.
   EnableTracing();
   parallel_for(0, 10000, [](int i) {
      // TODO: Perform work.
   });   
   DisableTracing();
}
Körtiden spårar hur många gånger du anropar EnableTracing och DisableTracing. Om du anropar EnableTracing flera gånger måste du därför anropa DisableTracing samma antal gånger för att inaktivera spårning.