下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用ETW改善调试和性能优化作者:史莱姆发表于2010-07-02 01 : 11原文链接阅读:1评论:0事件跟踪使用ETW攵善调试和性能优化 Dr.Insung Park and Ricky Buch本文讨论:了解ETV#系2构Windows Vista中ETW勺新功能使用事件提供程序API 进行编程本文使用了以下技术: Windows Vista目录Windows事件跟踪统一的事件提供程序模型和 API设计和实现指南工 具和支持总结目前的软件系统变得日益庞大和复杂,软件的开发和管理随之成 为一项艰巨的挑战。几乎不可能对所有执行状态做出说明,应用程序所表现的 行为也经常出乎开发者的意料之外。
2、止匕外,大量硬件组合和工作负载特征的不 断变化也增加了各种软件故障诊断的难度。因此,可靠性和可管理性本身成为 重要功能也就不足为奇了。而正是这些功能催生了对检测的需求。在软件执行 过程中,针对某些关键的错误状态添加的智能检测手段可以极大地缩短故障的 调试时间。在其他某些方面,检测也是非常实用的。在托管的企业环境中,必 须对大量计算机的软硬件故障和资源数量偏低等不良情况进行监视并采取措施。 此外,检测还非常有助于解决性能问题,因为性能问题对于外部的工作负载、 配置参数以及底层硬件和软件状态十分敏感,所以诊断起来比较困难。当性能 有所下降时,开发人员和管理员能够根据实际工作环境的跟踪结果确定性能不
3、 佳的组件或服务,或者发现开发阶段未预见到的瓶颈。最后, IT专家可以使用 各种管理工具从事务跟踪中得出资源使用率的统计数据,以用于容量规划和趋 势分析。Windows跟踪(ETW)是操作系统提供的一个高速通用的跟踪工具。 ETW吏用内核中实现的缓冲和日志记录机制,提供对用户模式应用程序和内核 模式设备驱动程序引发的事件的跟踪机制。止匕外,ETW更您能够动态地启用和禁用日志记录,轻松地在实际生产环境下进行详细跟踪,而无需重新启动系统 或重新启动应用程序。日志记录机制使用每处理器的缓冲区,由异步写线程将 这些缓冲区写入磁盘。这样,大型服务器应用程序在写入事件时所受的干扰能 够降至最小。最初引入
4、ETW勺操作系统是 Windows 2000。自此开始,各种核心的操作系统和服务器组件开始纷纷采用 ETW寸其活动进行才测。现在,ETWE 成为Windows平台中的主要检测技术之一。越来越多的第三方应用程序也开始 采用ETW4行检测,有些则利用 Windows自身提供的事件。ETW5被提取到 Windows预处理器(WPP耿件跟踪技术中,为跟踪"printf" 样式的消息提供了一 组简单易用的宏,以便用于开发过程中的调试。在 Windows Vista上,ETVWc 生了改头换面的变化,其中最重大的变化之一就是引入了统一的事件提供程序 模型和API。简而言之,新的统一 A
5、PI对跟踪结果进行日志记录并将结果写至 事件查看器,为事件提供程序提供了一种一致的、简单易用的机制。同时,还 添加了一些用于改善开发人员和用户体验的新功能。在本文中,我们将介绍新 的ETW是供程序模型,并为大家讲解开发人员应如何在基于Windows Vista的应用程序中采用这一新模型。首先要对 ETW本系结构和使用模型进行概述,然 后再讲解新的事件模型和 API。接下来对事件检测的设计和实现进行简要介绍, 最后再了解用于控制ETW会话、处理所记录事件并分析这些事件以生成更高一 级报告的随机工具。Windows事件跟踪ETW勺核心体系结构如图1所示。如图所示,ETW主要包 含四种类型的组件:事
6、件提供程序、控制器、使用者和事件跟踪会话。事件跟 踪会话中会发生缓冲和日志记录,此会话用于接受事件并创建一个跟踪文件。 ETW会话可以使用多种日志记录模式。例如,可以对会话进行配置,直接向使 用者应用程序传送事件,或在文件达到特定大小时通过回绕在某个文件中重写 旧事件。为每个会话创建的单独写线程会将这些事件刷新到文件或实时使用者 应用程序中。要实现高性能,可以使用每服务器的缓冲区,这样无需在日志记 录路径中设置锁定。图1 ETW体系结构(单击该图像获得较大视图)事件提供程序指的是一种可 以将事件写入ETW会话的逻辑实体。任何可记录的重要活动均可作为事件,每 个活动由记录到ETW卡的一个事件表示
7、。事件提供程序可以是用户模式应用程 序、托管应用程序、驱动程序或任何其他软件实体。唯一的要求是,事件提供 程序必须通过注册API向ETW主册一个提供程序ID。提供程序首先向ETW主册, 然后调用ETWH志记录API写入来自代码内多个点的事件。当 ETW空制器应用 程序动态启用提供程序时,对日志记录 API的调用将事件发送给控制器指定的 特定跟踪会话。事件提供程序发送给跟踪会话的每个事件由一个包含事件元数 据和其他可变用户上下文数据的固定标头构成。由于很多操作系统组件中事件检测的不断增多,因此就连为 Windows Vista设计的一个简单程序也将包含多 个事件提供程序作为组件。当事件被记录到会
8、话时,除用户提供的数据外,ETW还会添加一些额外的数据项。其中包括时间戳、进程和线程ID、处理器编号和日志记录线程的CPUS用率数据。这些数据项被记录在 ETW募件标头中,并连 同提供程序提供的可变事件内容一起传递给事件使用者。很多跟踪使用者发现, 这些数据字段对于他们的分析必不可少。控制器可以启动和停止ETW会话,并为会话启用提供程序。在调试和诊断等情况下,可以根据需要调用控制器工具 以收集深度跟踪。相反地,对于那些始终需要传递给事件查看器的事件,例如 针对管理员的事件(稍后会给出定义),事件日志记录服务会在事件注册时自动 启用提供程序。在 Windows Vista中,控制器必须具有ETW
9、权限以控制会话。默认情况下只有一小部分有特权的用户才被授予该权限。最后,使用者指的是 用于读取日志文件或侦听会话以获取实时事件并对其进行处理的一类应用程序o 事件的使用基于回调,使用者注册一个事件回调,以供ETW每次使用一个事件进行调用。事件是按照时间顺序传送给ETW吏用者的。可以使用通用事件使用者工具将事件转储为各种格式。图 2显示了 "Process”事件的XML转储。该事件 在由Windows Vista中的tracerpt.exe 工具生成时,由内核提供程序记录。止匕 事件用于表示记事本进程的启动。由于事件包含了提供程序记录的自定义用户 内容,因此需要使用某些类型的元数据对其
10、进行正确解码。使用新 API的提供 程序应该会提供一份事件清单(一个XML±件),其中定义了提供程序写入的所 有事件和它们的布局信息。通用使用者应用程序使用Trace DataHelper(TDH)API来检索事件的元数据,对事件进行解码并加以显示。Figure 2进程启动事件的XML专储Event xmlns="System Provider Guid="9e814aad-3204-11d2-9a82-006008a86939”/EventID 0/EventID Version 2/Version Level 0/Level Task0/Task Opcode
11、 1/Opcode Keywords 0x0/Keywords TimeCreated SystemTime="2006-12-18T12: 26: 27.887309500 Z"/Correlation ActivityID="00000000-0000-0000-0000-000000000000”/Execution ProcessID="3396"ThreadID="3260"ProcessorID="0"KernelTime="390"UserTim e="195&
12、quot;/Channel/Computer/System EventData Data Name="UniqueProcessKey"0xFFFFFA 800143FA80/Data Data Name="ProcessId"0x10EC/Data Data Name="ParentId"0xD44/Data DataName="SessionId"1/Data Data Name="ExitStatus"0/Data DataName="UserSID"guest/Dat
13、a Data Name="ImageFileName"notepad.exe/Data Data Name="CommandLine"notepad/Data/EventDat aRenderingInfo Culture="en-US"Opcode Start/Opcode Provider MSNT_SystemTrace/Provider EventName xmlns="Process/EventName/RenderingInfo ExtendedTracingInfo xmlns="EventGuid3
14、d6fa8d0-fe05-11d0-9dda-00c04fd7ba7c/EventGuid/ExtendedTracingInfo/Event多数情况下,跟踪意味着收集来自所关注的特定提供程序的事件。按照这种思路,事件跟踪会话要 与一个或多个提供程序组成的概念上作为整体的一个集合建立关联,而会话本 身(日志记录引擎)通常被忽略。ETV#系结构考虑到更加动态和灵活地进行跟 踪和管理事件。这里的会话与提供程序存在于不同的空间内。控制器用于启动 和停止ETW会话,并为会话动态地启用提供程序。因此,控制器可以选择为一 个会话启用一组提供程序,稍后禁用其中一些提供程序,稍后再为该会话启用 另一提供程序。
15、会话运行于内核之中,不与提供程序建立静态关联。同样,提 供程序通常也不知道自己的事件被记录到哪些会话中。有很多应用程序和服务 同时作为提供程序、控制器和使用者。提供程序、控制器和使用者的所有操作 都提供API,而且应用程序可能会承担任何角色组合。但在通常情况下,开发 人员仅实现事件提供程序,并使用附带工具来收集和查看跟踪。提供程序与跟 踪会话相分离这种做法的好处之一在于,应用程序的故障(发生崩溃或挂起)不会对跟踪造成影响。在发生崩溃前,如果提供程序所记录的事件尚未写入跟踪 文件,则这些事件将存储在内核内存中,这对于调试应用程序异常尤其有用。正如签名提到的,开发人员、IT管理员和管理工具开发人员
16、会使用事件进行调 试、监控、诊断和容量规划。常用的基于事件的分析方法可以分为下列几类。扫描用户对事件转储进行扫描,从中找到单一的重要事件或一小组已知事件。 通常在使用事件调试对应于最终用户问题的故障案例时,或在事件日志中搜索 重大故障时,会使用此方法。Delta分析由于ETW仔捕获每个事件的时间戳和 CPU®用率,因此进行诸如下列形式的简单Delta分析时Property(Event B)-Property(Event A)需要考虑到应用程序活动的响应时间和CPU使用率的统计数据。如果两个事件分别标记了一个活动的起点和终点, 就可以采取这种方式处理从实际工作模式的应用程序收集来的大量
17、事件,以生 成有关响应时间和CPUS用率统计数据的摘要。统计分析有时,仅对特定事件的数量进行计数可以使我们对软件行为有更深入的了解。状态机和资源跟踪拥 有足够的事件,就可以构造状态机,从而可以进行基于跟踪的模拟。例如,由 于核心操作系统的大部分活动是使用 ETW事件进行检测的,因此可使用操作系 统跟踪构建状态机,以跟踪计划程序、内存和 I/O活动等。统一的事件提供程序模型和 API在Windows Vista中,我们引入了一组新 的事件提供程序API,不仅更易于使用,而且可提供更多功能和增强的安全选 项。新的API还可用于向事件查看器写入事件,并将跟踪与事件日志结合成一 个一致的API集。本部
18、分将为您更加详细地介绍这些 API和模型。如果有需要, 还会介绍新API与现有API的不同之处。软件组件要想成为 ETW提供程序,需 要通过 EventRegister API 向 ETWft册。EventRegister 需要一个名为 ProviderID的GUID用于唯一地标识提供程序。任何软件实体 (应用程序、共 享的DLL或驱动程序)都可以注册为提供程序,因为提供程序不必绑定到任何操 作系统实体。注册过程通常在组件的入口点完成,例如一个DLL附加例程或一个驱动程序入口点。返回的注册句柄用于接下来的日志记录API调用。最后,在提供程序执行结束后会调用 EventUnregister。利用
19、现有的提供程序 API,提 供程序必须提供回调以启用/禁用通知。也就是说,如果控制器启用了提供程序, 则要用启用设置来调用已注册的回调函数。该回调函数的参数之一是启用提供 程序的会话的句柄。一旦收到启用回调,提供程序会设置一个全局变量(例如TracingOn)以表明跟踪处于开启还是关闭状态,并存储会话句柄。随后,提供 程序将从回调函数获得的会话句柄用于日志记录API调用(按条件基于TracingOn的值)。在新的ETW提供程序*g型中,ETW可以代表提供程序记住启 用设置。换句话说,提供程序不必检查其当前是否已启用即可注册和调用日志 记录调用。在日志记录 API内部,ETW仔快速查看启用设置,
20、仅当其已启用时 才将事件发送给会话。如果它们未启用,则会放弃日志记录调用。因此,在新 的模型中,启用/禁用回调是可选的。但在某些情况下,仍然需要启用回调。例 如,针对状态机构造的检测在跟踪开始和结束时通常需要快照或状态断开事件。 日志记录API,即EventWrite采用注册句柄(与旧模型中的会话句柄相对)。在 日志记录调用中使用注册句柄使启用设置对于提供程序来说是透明的。由于日 志记录所用句柄是新模型中的不透明句柄,因此ETW够对事件进行多播。也就是说,提供程序能够为多个 ETW会话启用,这在旧模型中是无法实现的,后 者使用会话句柄。ETWg供单独的 API(EventEnabled 和 E
21、ventProviderEnabled)用于测试是否启用了提供程序。虽然日志记录API在写入事件前已经检查了启用设置,但有时提供程序可能需要在启用跟踪时进行其他工作。收集和构造对 于程序执行来说不是必需的信息事件数据,就属于这种情况。如果有需要,提 供程序可以随时借助这些 API查明跟踪是否已启用。正如前面提到的,用户可 以向每个事件添加可变的上下文数据。日志记录API使用一种分散/收集机制选择特定于事件的数据项。调用方通过构造数据描述符数组传入额外的事件数据 项。数据描述符是一种带有指针和大小字段的结构。因此,用户会为要记录的 每个数据项添加一个数据描述符。我们可以使用宏EventDataD
22、escCreate轻松地构造数据描述符。然后,ETW住在日志记录期间将用户提供的内容复制到其 会话缓冲区。在相应的事件清单中,应通过 Template标记来指定事件的布局。 模板描述了每个事件包含的由用户指定的上下文数据。模板可以定义布局,布 局内可包含单独的数据字段,例如整数和字符串;也可包含复杂的数据结构, 例如结构数组。并非所有的事件都需要模板;如果未指定模板,则认为此事件 不包含用户提供的数据。在清单中,多个事件可以共享一个模板,例如 Start 和Stop事件就具有相同的上下文信息。当使用者应用程序遇到一个事件时,会 通过TDH API定位一个事件模板,并相应地对可变事件数据进行解码
23、。使用旧 API 的提供程序通过 Windows Management Instrumentation(WMI)托管对象格式 (MOF提供布局信息。图3中包含了使用新的事件 API进行注册和日志记录的提 供程序代码示例。这是一个用户模式提供程序,使用用户模式提供程序API,但是也可以使用相应的一组内核模式提供程序API。图3中的第一个事件写入两个用户提供的数据项。其中一个类型为ULONG另一个为以NULLM尾的WCHARP符串。通过调用 EventDataDescCreate来构造合适的数据描述符数组。 除了此处显示的EventWrite API ,另外还有两个日志记录 API: EventW
24、riteString 和 EventWriteTransfer 。 EventWriteString 允许对未列入 清单的字符串进行简单的日志记录。在调用EventWriteString 时,ETW对标头进行标记,表明事件数据是以 NUL目尾的单一 WCHA京符串。如果使用者在 标头内发现此标记,则将用户数据作为字符串进行处理,而不必通过TDH®索事件架构。使用EventWriteString ,不必修改清单即可快速记录字符串。Figure 3ETW提供程序#include myevents.h/Header generated from manifest./ContainsMyPr
25、oviderId and event descriptors.REGHANDLE MyProvRegHandle ; ULONGMylnteger ; PWCHAR MyString ULONG MyStringLength; EVENT_DATA_DESCRIPTOR DataDescriptor2 ./Register the ETW provider.Status=EventRegister(&MyProviderId,ProviderId(GUID)NULL, Optional Callback NULL,/OPtioanl Callback Context&MyPro
26、vRegHandle) ; /Registration Handle./Construct DataDescriptor and write an event with/MyInteger and MyString.EventDataDescCreate(&DataDescriptor0,/DataDescriptor&MyIn teger,/Pointer to the data sizeof(ULONG) ; /Size of data EventDataDescCreate(&DataDescriptor1,&MyString,MyStringLength
27、) ; Status=EventWrite(MyProvRegHandle,/Registration Handle MyEventDescriptor1,/EventDescriptor 2,/DataDescriptor array size DataDescriptor) ; /DataDescriptor array./Write another event with no user data.if(EventEnabled(MyProvRegHandle,MyEventDescriptor2)/Do extra work if enabled and write event.Stat
28、us=EventWrite(MyProvRegHandle,MyEventDescriptor2,0,NULL) ; ./Unregister the ETW provider.Status=EventUnregister(MyProvRegHandle) ; EventWriteTransfer API和EventActivityIdControl API是为了满足端到端跟踪检测需要而设计的。如前所述,端到端跟踪是一种针对同时为大量用户请求执行不同活动的服务器 应用程序的检测方法。例如,网页上的脚本执行请求将从客户端计算机转移到 服务器的网络层。随后,该请求会经过HTTP驱动程序、IIS、A
29、SP.NE书|擎,可能还包括另一台计算机上的 Exchange Server。端到端跟踪的目的是通过 ETW 事件记录与此请求相关的所有活动,以便稍后进行调试和性能分析。这需要可 以标识单个请求的唯一 ID。在使用期间,可以在该唯一活动ID的帮助下进行 关联。ETW再过在每个事件中引入 ActivityId来满足这一需要。使用新 API记录的每个事件会自动选择存储在执行线程内的当前活动ID。活动ID显示在XML转储的System部分的Correlation ActivityId标记内。提供程序可以为使用EventActivityIdControl API的执行线程获取、设置和创建活动ID。该活
30、动ID可以与请求一起在多个组件之间传输。遗憾的是,由于公共协议和设计等方 面的限制,有时我们无法传播该活动ID。EventWriteTransfer API可以编写传输事件,以表示活动ID的传输。除了使用EventWrite的所有参数外, EventWriteTransfer 还使用另外两个参数,它们是 ActivityId 和RelatedActivityld 。每个事件均标记有提供程序ID,并被分配了名为事件描 述符的实体。事件描述符定义了标准事件信息,并为其提供了进一步的标识和 语义。开发人员在检测设计阶段确定检测点的事件描述符,并将相应的项写入 事件清单。然后,开发环境中的消息编译器从
31、给定的事件清单在头文件中生成 事件描述符,该描述符随后被放入并用于源文件。从编程的角度看,事件说明 符是一种包含下列字段的结构:Id、Version、Channel Level、Opcode Task 和 Keywords:typedef struct _EVENT_DESCRIPTORUSHORT Id UCHAR Version; UCHAR Channel; UCHAR Level UCHAR Opcode USHORT Task ULONGLONG Keyword; EVENT_DESCRIPTOR,*PEVENT_DESCRJPTOR ID 用于唯一标识提 供程序中的事件。在清单中定
32、义事件时,事件的ID是唯一必需的项。一旦遇到事件,使用者会使用其提供程序ID(GUID)和事件ID(USHOR侬位订单以找到该 事件。同样,某版本提供的事件在稍后版本中可能发生了更改和补充,但会保 留相同的语义和事件ID。因此事件ID和版本与提供程序ID一起可以唯一标识 事件。通道定义了一组针对目标群体的事件。通道分为下列四种类型:管理通 道、操作通道、分析通道和调试通道。进入管理通道的事件是可操作事件;管 理员在收到事件时应该立即知道引起事件的原因和处理方法。进入操作通道的 事件针对的是高级监控工具和支持人员,这些事件可以提供更详细的上下文, 发生频率也要高于管理通道的事件。归入管理和操作通
33、道的事件会自动被发送 给事件日志并显示在事件查看器中。分析通道是为传统跟踪准备的,针对的是 专家级的支持专家或详细的诊断和故障排除工具。调试通道用于调试消息,其 中包含供开发人员使用的事件。分析和调试通道事件默认情况下是未启用的。通过这些通道,使用一组 API可以添加针对不同用途和群体的事件。在启用提 供程序时,控制器可以指定一个级别(单字节整数)和关键字(8字节位掩码)。 级别和关键字用于向ETW佥测添加维度。级别是为了启用基于事件严重程度或 详细程度的过滤功能而设计的。关键字则用于在提供程序中表示子组件。例如, 开发人员可以将事件分为信息事件和严重错误事件。他们也可以将不同的关键 字分配给
34、应用程序的子组件。通过使用不同的级别和关键字有选择地启用过滤 功能,跟踪控制器可以使提供程序仅记录来自子组件B的错误事件,或记录来自子组件A和C的所有事件等等。对于使用旧 API的提供程序,关键字为4个 字节,而且按级别和关键字过滤需要在提供程序代码中显式地完成。值得注意的是,当控制器启用了特定级别时,级别值小于或等于(严重程度相同或更高)控制器指定值的所有事件也将启用。虽然开发人员可以自定义设计级别和关键 字并将其分配给事件,但是仍然提供了预定义的级别,如图 4所示。Figure 4严重程度级别levels level name="winLogAlways"symbol=
35、"WINEVENT_LEVEL_LOG_ALWAYS"value="0"message="$(strin g.level.LogAlways)"Log Always/level level name="win Critical"symbol="WINEVENT_LEVEL_CRITICAL"value="1"message="$(string.l evel.Critical)"Only critical errors/level level name=&q
36、uot;win Error"symbol="WINEVENT_LEVEL_ERROR"value="2"message="$(string.level.E rror)"All errors,includes win : Critical/level level name="win Warning"symbol="WINEVENT_LEVEL_WARNING"value="3"message="$(string.lev el.Warning)"Al
37、l warnings,includes win : Error/level level name="win Informational"symbol="WINEVENT_LEVEL_INFO"value="4"message="$(string. level.Informational)"All informational content,including win Warning/level level name="winVerbose"symbol="WINEVENT_LEVEL_
38、VERBOSE"value="5"message="$(string.lev el.Verbose)"All tracing,including previous levels/level/levels任务和操作码用于向每个事件附加额外的信息。任务用于指定通用逻辑组件或正在检 测的任务。它通常表示组件实现自身功能所要采取的关键的高级步骤。操作码 表示在事件被写入时正在执行的具体操作。例如,Windows内核提供程序将所有的文件I/O操作事件归入一个"FileIO”任务。操作码表示操作的具体内容, 例如Create、Open. Read
39、和Write。与ID、版本、通道、级别和关键字不同, 任务和操作码仅用于添加信息,它们对于控制检测或定位元数据没有任何影响。 事件描述符和布局都在事件清单中指定。开发人员在设计检测时要编写事件清 单。编写事件清单采用的是XML语言,其中在相应的XMLfe记中指定用户定义 的通道、任务、操作码、级别和关键字。也可以使用ETW页定义的通道、级别和操作码;但预定义的通道为全局通道,应仅用于针对管理通道的事件。每个 事件的不同元数据字段组合在一起,并在与事件ID唯一关联的Event标记中进行定义。事件也可以具有消息字符串,当使用者读取该事件时,将用事件数据提供的替代值显示该字符串。图 5显示了一个事件
40、清单示例的XMLt段。稍后 我们将介绍有关事件检测设计和检测的分步指南。Figure 5Event清单片段provider name="Microsoft-Windows-Kernel-Registry"guid="70eb4f03- clde-4f73-a051-33d13d5413bd"symbol="RegistryProvGuid"resourceFileName="%SystemRoot% System32advapi32.dll"messageFileName="%SystemRoot%Sys
41、tem32advapi3 2.dll"channels channel name="Microsoft-Windows-Kernel-Registry/Analytic"chid="RegistryEvents"symbol="REG_Events"type="Analy tic"isolation="System"This channel contains registry events./channel/channels opcodes opcode value="32&
42、quot;name="CreateKey"symbol=""/./opcodes keywords keyword name="CreateKey"symbol=""mask="0x1000"/./keywords templates template tid="tid_RegOpenCreate"data name="BaseObject"inType="win Pointer"outType="win : HexInt64
43、"/data name="KeyObject"inType="win Pointer"outType="win : HexInt64"/data name="Status"inType="win UInt32"outType="win : HexInt32"/data name="Di sposition"inType="win UInt32"/data name="BaseName"inType=&quo
44、t;win : UnicodeString"outType="xs string"/data name="RelativeName"inType="win UnicodeString"outType="xs : string"/template./templates events event value="1"symbol="ETW_REGISTRY_EVENT_CREATE_KEY"template="tid_RegOpenC reate"op
45、code="CreateKey"channel="RegistryEvents"level="win Informational"keywords="CreateKey"message="$(string.Registry.RegOpenC reate)"/./events/provider.localization resources culture="en- US"stringTable string id="Registry.RegOpenCreate&quo
46、t;value="Registry key%6 was created with status%3."/stringTable/resources/localizationMicrosoft.NET Framework 3.5( 代号为"Orcas")中也将提供托管的 ETW是供程 序API。托管的使用者和控制器API目前正处于计划阶段。System.Diagnostics.Eventing 中包含 EventProvider 类。EventProvider 为本 机应用程序提供了实现上述所有功能的方法。用户需要使用提供程序GUID对类进行实例化,并使用
47、该类实例记录事件。EventDescriptor是一个等同于本机API中的事件描述符的结构。与本机的情况不同,EventDescriptors 并不是为托管的应用程序生成的。但是,目前正在考虑开发一个能够生成旨在改善性能 并验证的代码的工具。图6显示了 EventProvider的使用示例。Figure 6托管的ETW是供程序using System.Diagnostics.Eventing ; .static void Main(string ArgRead)int MyInteger ; string MyString ; ./Construct event descriptor.Even
48、tDescriptor Event1=new EventDescriptor(5,0,0,2,0,0,0) /Instantiate event provider.EventProvider etwProvider=new EventProvider(new Guid("d58c126f-b309-11d1-969e- 0000f875a5bc") ; ./Write an event with MyInteger and MyString.etwProvider.WriteEvent(ref Event1,MyInteger,MyString); .止匕外,Windows
49、 Vista中的ETWJ提供程序提供了经过改善的安全选项。默认情 况下,任何提供程序都可以注册并写入事件。但是,开发人员可以对GUID设置限制,从而只有授权用户才能使用该GUID注册提供程序。提供程序也可以指定谁可以启用它。止匕外,ETW允许控制器将会话声明为安全的,意思是其仅接收 来自某个用户组的事件。一旦带有事件提供程序检测的二进制文件编译完成, 提供程序即完成安装。然后,用户可以使用 logman工具(一个附带的控制器应 用程序)从提供程序收集事件。以下logman.exe命令发出了两个ETW空制API 调用,这两个调用启动了名为 mysession的ETW会话并启用了提供程序:logm
50、an start mysession-p provider name-o mytest.etl-ets会话mysession向名为mytest.etl的文件写入事件。Logman.exe提供了很多选项可对日志记录模式和缓冲区配置等进行自定义。此处的 provider name可以是清 单中的提供程序名称,也可以是提供程序使用EventRegister API进行注册时使用的 GUID 如果提供程序 GUID为 11223344-5566-7788-99aa-bbccddeeff00 则实际命令行将如下所示:logman start mysession-p11223344-5566-7788-9
51、9aa-bbccddeeff00-o mytest.etl-ets ETW 允许控制器在提供程序注册和执行前预启用它。这样,对 于二进制图像的加载不容易控制的DLL和驱动程序,用户就可以收集它们的启动跟踪。控制器启动一个会话,并在提供程序开始执行之前启用它。提供程序一经注册即被启用。根据需要收集事件完成后,可以使用 logman.exe中的停止 选项停止会话。logman stop mysession-ets 现在,在执行 logman命令的目 录下应该出现 会出现一个名为mytest.etl的跟踪文件。使用Tracerpt.exe 可以从该文件中 获取事件的转储:tracerpt mytes
52、t.etl此命令会创建一个转储文件(默认情况下为dumpfile.xml)和一个文本摘要文件(默认情况下为summary.txt)。摘要文件包 含简短的事件统计摘要。转储文件中包含事件的XM第储,如图2所示。事件标头中的数据字段显示在 System部分中。System部分中的Execution标记中 提供了进程ID、线程ID、处理器ID和CPUS用率。止匕外,System部分还显示 了事件的事件描述符字段的值。用户可以指定输出文件名称作为tracerpt.exe命令的选项。Windows Vista还提供了其他一些能够收集和查看跟踪的GUI工具,稍后我们将进行讨论。 Windows Vista
53、中安装了数百个事件提供程序。用 户可以通过PerfMon或事件查看器查看这些提供程序的列表,或者也可以使用 以下logman.exe命令:logman query providers设计和实现指南在本部分中,我们要讨论创建定义事件的清单文件的步骤、 使用ETW API调用检测代码的步骤以及成功构建和安装事件提供程序的步骤。 设计检测清单检测清单是一个XMLB式的文件,它定义了事件提供程序和事件 提供程序记录到ETW勺事件。每个事件都具有标准的元数据和可变的事件数据 部分。我们可以手动创建清单,也可以使用SDKI供的清单生成工具(ecmangen.exe)。步骤如下:创建一个事件提供程序并确定其
54、提供程序ID,即GUIQ定义组件的逻辑任 务并在这些逻辑任务中指定检测点。这一步定义了提供程序所写入的事件的任 务和操作码。定义将记录事件的子组件并为每个子组件分配关键字。这样控制 器就可以有选择地启用事件。评估所设计事件的目标群体并为每个目标群体定 义通道。创建不同的构造来定义可变的用户上下文数据。可以在 templates部 分中完成构造的创建。将它们放在一起,并在清单的 events部分中定义事件。 为每个事件分配符号标识符、严重程序、关键字、通道、任务、操作码和模板。还可以添加一条可本地化的特定于事件的消息。使用ETW API检测代码在清单中定义了事件后,使用统一的 API将事件写入E
55、TW对于本机应用程序,首先 会生成一个包含清单提供的事件定义的头文件,以便将其加入到提供程序代码 中。然后,使用ETW API写入前面设计好的事件。过程如下:在上面创建的清单上运行消息编译器 mc.exe。这一步会生成头文件,其中 包含事件的事件描述符结构,每个结构实例具有与事件符号标识符相同的名称。 消息编译器还会产生资源字符串文件。所生成的头文件需要加入到提供程序代 码中。提供程序在编写代码以引发事件之前,需要调用EventRegister函数,使用清单中定义的提供程序ID进行注册。应对EventRegister返回的注册句柄 进行存储,以供日志记录 API调用和相应的EventUnreg
56、ister调用使用。调用 EventWrite以记录清单中定义的事件。通过图3所示的数据描述符数组传入特定于事件的数据。(开发人员必须确保数据字段与清单内指定的相应事件模板完 全匹配。)传入事件头文件中定义的正确的事件描述符结构。所有必需的事件记 录完成后,调用EventUnregister并传入注册句柄。编译已检测的二进制文件 在构造阶段应对定义事件的清单信息进行编译,并将编译好的信息作为资源附 加到提供程序的可执行二进制文件中。所有可本地化字符串将从该经过编译的 清单内提取出来,并放入一个必须单独编译和链接的单独的源文件内。在部署 提供程序二进制文件时,需要在系统中安装清单信息,以便控制器
57、和使用者能 够找到事件提供程序和事件定义。所有必需工具均可从Windows Vista本机获得或从SD侬得。相关步骤如下:如果事件存在可本地化的消息字符串,可能需要运行rc.exe将资源文件编译为.res文件。如果使用Visual Studio ,开发人员可以加入预建的命令来运 行rc.exe ,以生成.res已编译资源,并将此已编译资源文件加入到项目之中。 使用cl.exe或link.exe 链接已编译资源文件(Visual Studio用户可以在步骤2中完成此操作),并对应用程序或驱动程序进行编译。在安装提供程序时,运 行带-im选项的wevtutil.exe 工具来安装定义事件的清单。这样,控制器就 可以发现事件提供程序,并且使使用工具也可以找到对事件进行正确解码所需 的信息。工具和支持到目前为止,我们已经使用了命令行控制器logman.exe和通用使用者工具tr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国有土地使用权交易合同
- 山东建筑大学gpa课程设计
- 面部肌肉运动课程设计
- 地质灾害治理竣工报告
- 安全事故管理考核办法范本(2篇)
- 高效液相色谱课程设计
- 健身俱乐部建设合同
- 硬件公司退租协议范本
- 地下商业中心建设顶管施工合同
- 塑料制品混凝土施工承包合同
- 劳动技术教案
- 广东省深圳市2023-2024学年高一上学期生物期中试卷(含答案)
- 第七章 立体几何与空间向量综合测试卷(新高考专用)(学生版) 2025年高考数学一轮复习专练(新高考专用)
- 大学美育(同济大学版)学习通超星期末考试答案章节答案2024年
- 2024年2024年离婚协议书模板
- 中国急性缺血性卒中诊治指南(2023版)
- 福建省残疾人岗位精英职业技能竞赛(美甲师)参考试题及答案
- 在线学习新变革课件 2024-2025学年人教版(2024)初中信息技术七年级全一册
- 劳动法律学习试题
- 过敏性休克完整版本
- 08D800-8民用建筑电气设计与施工防雷与接地
评论
0/150
提交评论