并行诊断工具(并发运行时)

更新:2010 年 6 月

Microsoft Visual Studio 2010 为调试和分析多线程应用程序提供了广泛的支持。

调试

Visual Studio 调试器中添加了新的**“并行堆栈”窗口和“并行任务”**窗口。 有关更多信息,请参见演练:调试并行应用程序

分析

Visual Studio Team Developer Edition 分析工具 提供三种数据视图,用于显示有关多线程应用程序如何与自身和其他程序交互的图形、表格和数字信息。 利用这些视图,可以快速标识关注区域,并从图形显示上的点导航到调用堆栈、调用站点和源代码。 有关更多信息,请参见并发可视化工具

事件跟踪

在发生各种事件时,并发运行时会使用 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 相同的次数才能禁用跟踪。

请参见

概念

并发运行时

修订记录

日期

修订记录

原因

2010 年 6 月

添加了有关事件跟踪的信息。

信息补充。