0

我正在使用 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"...

不幸的是,我仍然继续遇到同样的错误。

这里的问题:

  1. 这种改变有意义吗?这是面对这个问题的正确方法吗?我有一些疑问,因为在这个文档页面中有一条注释说:

[!Note] 无论缓冲区大小如何,ETW 都无法收集大于 64KB 的事件。

  1. 使用命令正确编译清单mc.exe -um OfflineProviders.man并生成几个文件;但是当我尝试使用注册清单时,出现wevtutil.exe im OfflineProviders.man以下错误

通道属性 BufferSize 的值包含无效值。参数不正确。

为什么我会收到此错误?该错误是否解释了为什么我仍然会继续丢失事件?

4

0 回答 0