平行診斷工具 (並行執行階段)
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();
}
運行時間會追蹤您呼叫 EnableTracing
和 DisableTracing
的次數。 因此,如果您多次呼叫 EnableTracing
,則必須呼叫 DisableTracing
相同的次數,才能停用追蹤。