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 |
---|---|---|
Identificatore del provider ETW per il runtime di concorrenza. |
f7b697a3-4db5-4d3b-be71-c4d284e6592f |
|
Contrassegna gli eventi correlati ai contesti. |
5727a00f-50be-4519-8256-f7699871fecb |
|
Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_for. |
31c8da6b-6165-4042-8b92-949e315f4d84 |
|
Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_for_each. |
5cb7d785-9d66-465d-bae1-4611061b5434 |
|
Contrassegna l'entrata e l'uscita per le chiamate all'algoritmo Concurrency::parallel_invoke. |
d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
|
Contrassegna gli eventi correlati all'utilità di pianificazione. |
e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
|
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
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Giugno 2010 |
Sono state aggiunte informazioni sulla traccia degli eventi. |
Miglioramento delle informazioni. |