Strumenti di diagnostica in parallelo (runtime di concorrenza)
In Visual Studio viene fornito un ampio supporto per il debug e la profilatura delle applicazioni multithreading.
Debug
Il debugger di Visual Studio include la finestra Stack in parallelo, la finestra Attività in parallelo e la finestra Espressione di controllo in parallelo.Per ulteriori informazioni, vedere Procedura dettagliata: debug di un'applicazione parallela e Procedura: utilizzare la finestra Espressione di controllo in parallelo.
Profilatura
Gli strumenti di profilatura offrono tre visualizzazioni dati che visualizza 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 disabilitare l'analisi.
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 che 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.