Visual Studio 调试器:注册特定 C++ 的显示格式 struct/class
Visual Studio Debugger: Register a display format for a specific C++ struct/class
如何让 Visual Studio 调试器知道特定的 C++/C 结构应该以特定的格式显示?
例如,我有一个包含 2 个指针的 C 结构,它们代表数组的开始和结束,如下所示:
typedef struct
{
VEC_VALUE_T* __restrict DataBegin_;
VEC_VALUE_T* __restrict DataEnd_;
VEC_VALUE_T* __restrict MemEnd_;
VEC_ALLOC* __restrict Allocator_;
} VEC;
如何在调试器中将其显示为 std::vector
。
来自另一个 POV 的相同问题:
调试器如何知道如何显示 std::vector
? std::vector
是否使用了一些特定于调试器的编译指示之类的?
@retired-ninja在评论中提到,可以使用natvis框架:
https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2022
在VS中添加natvis文件
右键单击项目选项卡 -> 添加新项目 -> 实用程序 -> .natvis
为该特定内容添加类型元素 struct/class
有关语法的示例可以在上面的 link 中找到。
在我的例子中,以下元素定义足以将其显示为 std::vector
:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="::VEC">
<DisplayString>{{ size={DataEnd_ - DataBegin_}, capacity={MemEnd_ - DataBegin_} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">DataEnd_ - DataBegin_</Item>
<Item Name="[capacity]" ExcludeView="simple">MemEnd_ - DataBegin_</Item>
<ArrayItems>
<Size>DataEnd_ - DataBegin_</Size>
<ValuePointer>DataBegin_</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
如何让 Visual Studio 调试器知道特定的 C++/C 结构应该以特定的格式显示?
例如,我有一个包含 2 个指针的 C 结构,它们代表数组的开始和结束,如下所示:
typedef struct
{
VEC_VALUE_T* __restrict DataBegin_;
VEC_VALUE_T* __restrict DataEnd_;
VEC_VALUE_T* __restrict MemEnd_;
VEC_ALLOC* __restrict Allocator_;
} VEC;
如何在调试器中将其显示为 std::vector
。
来自另一个 POV 的相同问题:
调试器如何知道如何显示 std::vector
? std::vector
是否使用了一些特定于调试器的编译指示之类的?
@retired-ninja在评论中提到,可以使用natvis框架: https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2022
在VS中添加natvis文件
右键单击项目选项卡 -> 添加新项目 -> 实用程序 -> .natvis
为该特定内容添加类型元素 struct/class
有关语法的示例可以在上面的 link 中找到。
在我的例子中,以下元素定义足以将其显示为 std::vector
:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="::VEC">
<DisplayString>{{ size={DataEnd_ - DataBegin_}, capacity={MemEnd_ - DataBegin_} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">DataEnd_ - DataBegin_</Item>
<Item Name="[capacity]" ExcludeView="simple">MemEnd_ - DataBegin_</Item>
<ArrayItems>
<Size>DataEnd_ - DataBegin_</Size>
<ValuePointer>DataBegin_</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>