Równoległe narzędzia diagnostyczne (współbieżność środowiska wykonawczego)
Program Visual Studio zapewnia rozbudowaną obsługę debugowania i profilowania aplikacji wielowątkowych.
Debugowanie
Debuger programu Visual Studio zawiera okno stosów równoległych , okno Równoległe zadania i okno obserwatora równoległego. Aby uzyskać więcej informacji, zobacz Przewodnik: debugowanie aplikacji równoległej i Instrukcje: korzystanie z okna równoległego zegarka.
Profilowanie
Narzędzia profilowania udostępniają trzy widoki danych, które wyświetlają graficzne, tabelaryczne i liczbowe informacje o tym, jak aplikacja wielowątkowa współdziała z samym sobą i innymi programami. Widoki umożliwiają szybkie identyfikowanie obszarów zainteresowania oraz przechodzenie z punktów na ekranach graficznych w celu wywoływania stosów, lokacji wywołań i kodu źródłowego. Aby uzyskać więcej informacji, zobacz Concurrency Visualizer.
Śledzenie zdarzeń
Środowisko uruchomieniowe współbieżności używa śledzenia zdarzeń dla systemu Windows (ETW) do powiadamiania narzędzi instrumentacji, takich jak profilery, w przypadku wystąpienia różnych zdarzeń. Te zdarzenia obejmują, gdy harmonogram jest aktywowany lub dezaktywowany, po rozpoczęciu kontekstu, kończy się, blokuje, odblokuje lub zwraca, a gdy algorytm równoległy rozpoczyna lub kończy się.
Narzędzia, takie jak Concurrency Visualizer , korzystają z tej funkcji, dlatego zazwyczaj nie trzeba bezpośrednio pracować z tymi zdarzeniami. Jednak te zdarzenia są przydatne podczas tworzenia niestandardowego profilera lub korzystania z narzędzi do śledzenia zdarzeń, takich jak zestaw narzędzi windows Performance Toolkit.
Środowisko uruchomieniowe współbieżności zgłasza te zdarzenia tylko wtedy, gdy śledzenie jest włączone. Wywołaj funkcję concurrency::EnableTracing , aby włączyć śledzenie zdarzeń i funkcję concurrency::D isableTracing , aby wyłączyć śledzenie.
W poniższej tabeli opisano zdarzenia wywoływane przez środowisko uruchomieniowe po włączeniu śledzenia zdarzeń:
Wydarzenie | Opis | Wartość |
---|---|---|
concurrency::ConcRT_ProviderGuid | Identyfikator dostawcy ETW dla środowiska uruchomieniowego współbieżności. | f7b697a3-4db5-4d3b-be71-c4d284e6592f |
concurrency::ContextEventGuid | Oznacza zdarzenia związane z kontekstami. | 5727a00f-50be-4519-8256-f7699871fecb |
concurrency::P PLParallelForEventGuid | Oznacza wejście i wyjście do wywołań do algorytmu concurrency::p arallel_for . | 31c8da6b-6165-4042-8b92-949e315f4d84 |
concurrency::P PLParallelForeachEventGuid | Oznacza wejście i wyjście do wywołań do współbieżności::p arallel_for_each algorytmu. | 5cb7d785-9d66-465d-bae1-4611061b5434 |
concurrency::P PLParallelInvokeEventGuid | Oznacza wejście i wyjście do wywołań do algorytmu concurrency::p arallel_invoke . | d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
concurrency::SchedulerEventGuid | Oznacza zdarzenia związane z harmonogramem zadań. | e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
concurrency::VirtualProcessorEventGuid | Oznacza zdarzenia związane z procesorami wirtualnymi. | 2f27805f-1676-4ecc-96fa-7eb09d44302f |
Środowisko uruchomieniowe współbieżności definiuje, ale obecnie nie zgłasza następujących zdarzeń. Środowisko uruchomieniowe rezerwuje te zdarzenia do użycia w przyszłości:
Współbieżność ::ConcRT_EventType wyliczenie określa możliwe operacje, które śledzi zdarzenie. Na przykład przy wejściu do algorytmu parallel_for
środowisko uruchomieniowe zgłasza PPLParallelForEventGuid
zdarzenie i udostępnia CONCRT_EVENT_START
je jako operację. Przed zwróceniem algorytmu parallel_for
środowisko uruchomieniowe ponownie zgłasza PPLParallelForEventGuid
zdarzenie i udostępnia CONCRT_EVENT_END
je jako operację.
Poniższy przykład ilustruje sposób włączania śledzenia dla wywołania metody parallel_for
. Środowisko uruchomieniowe nie śledzi pierwszego wywołania metody , parallel_for
ponieważ śledzenie nie jest włączone. Wywołanie w celu EnableTracing
umożliwienia środowisku uruchomieniowemu śledzenia drugiego wywołania metody 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();
}
Środowisko uruchomieniowe śledzi liczbę wywołań EnableTracing
i DisableTracing
. W związku z tym, jeśli wywołasz EnableTracing
wiele razy, musisz wywołać DisableTracing
tę samą liczbę razy, aby wyłączyć śledzenie.