Our large code base has a class AnyRef
that contains a type-erased reference to some object:
struct AnyRef {
int type = 0;
void* ptr = nullptr;
};
For example, if type==1
, then ptr
is pointing to an instance of a class Foo1
. To simplify debugging in Visual Studio (we don’t use VSCode for that), we have a natvis file that looks like this:
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="AnyRef">
<Expand>
<Item Name="Type" Condition="type==1">"Foo1"</Item>
<Item Name="Object" Condition="type==1">*((Foo1*)ptr)</Item>
<Item Name="Type" Condition="type==2">"Foo2"</Item>
<Item Name="Object" Condition="type==2">*((Foo2*)ptr)</Item>
...
</Expand>
</Type>
</AutoVisualizer>
The classes that AnyRef
can reference are generated via some external code generation tool, and there are hundreds of them. The tool also generates the natvis entries, and there are therefore hundreds of entries in the natvis <Expand>
element. We also have a few other classes like AnyRef
that use type erasure and for which hundreds of natvis elements get generated, too.
Problem: The result is that the Visual Studio debugger hangs for 1 minute as soon as a breakpoint is hit because it is busy loading the natvis content. Afterwards it is fast, but it is quite annoying since the hang happens everytime one fires up the debugger and stop the execution.
My current workaround is to remove the content from natvis that I am not interested in locally; e.g. I know that I personally am almost never interested in Foo1
but only Foo2
. But we cannot really implement this globally, because members of another team usually look at Foo1
and never at Foo2
.
Also, the workaround has the problem that our version control (SVN/git) of course shows the natvis file as modified, and care must be taken not to commit it.
Question: Does anyone have an idea how to write the natvis file in a way that allows the debugger to load it more efficiently? The <Expand>
element is basically a long sequence of if(...){} if(...){}
statements, which obviously is quite inefficient (since it needs to evaluate every single if-statement). I was thinking about somehow converting it to some map-style/lookup-table-style structure, but apparently natvis does not support something like this? Any other ideas?
8