Outils de diagnostic parallèles (runtime d'accès concurrentiel)
Visual Studio fournit une prise en charge complète des applications de débogage et de profilage multithread.
Débogage
Le débogueur Visual Studio inclut la fenêtre Stacks parallèles, la fenêtre Tâches parallèles et la fenêtre Espion parallèle. Pour plus d’informations, consultez Procédure pas à pas : débogage d’une application parallèle et guide pratique pour utiliser la fenêtre Espion parallèle.
Profilage
Les outils de profilage fournissent trois vues de données qui affichent des informations graphiques, tabulaires et numériques sur la façon dont une application multithread interagit avec elle-même et avec d’autres programmes. Les vues vous permettent d’identifier rapidement les zones de préoccupation et de naviguer à partir de points sur les affichages graphiques pour appeler des piles, des sites d’appel et du code source. Pour plus d’informations, consultez Visualiseur concurrentiel.
Suivi de l'événement
Le runtime d’accès concurrentiel utilise le suivi des événements pour Windows (ETW) pour notifier les outils d’instrumentation, tels que les profileurs, lorsque différents événements se produisent. Ces événements incluent lorsqu’un planificateur est activé ou désactivé, lorsqu’un contexte commence, se termine, bloque, débloque ou génère, et lorsqu’un algorithme parallèle commence ou se termine.
Les outils tels que le visualiseur concurrentiel utilisent cette fonctionnalité ; par conséquent, vous n’avez généralement pas besoin d’utiliser ces événements directement. Toutefois, ces événements sont utiles lorsque vous développez un profileur personnalisé ou lorsque vous utilisez des outils de suivi d’événements tels que windows Performance Toolkit.
Le runtime d’accès concurrentiel déclenche ces événements uniquement lorsque le suivi est activé. Appelez la fonction concurrency ::EnableTracing pour activer le suivi d’événements et la fonction concurrency ::D isableTracing pour désactiver le suivi.
Le tableau suivant décrit les événements que le runtime déclenche lorsque le suivi des événements est activé :
Événement | Description | active |
---|---|---|
concurrency ::ConcRT_ProviderGuid | Identificateur du fournisseur ETW pour le runtime d’accès concurrentiel. | f7b697a3-4db5-4d3b-be71-c4d284e6592f |
concurrency ::ContextEventGuid | Marque les événements liés aux contextes. | 5727a00f-50be-4519-8256-f7699871fecb |
concurrency ::P PLParallelForEventGuid | Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_for . | 31c8da6b-6165-4042-8b92-949e315f4d84 |
concurrency ::P PLParallelForeachEventGuid | Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_for_each . | 5cb7d785-9d66-465d-bae1-4611061b5434 |
concurrency ::P PLParallelInvokeEventGuid | Marque l’entrée et la sortie des appels à l’algorithme concurrency ::p arallel_invoke . | d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
concurrency ::SchedulerEventGuid | Marque les événements liés au planificateur de tâches. | e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
concurrency ::VirtualProcessorEventGuid | Marque les événements liés aux processeurs virtuels. | 2f27805f-1676-4ecc-96fa-7eb09d44302f |
Le runtime d’accès concurrentiel définit, mais ne déclenche pas actuellement les événements suivants. Le runtime réserve ces événements pour une utilisation ultérieure :
L’énumération concurrency ::ConcRT_EventType spécifie les opérations possibles qu’un événement suit. Par exemple, à l’entrée de l’algorithme parallel_for
, le runtime déclenche l’événement PPLParallelForEventGuid
et fournit CONCRT_EVENT_START
comme opération. Avant que l’algorithme parallel_for
ne retourne, le runtime déclenche à nouveau l’événement PPLParallelForEventGuid
et fournit CONCRT_EVENT_END
comme opération.
L’exemple suivant montre comment activer le suivi pour un appel à parallel_for
. Le runtime n’effectue pas le suivi du premier appel, parallel_for
car il n’est pas activé. Appel permettant au EnableTracing
runtime d’effectuer le suivi du deuxième appel vers 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();
}
Le runtime effectue le suivi du nombre de fois que vous appelez EnableTracing
et DisableTracing
. Par conséquent, si vous appelez EnableTracing
plusieurs fois, vous devez appeler DisableTracing
le même nombre de fois pour désactiver le suivi.