使用 ProgrammableDataQuery 添加自定义 IntelliTrace 诊断事件

Adding custom IntelliTrace diagnostics events with ProgrammableDataQuery

我为 IntelliTrace 创建了几个自定义 DiagnosticEventSpecification。这按预期工作。

 <DiagnosticEventSpecification enabled="true">
    <Bindings>
      <Binding onReturn="false">
        <ModuleSpecificationId>DiagnosticsTester</ModuleSpecificationId>
        <TypeName>DiagnosticsTester.IntellitraceTest</TypeName>
        <MethodName>TestTrace2</MethodName>
        <MethodId>DiagnosticsTester.IntellitraceTest.TestTrace2(System.String):System.Void</MethodId>
        <ShortDescription _locID="IntelliTraceEnterEvent_ShortDescription">The method TestTrace2.1 was called</ShortDescription>
        <LongDescription _locID="IntelliTraceEvent_LongDescription">View the Locals window for details about the collected data</LongDescription>
        <AutomaticDataQuery level="All" />
      </Binding>
      <Binding onReturn="true">
        <ModuleSpecificationId>DiagnosticsTester</ModuleSpecificationId>
        <TypeName>DiagnosticsTester.IntellitraceTest</TypeName>
        <MethodName>TestTrace2</MethodName>
        <MethodId>DiagnosticsTester.IntellitraceTest.TestTrace2(System.String):System.Void</MethodId>
        <ShortDescription _locID="IntelliTraceExitEvent_ShortDescription">The method TestTrace2.1 returned</ShortDescription>
        <LongDescription _locID="IntelliTraceEvent_LongDescription">View the Locals window for details about the collected data</LongDescription>
        <AutomaticDataQuery level="All" />
      </Binding>
    </Bindings>
    <CategoryId>IntelliTrace.generated.8889ce9d-2320-40c0-a6bf-dfac215354d2</CategoryId>
    <SettingsName _locID="">DiagnosticsTester.IntellitraceTest.TestTrace2</SettingsName>
    <SettingsDescription _locID=""></SettingsDescription>
  </DiagnosticEventSpecification>

当我尝试使用 ProgrammableDataQuery 时,它无法捕获事件。 根据 ProssesMon 和 "Fusion log viewer" Intellitrace 从不尝试加载我的自定义 dll。 定义如下所示:

   <DiagnosticEventSpecification enabled="true">
    <Bindings>
      <Binding>
        <ModuleSpecificationId>DiagnosticsTester</ModuleSpecificationId>
        <TypeName>DiagnosticsTester.IntellitraceTest</TypeName>
        <MethodName>TestTrace2</MethodName>
        <MethodId>DiagnosticsTester.IntellitraceTest.TestTrace2(System.String):System.Void</MethodId>
        <ProgrammableDataQuery>
          <ModuleName>UnikDataQuery.dll</ModuleName>
          <TypeName>UnikDataQuery.TestDataQuery</TypeName>
        </ProgrammableDataQuery>
      </Binding>
    </Bindings>
    <CategoryId>IntelliTrace.generated.8889ce9d-2320-40c0-a6bf-dfac215354d2</CategoryId>
    <SettingsName _locID="">DiagnosticsTester.IntellitraceTest.TestTrace2</SettingsName>
    <SettingsDescription _locID=""></SettingsDescription>
  </DiagnosticEventSpecification>

我已将 dll 放置在 IntelliTrace 独立收集器之外以及 IntelliTrace 的 VS2015 文件夹中 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace.0.0

带PDQ的dll应该放在有IntelliTace.exe程序的文件夹中。换句话说,如果您使用集成到 Visual Studio 中的 IntelliTrace,则应将 UnitQuery.dll 复制到您提到的文件夹,即:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace.0.0

顺便说一句,在这个文件夹中你还可以找到Microsoft.VisualStudio.DefaultDataQueries,这是一个VS使用的默认PDQs的dll。

但是,如果您使用独立集合,则必须将您的 dll 复制到它的安装目录。

我做了很多次,效果很好。同样值得验证的是,您的 dll 是在平台目标设置为 Any CPU 的情况下编译的。它将允许避免兼容性问题。

我最后的评论是,您的带有 PDQ 的 dll 不仅需要捕获日志,还需要:

  • 在 VS 中打开它
  • 使用 IntelliTrace 对其进行分析 API。

例如,如果您:

  • 使用独立集合来捕获日志
  • 您想在 Visual Studio
  • 中打开此日志

然后UnitQuery.dll必须复制到两个位置。