【问题标题】:Event Tracing for Windows (ETW) increase session buffer sizeWindows 事件跟踪 (ETW) 增加会话缓冲区大小
【发布时间】:2022-08-09 09:54:21
【问题描述】:

我正在使用 ETW 来跟踪我正在开发的一些自定义应用程序(用 C++ 编写)的事件。提供者是基于清单的提供者。 在一些测试会话期间,我看到一些事件丢失了,调试时,我发现 EventWrite 方法返回错误 ERROR_MORE_DATA ,如Windows Doc Page 中定义的那样意味着

会话缓冲区大小对于事件来说太小了

查看this 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>

并在&lt;event keywords=\"Informative\" value=\"4\"... 行中添加了属性channel=\"c1\"

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

这里的问题:

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

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

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

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

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

    标签: windows buffer etw wevtutil


    【解决方案1】:

    启动跟踪时查看跟踪会话缓冲区配置。跟踪控制器设置一个 ETW 跟踪会话,该会话在其中设置跟踪缓冲区,并允许配置缓冲区,例如大小、数量以及刷新间隔。

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多