共用方式為


平行診斷工具 (並行執行階段)

Visual Studio 可更廣泛地支援多執行緒應用程式的偵錯和分析。

偵錯

Visual Studio 偵錯工具包括 [平行堆疊] 視窗、 [平行工作] 視窗和 [平行監看式] 視窗。 如需詳細資訊,請參閱逐步解說:偵錯平行應用程式如何:使用平行監看式視窗

程式碼剖析

程式碼剖析工具提供了三種資料檢視,可透過圖形、表格與數值的形式,顯示多執行緒應用程式如何與其本身和其他程式互動的相關資訊。 這些檢視可讓您快速找出您所需的區域,以及從圖形顯示上的點巡覽至呼叫堆疊、呼叫位置與原始程式碼。 如需詳細資訊,請參閱並行視覺化檢視

事件追蹤

並行執行階段使用 Windows 事件追蹤 (ETW),在發生各種事件時通知檢測工具,例如分析工具。 這些事件包含當排程器啟動或停用時,當內容開始、結束、封鎖、解除封鎖或讓渡時,以及當平行演算法開始或結束時。

並行視覺化檢視等工具會利用此功能,因此,您通常不必直接使用這些事件。 不過,當您開發自訂分析工具,或使用 Xperf (英文) 等事件追蹤工具時,這些事件很實用。

並行執行階段只在啟用追蹤時引發這些事件。 呼叫 concurrency::EnableTracing 函式啟用事件追蹤,呼叫 concurrency::DisableTracing 函式停用事件追蹤。

下表說明啟用事件追蹤時執行階段引發的事件:

事件

說明

concurrency::ConcRT_ProviderGuid

並行執行階段的 ETW 提供者識別碼。

f7b697a3-4db5-4d3b-be71-c4d284e6592f

concurrency::ContextEventGuid

標記與內容相關的事件。

5727a00f-50be-4519-8256-f7699871fecb

concurrency::PPLParallelForEventGuid

標記 concurrency::parallel_for 演算法呼叫的進入和離開。

31c8da6b-6165-4042-8b92-949e315f4d84

concurrency::PPLParallelForeachEventGuid

標記 concurrency::parallel_for_each 演算法呼叫的進入和離開。

5cb7d785-9d66-465d-bae1-4611061b5434

concurrency::PPLParallelInvokeEventGuid

標記 concurrency::parallel_invoke 演算法呼叫的進入和離開。

d1b5b133-ec3d-49f4-98a3-464d1a9e4682

concurrency::SchedulerEventGuid

標記與工作排程器相關的事件。

e2091f8a-1e0a-4731-84a2-0dd57c8a5261

concurrency::VirtualProcessorEventGuid

標記與虛擬處理器相關的事件。

2f27805f-1676-4ecc-96fa-7eb09d44302f

並行執行階段定義了 (但目前不引發) 下列事件。 執行階段保留這些事件供未來使用:

concurrency::ConcRT_EventType 列舉指定事件追蹤的可能作業。 例如,在進入 parallel_for 演算法時,執行階段會引發 PPLParallelForEventGuid 事件並提供 CONCRT_EVENT_START 做為作業。 在 parallel_for 演算法傳回之前,執行階段會再次引發 PPLParallelForEventGuid 事件並提供 CONCRT_EVENT_END 做為作業。

下列範例會說明如何針對 parallel_for 的呼叫啟用追蹤。 執行階段不會追蹤 parallel_for 的第一個呼叫,因為未啟用追蹤。 呼叫 EnableTracing 可讓執行階段追蹤 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();
}

執行階段會追蹤您呼叫 EnableTracingDisableTracing 的次數。 因此,如果您呼叫 EnableTracing 多次,則必須呼叫相同次數的 DisableTracing,以便停用追蹤。

請參閱

概念

並行執行階段