Condividi tramite


Strumenti di diagnostica in parallelo (runtime di concorrenza)

In Microsoft Visual Studio 2010 viene fornito un ampio supporto per il debug e la profilatura delle applicazioni multithreading.

Debug

Nel debugger di Visual Studio sono disponibili due nuove finestre Stack in parallelo e Attività in parallelo. Per ulteriori informazioni, vedere Procedura dettagliata: debug di un'applicazione parallela.

Analisi

Strumenti di analisi di Visual Studio Team Developer Edition fornisce tre visualizzazioni dati che forniscono informazioni grafiche, tabulari e numeriche su come un'applicazione multithreading interagisce con se stessa e con altri programmi. Grazie alle visualizzazioni è possibile identificare rapidamente le aree problematiche nonché accedere a stack di chiamate, siti di chiamata e codice sorgente tramite determinati punti delle visualizzazioni grafiche. Per ulteriori informazioni, vedere Visualizzatore di concorrenze.

Event Tracing

Il runtime di concorrenza utilizza Event Tracing for Windows (ETW) per notificare alla strumentazione, ad esempio i profiler, quando si verificano vari eventi. Tali eventi includono l'attivazione o la disattivazione di un'utilità di pianificazione, l'inizio, la fine, il blocco, lo sblocco di un contesto o la cessione volontaria del controllo e l'inizio o la fine di un algoritmo parallelo.

Gli strumenti come Visualizzatore di concorrenze utilizzano questa funzionalità, pertanto in genere non è necessario lavorare direttamente con questi eventi. Questi risultano tuttavia utili quando si sviluppa un profiler personalizzato o quando si utilizzano strumenti di traccia degli eventi come Xperf.

Il runtime di concorrenza genera questi eventi solo quando la funzione di traccia è abilitata. Chiamare la funzione Concurrency::EnableTracing per abilitare la traccia degli eventi e la funzione Concurrency::DisableTracing per disabilitarla.

Nella tabella riportata di seguito vengono descritti gli eventi generati dal runtime quando è abilitata la funzione di traccia degli eventi.

Evento

Descrizione

Valore

Concurrency::ConcRT_ProviderGuid

Identificatore del provider ETW per il runtime di concorrenza.

f7b697a3-4db5-4d3b-be71-c4d284e6592f

Concurrency::ContextEventGuid

Contrassegna gli eventi correlati ai contesti.

5727a00f-50be-4519-8256-f7699871fecb

Concurrency::PPLParallelForEventGuid

Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_for.

31c8da6b-6165-4042-8b92-949e315f4d84

Concurrency::PPLParallelForeachEventGuid

Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_for_each.

5cb7d785-9d66-465d-bae1-4611061b5434

Concurrency::PPLParallelInvokeEventGuid

Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_invoke.

d1b5b133-ec3d-49f4-98a3-464d1a9e4682

Concurrency::SchedulerEventGuid

Contrassegna gli eventi correlati all'utilità di pianificazione.

e2091f8a-1e0a-4731-84a2-0dd57c8a5261

Concurrency::VirtualProcessorEventGuid

Contrassegna gli eventi correlati ai processori virtuali.

2f27805f-1676-4ecc-96fa-7eb09d44302f

Il runtime di concorrenza definisce, ma al momento non genera, gli eventi seguenti. Il runtime riserva questi eventi a un utilizzo futuro:

L'enumerazione Concurrency::ConcRT_EventType specifica le operazioni possibili di cui tiene traccia un evento. Ad esempio, all'entrata dell'algoritmo parallel_for, il runtime genera l'evento PPLParallelForEventGuid e offre CONCRT_EVENT_START come operazione. Prima che l'algoritmo parallel_for restituisca un risultato, il runtime genera nuovamente l'evento PPLParallelForEventGuid e offre CONCRT_EVENT_END come operazione.

Nell'esempio seguente viene illustrato come attivare la funzione di traccia per una chiamata a parallel_for. Il runtime non traccia la prima chiamata a parallel_for in quanto la funzione di traccia non è abilitata. La chiamata a EnableTracing consente al runtime di tracciare la seconda chiamata a 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();
}

Il runtime tiene traccia del numero di volte in cui si chiama EnableTracing e DisableTracing. Pertanto, se si effettuano più chiamate a EnableTracing, è necessario chiamare DisableTracing lo stesso numero di volte per disabilitare la funzione di traccia.

Vedere anche

Concetti

Runtime di concorrenza

Cronologia delle modifiche

Data

Cronologia

Motivo

Giugno 2010

Sono state aggiunte informazioni sulla traccia degli eventi.

Miglioramento delle informazioni.