microsoft / ConcordExtensibilitySamples

Visual Studio Debug Engine Extensibility Samples
Other
121 stars 50 forks source link

How to add a custom VisualizerId? #81

Closed jerishC closed 2 years ago

jerishC commented 2 years ago

hi,i have runned CppCustomVisualizer successfully and i have read the wiki. But I am still confused about VisualizerId in CppCustomVisualizer.natvis and can not add a new customvisualizer myself. hope to get answers for these following questions.

  1. "FILETIME" is a class, but why there is a "_" before FILETIME. `

    `

2.VisualizerId is generate by ourself, so can i regenerate it and replace it in CppCustomVisualizer.natvis and CppCustomVisualizer.vsdconfigxml? I replaced it and the project can not work correctlly.

3.If I want to add a new type "Struct A{ int a1; int b1;} and show a1 in debug window" ,How to modify the CppCustomVisualizer.natvis and CppCustomVisualizer.vsdconfigxml? if i add a Implements tag,the project will build failed ">CppCustomVisualizer.vsdconfigxml(44,8): error XAC1000:"

`

<NativeComponent ComponentId="{184B8704-E76C-454A-991F-351D9AB15CFC}" ComponentLevel="9991500" ModuleName="CppCustomVisualizer.dll">

<Class Name="CCppCustomVisualizerService" ClassId="{9535F50E-1738-4AE2-8507-5207C44B8261}" WorkerProcessSupported="true">

  <Implements>
    <InterfaceGroup>
      <Filter>
        <!--NOTE: This VisualizerId is also used in the .natvis file.-->
        <VisualizerId RequiredValue="8E723FD7-611E-40E7-98C0-624D8873F559"/>
      </Filter>
      <Interface Name="IDkmCustomVisualizer"/>
    </InterfaceGroup>
  </Implements>

  <Implements>
    <InterfaceGroup>
      <NoFilter/>
      <Interface Name="IDkmCallStackFilter"/>
    </InterfaceGroup>
  </Implements>

</Class>

`

thanks

gregg-miskelly commented 2 years ago

"FILETIME" is a class, but why there is a "_" before FILETIME.

Because, in the Windows SDK, FILETIME is a typedef. So one needs to use the name of the struct -- _FILETIME.

From minwindef.h:

typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
gregg-miskelly commented 2 years ago

2.VisualizerId is generate by ourself, so can i regenerate it and replace it in CppCustomVisualizer.natvis and CppCustomVisualizer.vsdconfigxml? I replaced it and the project can not work correctlly.

The .natvis and the .vsdconfigxml files need to agree on the value. So if you update it in one place, you need to update it in the other.

gregg-miskelly commented 2 years ago

If I want to add a new type "Struct A{ int a1; int b1;} and show a1 in debug window" ,How to modify the CppCustomVisualizer.natvis and CppCustomVisualizer.vsdconfigxml? if i add a Implements tag,the project will build failed ">CppCustomVisualizer.vsdconfigxml(44,8): error XAC1000:"

I am not sure if I understand your question. Your .natvis file is what associates a type name with a visualizer id. If you are trying to make one dll that visualizers multiple types, there are many ways to do this:

jerishC commented 2 years ago

thanks, it seems there are some problems in my vs2019 enviroment, I change to vs2022.

then, I add a new type with same id and it works fine(watch a tagRECT type can call my CCppCustomVisualizerService func)

  <Type Name="_FILETIME">
    <!--NOTE: The 'VisualizerId' is also specified in the .vsdconfigxml to control which
    implementation of IDkmCustomVisualizer is used.-->
    <CustomVisualizer VisualizerId="8E723FD7-611E-40E7-98C0-624D8873F559"/>
  </Type>

  <Type Name="tagRECT">
    <!--NOTE: The 'VisualizerId' is also specified in the .vsdconfigxml to control which
    implementation of IDkmCustomVisualizer is used.-->
    <CustomVisualizer VisualizerId="8E723FD7-611E-40E7-98C0-624D8873F559"/>
  </Type>

howerver, if i add a new one like this, it did not work (GUID is created from "Tools-> Create GUID")

//CppCustomVisualizer.natvis
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

  <Type Name="_FILETIME">
    <!--NOTE: The 'VisualizerId' is also specified in the .vsdconfigxml to control which
    implementation of IDkmCustomVisualizer is used.-->
    <CustomVisualizer VisualizerId="8E723FD7-611E-40E7-98C0-624D8873F559"/>
  </Type>

  <Type Name="tagRECT">
    <!--NOTE: The 'VisualizerId' is also specified in the .vsdconfigxml to control which
    implementation of IDkmCustomVisualizer is used.-->
    <CustomVisualizer VisualizerId="28331DB7-43B1-470C-922E-023C72C59A07"/>
  </Type>

</AutoVisualizer>

//CppCustomVisualizer.vsdconfigxml
      <Implements>
        <InterfaceGroup>
          <Filter>
            <!--NOTE: This VisualizerId is also used in the .natvis file.-->
            <VisualizerId RequiredValue="8E723FD7-611E-40E7-98C0-624D8873F559"/>
            <VisualizerId RequiredValue="28331DB7-43B1-470C-922E-023C72C59A07"/>
          </Filter>
          <Interface Name="IDkmCustomVisualizer"/>
        </InterfaceGroup>
      </Implements>
gregg-miskelly commented 2 years ago

What do you see in the logs when you evaluate an expression that results in a successful evaluation of one of those types? Logging info: https://github.com/Microsoft/ConcordExtensibilitySamples/wiki/Getting-troubleshooting-logs

jerishC commented 2 years ago

thanks,it finally works