Partilhar via


Ferramentas de Diagnóstico Paralelas (Tempo de Execução Concorrente)

Visual Studio fornece suporte extensivo para depuração e criação de perfil de aplicativos multi-threaded.

Depuração de código

O depurador do Visual Studio inclui a janela Pilhas paralelas , a janela Tarefas paralelas e a janela Observação paralela . Para obter mais informações, consulte Guia passo a passo: Depuração de uma aplicação paralela e Como utilizar a janela de observação paralela.

Perfilagem

As ferramentas de criação de perfil fornecem três exibições de dados que exibem informações gráficas, tabulares e numéricas sobre como um aplicativo multi-threaded interage consigo mesmo e com outros programas. As visualizações permitem-lhe identificar rapidamente áreas de preocupação e navegar desde pontos nos monitores gráficos até pilhas de chamadas, locais de chamadas e código-fonte. Para mais informações, consulte Visualizador de Concorrência.

Rastreamento de eventos

O Tempo de Execução de Simultaneidade usa o Rastreamento de Eventos para Windows (ETW) para notificar ferramentas de instrumentação, como criadores de perfil, quando vários eventos ocorrem. Esses eventos incluem quando um agendador é ativado ou desativado, quando um contexto começa, termina, bloqueia, desbloqueia ou produz e quando um algoritmo paralelo começa ou termina.

Ferramentas como o Visualizador de Simultaneidade utilizam essa funcionalidade; portanto, normalmente não é necessário trabalhar diretamente com esses eventos. No entanto, esses eventos são úteis quando você está desenvolvendo um criador de perfil personalizado ou quando usa ferramentas de rastreamento de eventos, como o Kit de Ferramentas de Desempenho do Windows.

O Concurrency Runtime gera esses eventos somente quando o rastreamento está habilitado. Chame a função concurrency::EnableTracing para habilitar o rastreamento de eventos e a função concurrency::D isableTracing para desabilitar o rastreamento.

A tabela a seguir descreve os eventos que o tempo de execução gera quando o rastreamento de eventos está habilitado:

Evento Descrição Valor
simultaneidade::ConcRT_ProviderGuid O identificador do provedor ETW para o Concurrency Runtime. f7b697a3-4db5-4d3b-be71-c4d284e6592f
concorrência::ContextEventGuid Marca eventos relacionados a contextos. 5727a00f-50be-4519-8256-f7699871fecb
simultaneidade::P PLParallelForEventGuid Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_for. 31c8da6b-6165-4042-8b92-949e315f4d84
simultaneidade::PPLParallelForeachEventGuid Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_for_each. 5cb7d785-9d66-465d-bae1-4611061b5434
simultaneidade::P PLParallelInvokeEventGuid Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_invoke. d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concorrência::SchedulerEventGuid Marca eventos relacionados ao Agendador de Tarefas. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concorrência::VirtualProcessorEventGuid Marca eventos relacionados a processadores virtuais. 2f27805f-1676-4ecc-96fa-7eb09d44302f

O Concurrency Runtime define, mas não gera atualmente, os seguintes eventos. O tempo de execução reserva estes eventos para uso futuro:

A enumeração concurrency::ConcRT_EventType especifica as operações possíveis que um evento rastreia. Por exemplo, na entrada do algoritmo, o tempo de execução parallel_for gera o evento PPLParallelForEventGuid e fornece CONCRT_EVENT_START como a operação. Antes que o parallel_for algoritmo retorne, o tempo de execução novamente gera o PPLParallelForEventGuid evento e fornece CONCRT_EVENT_END como a operação.

O exemplo a seguir ilustra como habilitar o rastreamento de uma chamada para parallel_for. O tempo de execução não rastreia a primeira chamada para parallel_for porque o rastreamento não está habilitado. A chamada para EnableTracing permite que o tempo de execução rastreie a segunda chamada para 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();
}

O tempo de execução controla o número de vezes que você chama EnableTracing e DisableTracing. Portanto, se você ligar EnableTracing várias vezes, você deve ligar DisableTracing o mesmo número de vezes para desativar o rastreamento.

Ver também

Runtime de Concorrência