我正在使用 ETW 来跟踪我正在开发的一些自定义应用程序(用 C++ 编写)的事件。提供者是基于清单的提供者。在一些测试会话期间,我看到一些事件丢失了,调试时,我发现 EventWrite 方法返回错误 ERROR_MORE_DATA ,如Windows Doc Page中定义的那样意味着
会话缓冲区大小对于事件来说太小了
查看此页面似乎可以定义bufferSize
属性。使用这些信息,我更新了清单:
旧清单
<provider name="IconisTrace-IFMO" guid="{038CA124-E20D-4c13-BC62-F158E89222EA}" symbol="TraceIconisTraceIFMO" resourceFileName="_ICONIS_PATH\ICONIS\Bin\IcATSR_Trace_ResOffline.dll" messageFileName="_ICONIS_PATH\ICONIS\Bin\IcATSR_Trace_ResOffline.dll" message="$(string.Provider.Name.IFMO)">
<events>
<event keywords="Error" value="1" version="0" level="win:Error" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Warning" value="2" version="0" level="win:Warning" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Functional" value="3" version="0" level="win:Informational" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Informative" value="4" version="0" level="win:Verbose" template="template_function_trace" channel="c1" message="$(string.Event.String)"/>
<event keywords="Begin" value="5" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Exit" value="6" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Debug" value="7" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="_S2KTrace" value="8" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Performance" value="9" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
</events>
<levels>
</levels>
<tasks>
<task name="IFMO" symbol="IFMOTracingEntry" value="3" eventGUID="{2AAB6C5E-4FCC-493d-9606-E430DFEEB829}">
</task>
</tasks>
<opcodes>
</opcodes>
<keywords>
<keyword name="Error" mask="0x1" message="$(string.Keyword.Error)"/>
<keyword name="Warning" mask="0x2" message="$(string.Keyword.Warning)"/>
<keyword name="Functional" mask="0x4" message="$(string.Keyword.Functional)"/>
<keyword name="Informative" mask="0x8" message="$(string.Keyword.Informative)"/>
<keyword name="Begin" mask="0x10" message="$(string.Keyword.Begin)"/>
<keyword name="Exit" mask="0x20" message="$(string.Keyword.Exit)"/>
<keyword name="Debug" mask="0x40" message="$(string.Keyword.Debug)"/>
<keyword name="_S2KTrace" mask="0x80" message="$(string.Keyword._S2KTrace)"/>
<keyword name="Performance" mask="0x100" message="$(string.Keyword.Performance)"/>
</keywords>
<templates>
<template tid="template_function_trace">
<data name="FileName" inType="win:UnicodeString" outType="xs:string"/>
<data name="LineNum" inType="win:Int32" outType="xs:int"/>
<data name="OutputString" inType="win:UnicodeString" outType="xs:string"/>
</template>
</templates>
</provider>
新清单
<provider name="IconisTrace-IFMO" guid="{038CA124-E20D-4c13-BC62-F158E89222EA}" symbol="TraceIconisTraceIFMO" resourceFileName="_ICONIS_PATH\ICONIS\Bin\IcATSR_Trace_ResOffline.dll" messageFileName="_ICONIS_PATH\ICONIS\Bin\IcATSR_Trace_ResOffline.dll" message="$(string.Provider.Name.IFMO)">
<channels>
<channel name="IconisTrace-IFMO/Operational" chid="c1" type="Operational" enabled="true">
<publishing>
<bufferSize>0x80</bufferSize>
</publishing>
</channel>
</channels>
<events>
<event keywords="Error" value="1" version="0" level="win:Error" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Warning" value="2" version="0" level="win:Warning" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Functional" value="3" version="0" level="win:Informational" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Informative" value="4" version="0" level="win:Verbose" template="template_function_trace" channel="c1" message="$(string.Event.String)"/>
<event keywords="Begin" value="5" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Exit" value="6" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Debug" value="7" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="_S2KTrace" value="8" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
<event keywords="Performance" value="9" version="0" level="win:Verbose" template="template_function_trace" message="$(string.Event.String)"/>
</events>
<levels>
</levels>
<tasks>
<task name="IFMO" symbol="IFMOTracingEntry" value="3" eventGUID="{2AAB6C5E-4FCC-493d-9606-E430DFEEB829}">
</task>
</tasks>
<opcodes>
</opcodes>
<keywords>
<keyword name="Error" mask="0x1" message="$(string.Keyword.Error)"/>
<keyword name="Warning" mask="0x2" message="$(string.Keyword.Warning)"/>
<keyword name="Functional" mask="0x4" message="$(string.Keyword.Functional)"/>
<keyword name="Informative" mask="0x8" message="$(string.Keyword.Informative)"/>
<keyword name="Begin" mask="0x10" message="$(string.Keyword.Begin)"/>
<keyword name="Exit" mask="0x20" message="$(string.Keyword.Exit)"/>
<keyword name="Debug" mask="0x40" message="$(string.Keyword.Debug)"/>
<keyword name="_S2KTrace" mask="0x80" message="$(string.Keyword._S2KTrace)"/>
<keyword name="Performance" mask="0x100" message="$(string.Keyword.Performance)"/>
</keywords>
<templates>
<template tid="template_function_trace">
<data name="FileName" inType="win:UnicodeString" outType="xs:string"/>
<data name="LineNum" inType="win:Int32" outType="xs:int"/>
<data name="OutputString" inType="win:UnicodeString" outType="xs:string"/>
</template>
</templates>
</provider>
两个版本之间的区别在于,在 NEW MANIFEST 中我添加了以下元素:
<channels>
<channel name="Alstom-Iconis-IconisTrace-IFMO/Operational" chid="c1" type="Operational" enabled="true">
<publishing>
<bufferSize>0x80</bufferSize>
</publishing>
</channel>
</channels>
channel="c1"
并在该行中 添加了属性<event keywords="Informative" value="4"...
不幸的是,我仍然继续遇到同样的错误。
这里的问题:
- 这种改变有意义吗?这是面对这个问题的正确方法吗?我有一些疑问,因为在这个文档页面中有一条注释说:
[!Note] 无论缓冲区大小如何,ETW 都无法收集大于 64KB 的事件。
- 使用命令正确编译清单
mc.exe -um OfflineProviders.man
并生成几个文件;但是当我尝试使用注册清单时,出现wevtutil.exe im OfflineProviders.man
以下错误
通道属性 BufferSize 的值包含无效值。参数不正确。
为什么我会收到此错误?该错误是否解释了为什么我仍然会继续丢失事件?