分享方式:


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

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

偵錯

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

分析

分析工具提供三個數據檢視,可顯示多執行緒應用程式如何與其他程式互動的圖形化、表格式和數值資訊。 檢視可讓您快速識別關注的區域,以及從圖形顯示上的點巡覽至呼叫堆疊、呼叫網站和原始程式碼。 如需詳細資訊,請參閱並行視覺化檢視

事件追蹤

並行執行時間會使用 Windows 事件追蹤 (ETW) 在發生各種事件時通知偵查工具,例如分析工具。 這些事件包括啟動或停用排程器、當內容開始、結束、區塊、解除封鎖或產生,以及平行演算法開始或結束時。

並行視覺化檢視 之類的 工具會利用這項功能;因此,您通常不需要直接使用這些事件。 不過,當您開發自訂分析工具或使用 Windows Performance Toolkit 之類的 事件追蹤工具時,這些事件很有用。

只有在啟用追蹤時,並行執行時間才會引發這些事件。 呼叫 concurrency::EnableTracing 函式以啟用事件追蹤,並 呼叫 concurrency::D isableTracing 函式來停用追蹤。

下表描述啟用事件追蹤時執行時間引發的事件:

事件 描述
concurrency::ConcRT_ProviderGuid 並行執行時間的 ETW 提供者識別碼。 f7b697a3-4db5-4d3b-be71-c4d284e6592f
concurrency::CoNtextEventGuid 標記與內容相關的事件。 5727a00f-50be-4519-8256-f7699871fecb
concurrency::P PLParallelForEventGuid 標記進入和結束,以呼叫 concurrency::p arallel_for 演算法。 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency::P PLParallelForeachEventGuid 標記進入和結束,以呼叫 concurrency::p arallel_for_each 演算法。 5cb7d785-9d66-465d-bae1-4611061b5434
concurrency::P PLParallelInvokeEventGuid 標記進入和結束,以呼叫 concurrency::p arallel_invoke 演算法。 d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concurrency::SchedulerEventGuid 標記與 工作排程器 相關的事件。 e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concurrency::VirtualProcessorEventGuid 標記與虛擬處理器相關的事件。 2f27805f-1676-4ecc-96fa-7eb09d44302f

並行執行時間會定義下列事件,但目前不會引發。 執行時間會保留這些事件以供日後使用:

並行 ::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 相同的次數,才能停用追蹤。

另請參閱

並行執行階段