共用方式為


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

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

偵錯

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

分析

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

事件追蹤

並行執行階段使用 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,以便停用追蹤。

請參閱

概念

並行執行階段