startTraceA 函数 (evntrace.h)
StartTrace 函数注册并启动事件跟踪会话。
重要
跨进程事件跟踪会话是一种有限的系统资源。 开发人员应避免在客户计算机上启动事件跟踪会话。 需要事件跟踪会话时,应将其限制为尽可能小的范围:尽可能少使用会话,尽可能使用进程内会话 (EVENT_TRACE_PRIVATE_LOGGER_MODE | EVENT_TRACE_PRIVATE_IN_PROC
) ,仅在方案需要收集时才启动跟踪,方案完成后立即停止跟踪,限制会话使用的内存量, 和 使用严格的事件筛选器,这样就不会收集不必要的事件。
语法
ULONG WMIAPI StartTraceA(
CONTROLTRACE_ID *TraceId,
[in] LPCSTR InstanceName,
[in, out] PEVENT_TRACE_PROPERTIES Properties
);
参数
TraceId
[in] InstanceName
以 Null 结尾的字符串,其中包含事件跟踪会话的名称。 会话名称限制为 1,024 个字符,不区分大小写,并且必须是唯一的。
重要
为会话使用描述性名称,以便可以从会话名称确定会话的所有权和使用情况。 请勿使用 GUID 或其他非确定性或非描述性值。 不要追加随机数字以使会话名称唯一。 ETW 会话是有限的资源,因此组件不应启动多个会话。 如果组件启动时组件会话已在运行,则组件应清理孤立会话,而不是创建第二个会话。
此函数将你提供的会话名称复制到 Properties 的 LoggerNameOffset 成员指向的偏移量。
[in, out] Properties
指向指定会话行为的 EVENT_TRACE_PROPERTIES 结构的指针。 以下是要设置的结构的关键成员:
- Wnode.BufferSize
- Wnode.Guid
- Wnode.ClientContext
- Wnode.Flags
- LogFileMode
- LogFileNameOffset
- LoggerNameOffset
根据选择创建的日志文件的类型,可能还需要为 MaximumFileSize 指定一个值。 有关设置 Properties 参数和会话行为的详细信息,请参阅“备注”部分。
从 Windows 10 版本 1703 开始: 为了在跨进程方案中获得更好的性能,现在可以在启动系统范围的专用记录器时将筛选传递到 StartTrace 。 需要传入新的 EVENT_TRACE_PROPERTIES_V2 结构,以包含筛选信息。 有关更多详细信息,请参阅 配置和启动专用记录器会话 。
返回值
如果函数成功,则返回值为 ERROR_SUCCESS。
如果函数失败,则返回值为 系统错误代码之一。 下面是一些常见错误及其原因。
ERROR_BAD_LENGTH
下列情况之一存在:
- Properties 的 Wnode.BufferSize 成员指定的大小不正确。
- 属性 分配的空间不足,无法保存 InstanceName 的副本。
ERROR_INVALID_PARAMETER
下列情况之一存在:
- 属性 为 NULL。
- TraceHandle 为 NULL。
- Properties 的 LogFileNameOffset 成员无效。
- Properties 的 LoggerNameOffset 成员无效。
- Properties 的 LogFileMode 成员指定无效标志的组合。
- Wnode.Guid 成员为 SystemTraceControlGuid,但 InstanceName 参数未KERNEL_LOGGER_NAME。
ERROR_ALREADY_EXISTS
同名或 GUID 的会话已在运行。
ERROR_BAD_PATHNAME
由于以下原因之一,可能会收到此错误:
- 另一个会话已在使用由 Properties 结构的 LogFileNameOffset 成员指定的文件名。
- LogFileMode 和 LogFileNameOffset 均为零。
ERROR_DISK_FULL
驱动器上没有足够的可用空间来容纳日志文件。 在以下情况中,会发生此情况:
- MaximumFileSize 为非零值,并且没有可用于日志文件的 MaximumFileSize 字节
- 驱动器是系统驱动器,没有额外的 200 MB 可用
- MaximumFileSize 为零,没有额外的 200 MB 可用
选择具有更多空间的驱动器,或减小 MaximumFileSize (中指定的大小(如果) )。
ERROR_ACCESS_DENIED
只有具有管理权限的用户、性能日志用户组中的用户以及作为 LocalSystem、LocalService、NetworkService 运行的服务才能控制事件跟踪会话。 若要授予受限用户控制跟踪会话的能力,请将其添加到“性能日志用户”组。 只有具有管理权限和以 LocalSystem 身份运行的服务的用户才能控制 NT 内核记录器会话。
如果用户是性能日志用户组的成员,则他们可能无权在指定文件夹中创建日志文件。
ERROR_NO_SYSTEM_RESOURCES
下列情况之一存在:
日志记录会话使用 EVENT_TRACE_SYSTEM_LOGGER_MODE 标志,系统记录器的最大数目 (已达到 8) 。
已达到系统上日志记录会话的最大数目。 在停止日志记录会话之前,无法创建新的记录器。 在大多数系统上,日志记录会话的最大数目为 64。
可以通过编辑 处
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI@EtwMaxLoggers
的REG_DWORD键来更改系统的最大日志记录会话数。 允许的值为 32 到 256(包括 32 到 256)。 需要重新启动才能使任何更改生效。请注意,记录器使用系统资源。 如果填充了这些槽,增加系统上的记录器数量将降低性能成本。 存在此限制以防止过度使用系统资源。
重要
只能由系统管理员手动调整限制以启用特定方案。 程序或驱动程序不得自动修改 EtwMaxLoggers 设置。
在 Windows 10 版本 1709 之前,对于非专用记录器,这是固定的 64 个记录器上限。
注解
事件跟踪控制器调用此函数。
会话保持活动状态,直到会话停止、计算机重启、发生 I/O 错误或达到非循环日志的最大文件大小为止。 若要停止事件跟踪会话,请调用 ControlTrace 函数并将 ControlCode 参数设置为 EVENT_TRACE_CONTROL_STOP。
不能使用) 指定的 Properties.Wnode.Guid
相同会话 GUID (启动多个会话。 在大多数情况下,将设置为 Properties.Wnode.Guid
全零 (即 GUID_NULL) ,以允许 ETW 系统为会话生成新的 GUID。
若要指定专用记录器会话,请将“属性”的 Wnode.Guid 成员设置为提供程序的控制 GUID,而不是专用记录器会话的控件 GUID。 在调用 StartTrace 之前,提供程序必须已注册 GUID。
请勿使用此函数启动全局记录器会话, (弃用) 。 有关启动全局记录器会话的详细信息,请参阅 配置和启动全局记录器会话。
系统记录器
要使记录器成为系统记录器并从 SystemTraceProvider 或其他 系统提供程序接收事件,必须满足以下任何条件:
- Properties 成员 LogFileMode 包含首选) (EVENT_TRACE_SYSTEM_LOGGER_MODE标志。
- 属性成员 Wnode.Guid 设置为 SystemTraceControlGuid 或 GlobalLoggerGuid (已弃用 - 不应用于新代码,因为它将与尝试) 使用这些 GUID 的其他组件冲突。
- InstanceName 设置为 KERNEL_LOGGER_NAME (已弃用 - 不应用于新代码,因为它将与尝试) 使用此名称的其他组件冲突。
注意
系统记录器必须设置 EVENT_TRACE_PROPERTIES 结构的 EnableFlags 成员,以指示应在跟踪中包含哪些 SystemTraceProvider 事件。
由于系统记录器接收特殊的内核事件,因此它们受到其他限制:
- 同一系统上的活动系统记录器不能超过 8 个。
- 无法在 Windows Server 容器中创建系统记录器。
- 系统记录器不能使用 EVENT_TRACE_USE_PAGED_MEMORY 标志。
- 在 Windows 10 版本 1703 之前,任何系统记录器都可以同时使用不超过 2 种不同的时钟类型。 例如,如果一个活动系统记录器使用“CPU 周期计数器”时钟类型,而另一个活动系统记录器使用“查询性能计数器”时钟类型,则任何使用“系统时间”时钟类型启动系统记录器的尝试都将失败,因为它需要激活第三个时钟类型。 由于此限制,Microsoft 强烈建议系统记录器不要使用“系统时间”时钟类型。
- 从 Windows 10 版本 1703 开始,时钟类型限制已删除。 系统记录器现在可以同时使用这三种时钟类型。
若要指定 NT 内核记录器会话 (弃用) ,请将 InstanceName 设置为 KERNEL_LOGGER_NAME,将 Properties 的 Wnode.Guid 成员设置为 SystemTraceControlGuid。 如果未将 GUID 指定为 SystemTraceControlGuid,ETW 将替代 GUID 值并将其设置为 SystemTraceControlGuid。
示例
有关使用 StartTrace 的示例,请参阅 配置和启动事件跟踪会话。
注意
evntrace.h 标头将 StartTrace 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | evntrace.h |
Library | Windows 8.1 和 Windows Server 2012 R2 上的 Sechost.lib;Windows 8、Windows Server 2012、Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista 上的 Advapi32.lib |
DLL | Windows 8.1 和 Windows Server 2012 R2 上的 Sechost.dll;Windows 8、Windows Server 2012、Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista 上的 Advapi32.dll |