vs natvis编写,自定义vs中变量的展示

2023-10-10 10:30

本文主要是介绍vs natvis编写,自定义vs中变量的展示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vs 自定义变量的显示规则

1. 自定义结构体或者类在vs变量窗口显示带来的问题

struct Marray
{int *data;int length;
};

首先定义一个数组结构体,data指向一块内存,length是这个数组的大小

然后编写如下代码

#include <stdio.h>
#include <stdlib.h>#define ARRAYSIZE	3struct Marray
{int *data;int length;
};int main(int argc, char* argv[])
{struct Marray arr;arr.data = (int*)malloc(sizeof(int) * ARRAYSIZE);arr.length = ARRAYSIZE;arr.data[0] = 1;arr.data[1] = 2;arr.data[2] = 3;printf("hello word\n");return 0;
}

在vs中arr这个变量会如何显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atz1XAs0-1656169374282)(./1.png)]

但是我们实际上想让他把data的三个元素都显示出来,这样子便于调试发现问题

vs给我们提供了自定显示规则的方法,编写vs支持的xml文件,官方叫做natvis文件
这个文件有两种添加方式:

  • 一种是直接放在vs的安装目录 %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
  • 一种是在项目中添加
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkdUcvrD-1656169374283)(./2.png)]

也就是一种是全局的,一个是只生效这个项目中的

2. natvis文件的编写

natvis文件是xml格式文件,遵循xml语法。

2.1 xml的转义字符

&lt;	<	小于
&gt;	>	大于
&amp;	&	和号
&apos;	'	单引号
&quot;	"	双引号

如果在编写时用到这些符号需要转义

2.2 natvis语法

2.2.1 声明部分
<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"></AutoVisualizer>

这三行固定这么写就行。第一行是xml文件的声明,第二行的vs命名空间的声明

2.2.2 类型指定

Type 标签是用来指定需要可视化类型的标签,他有一个属性是Name用来指定要自定义可视化的类型

如要指定我们刚才的Marray类型

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"></Type>
</AutoVisualizer>
2.2.3 顶级可视化显示

DisplayString标签是用来显示变量标签用的。
如遇到 Marray 我就让vs显示 hello array

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"><DisplayString>hello array</DisplayString></Type>
</AutoVisualizer>

vs中的展示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1SSxxuVW-1656169374284)(./4.png)]

DisplayString 可以显示这个结构体成员的值 只需要在成员变量上加上 '{}'就可以转义

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"><DisplayString>size={length}</DisplayString></Type>
</AutoVisualizer>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3m6uep5H-1656169374284)(./5.png)]

2.2.3 类型展开

Expand 是用来做类型展开的标记

Item 是Expand的子标记可以用来展示一个项

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"><DisplayString>size={length}</DisplayString><Expand><Item Name="[size]">length</Item><Item Name="test">"hello"</Item></Expand></Type>
</AutoVisualizer>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wmc8JGN-1656169374285)(./6.png)]

可以看到Item标签的Name属性是展开项的名称,item的值不能像DisplayString可以用{}展开变量,item标签只能显示一个值,这个值可以是成员变量(这个不能加{})

2.2.3.1 连续内存的展开

ArrayItems是连续内存的列表展开,只需要内存的指针和数组大小就行
这个标记很适合现在的Marray结构的展开

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"><DisplayString>{{ size={length} }}</DisplayString><Expand><Item Name="[size]">length</Item><ArrayItems><Size>length</Size><ValuePointer>data</ValuePointer></ArrayItems></Expand></Type></AutoVisualizer>

ValuePointer标签是填内存的值
size是数组的大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9GIr7L6-1656169374285)(./3.png)]

2.2.3.2 程序展开

CustomListItems 是可执行程序的展开的标签
Exec 标签可以执行程序
Loop 循环
Break 跳出循环
Variable 定义变量
Condition 属性是条件属性

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="Marray"><DisplayString>{{ size={length} }}</DisplayString><Expand><CustomListItems><Variable Name="i" InitialValue="0"/><Loop><Break Condition="i &gt;= length"/><Item Name="[{i}]">data[i]</Item><Exec>i = i + 1</Exec></Loop></CustomListItems></Expand></Type>
</AutoVisualizer>
2.2.4 自定义展开子元素

可以创建人工子元素,这个标签要在标签中使用

我们定义一些测试结构

#define ARRAYSIZE	3struct Marray
{int *data;int length;
};struct MStruct
{int test;struct Marray _arr1;struct Marray _arr2;
};

我们需要将MStruct结构展开

测试代码

int main(int argc, char* argv[])
{struct MStruct m;m._arr1.data = (int*)malloc(sizeof(int) * ARRAYSIZE);m._arr1.length = ARRAYSIZE;m._arr2.data = (int*)malloc(sizeof(int) * ARRAYSIZE);m._arr2.length = ARRAYSIZE;m._arr1.data[0] = 1;m._arr1.data[1] = 2;m._arr1.data[2] = 3;m._arr2.data[0] = 4;m._arr2.data[1] = 5;m._arr2.data[2] = 6;printf("hello word\n");return 0;
}

结构展开的编写

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="MStruct"><Expand><Item Name="test">test</Item><Synthetic Name="_arr1"><DisplayString>{{size = {_arr1.length}}}</DisplayString><Expand><Item Name="[size]">_arr1.length</Item><ArrayItems><Size>_arr1.length</Size><ValuePointer>_arr1.data</ValuePointer></ArrayItems></Expand></Synthetic><Synthetic Name="_arr2"><DisplayString>{{size = {_arr2.length}}}</DisplayString><Expand><Item Name="[size]">_arr2.length</Item><ArrayItems><Size>_arr2.length</Size><ValuePointer>_arr2.data</ValuePointer></ArrayItems></Expand></Synthetic></Expand></Type>
</AutoVisualizer>

Synthetic 标签可以自定义自己的标签,对比item标签,Synthetic 标签可以有自己的DisplayString顶层视图和Expand的展开项。理论上使用这个可以无线递归子结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQB3Sl8F-1656169374286)(./8.png)]

官方文档

https://docs.microsoft.com/zh-cn/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2022

这篇关于vs natvis编写,自定义vs中变量的展示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179833

相关文章

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,