访问Visual Studio ImageWatch插件的.natvis文件中的矢量基础数据



问题

类似于这个问题,我正在尝试将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>进行斗争。图像数据分配不起作用,我无法在查看器中看到图像。相反,我得到的信息是"无效"。显然,这是因为image_datastd::vector<char>而不是char*

我尝试过的

我在<Item Name="[data]">image_data</Item>标签中尝试了许多不同的方法来访问char*数据指针下面的向量,但都不起作用:

  • image_data
  • image_data.data()显然在.natvis文件中不能调用任何函数,natvis输出:错误:在这种情况下不支持副作用
  • image_data._Myfirst(类似于在这里部分"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]">&amp;image_data[0]</Item>

哪个评估为代码:

&image_data[0]

实际上,这会返回向量的第一个元素的地址(向量内部使用数组,所以基本上是返回指向数组的指针)

显然,矢量的数据可以通过以下方式进行分析:

<Item Name="[data]">image_data._Mypair._Myval2._Myfirst</Item>

我通过分析不同矢量的natvis调试输出发现了这一点。

编辑:

正如我所意识到的,这是特定于实现的。上述解决方案在VS2015下运行良好。在VS 2012中,在以上不起作用的解决方案

<Item Name="[data]">image_data._Myfirst</Item>

效果很好。

相关内容

  • 没有找到相关文章

最新更新