访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据
Access to vector underlying data in .natvis files for Visual Studio ImageWatch plugin
问题
类似于 this question, I am trying to use the ImageWatch 我自己定义类型的插件 MyImageClass
。 ImageWatch 是一个 Visual Studio 插件,允许您在调试代码时以图形表示形式查看图像。您可以编写 .natvis 文件来添加对自定义 类.
的支持
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
}
ImageWatch 插件需要 char*
类型的图像数据,但我将数据存储在 std::vector<char>
中。
我的.natvis 文件,很简单,(你可以跳过它,只是为了完整)
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
MenuName="Add to Image Watch"/>
<Type Name="MyImageClass">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
</Type>
<Type Name="MyImageClass">
<Expand>
<Synthetic Name="[type]">
<DisplayString>UINT8</DisplayString>
</Synthetic>
<Item Name="[channels]">1</Item>
<Item Name="[width]">width</Item>
<Item Name="[height]">height</Item>
<Item Name="[planes]">1</Item>
<Item Name="[data]">image_data</Item>
<Item Name="[stride]">width</Item>
</Expand>
</Type>
</AutoVisualizer>
但是下面这行我正在努力 <Item Name="[data]">image_data</Item>
。图像数据分配不起作用,我无法在查看器中看到图像。相反,我收到消息 "invalid"。显然,这是因为 image_data
是 std::vector<char>
而不是 char*
。
我试过的
我在 <Item Name="[data]">image_data</Item>
标签内尝试了很多不同的东西来访问 char*
数据指针下的向量,但是 none 工作:
image_data
image_data.data()
显然在 .natvis 文件中不能调用任何函数,Natvis 输出:错误:在此上下文中不支持副作用。
image_data._Myfirst
(类似于
here
"ArrayItems Expansion") Natvis 输出:错误:指向绑定函数的指针只能用于调用函数
有效但不是理想的解决方案
作为解决方法并查看我的数据是否正确,我向结构添加了一个 char*
,然后将其分配给基础数据向量。
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
char* image_data_ptr;
};
然后
image_data_ptr = image_data.data();
.natvis 文件相应更改
<Item Name="[data]">image_data_ptr</Item>
这有效,我可以在 ImageWatch 中看到图像。但是,我不想引入一个额外的变量,只是为了 VS 调试器的目的。
非常感谢任何帮助。
显然可以通过以下方式分析向量的数据:
<Item Name="[data]">image_data._Mypair._Myval2._Myfirst</Item>
我通过分析不同向量的 natvis 调试输出发现了这一点。
编辑:
据我了解,这是特定于实现的。上述解决方案在 VS2015 下运行良好。在 VS 2012 中,上面的解决方案不起作用
<Item Name="[data]">image_data._Myfirst</Item>
效果很好。
我找到了一个偶数 "better" 解决方案,不需要在结构中添加额外的指针:
<Item Name="[data]">&image_data[0]</Item>
计算结果为代码:
&image_data[0]
实际上,这个 returns 向量的第一个元素的地址(向量在内部使用一个数组,所以你基本上返回一个指向数组的指针)
问题
类似于 this question, I am trying to use the ImageWatch 我自己定义类型的插件 MyImageClass
。 ImageWatch 是一个 Visual Studio 插件,允许您在调试代码时以图形表示形式查看图像。您可以编写 .natvis 文件来添加对自定义 类.
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
}
ImageWatch 插件需要 char*
类型的图像数据,但我将数据存储在 std::vector<char>
中。
我的.natvis 文件,很简单,(你可以跳过它,只是为了完整)
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
MenuName="Add to Image Watch"/>
<Type Name="MyImageClass">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
</Type>
<Type Name="MyImageClass">
<Expand>
<Synthetic Name="[type]">
<DisplayString>UINT8</DisplayString>
</Synthetic>
<Item Name="[channels]">1</Item>
<Item Name="[width]">width</Item>
<Item Name="[height]">height</Item>
<Item Name="[planes]">1</Item>
<Item Name="[data]">image_data</Item>
<Item Name="[stride]">width</Item>
</Expand>
</Type>
</AutoVisualizer>
但是下面这行我正在努力 <Item Name="[data]">image_data</Item>
。图像数据分配不起作用,我无法在查看器中看到图像。相反,我收到消息 "invalid"。显然,这是因为 image_data
是 std::vector<char>
而不是 char*
。
我试过的
我在 <Item Name="[data]">image_data</Item>
标签内尝试了很多不同的东西来访问 char*
数据指针下的向量,但是 none 工作:
image_data
image_data.data()
显然在 .natvis 文件中不能调用任何函数,Natvis 输出:错误:在此上下文中不支持副作用。image_data._Myfirst
(类似于 here "ArrayItems Expansion") Natvis 输出:错误:指向绑定函数的指针只能用于调用函数
有效但不是理想的解决方案
作为解决方法并查看我的数据是否正确,我向结构添加了一个 char*
,然后将其分配给基础数据向量。
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
char* image_data_ptr;
};
然后
image_data_ptr = image_data.data();
.natvis 文件相应更改
<Item Name="[data]">image_data_ptr</Item>
这有效,我可以在 ImageWatch 中看到图像。但是,我不想引入一个额外的变量,只是为了 VS 调试器的目的。 非常感谢任何帮助。
显然可以通过以下方式分析向量的数据:
<Item Name="[data]">image_data._Mypair._Myval2._Myfirst</Item>
我通过分析不同向量的 natvis 调试输出发现了这一点。
编辑:
据我了解,这是特定于实现的。上述解决方案在 VS2015 下运行良好。在 VS 2012 中,上面的解决方案不起作用
<Item Name="[data]">image_data._Myfirst</Item>
效果很好。
我找到了一个偶数 "better" 解决方案,不需要在结构中添加额外的指针:
<Item Name="[data]">&image_data[0]</Item>
计算结果为代码:
&image_data[0]
实际上,这个 returns 向量的第一个元素的地址(向量在内部使用一个数组,所以你基本上返回一个指向数组的指针)