visual stdio调试中的数据类型可视化Debug Visualizers

前言

c++可以灵活自定义非常复杂的数据结构,比如标准库中的vector,map,还有很多是用户自定义的数据。通常调试器只能解释显示一些基本的数据变量,比如int,float,能够漂亮的显示标准库的那些类就算非常不错了,比如string。对于一些用户自定义的类型,往往调试器显示出来的变量值没有什么用,有时候就想能够自己自定义的方式友好的显示调试变量值。

之前vs是通过autoexp.dat的方式支持用户自定义显示变量值,如这篇博客所介绍的:Customize autoexp.dat for own types in VS2005。从visual studio2012开始,vs支持一种功能更加强大的数据类型可视化框架Debug Visualizers。我觉得非常有用,所以写一篇博客介绍一下。

介绍

我们先来感受一下Debug Visualizers强大的功能。下图是没有使用Debug Visualizers功能显示vector中的数据,很乱,找不到重点:

7534.image1.png-550x0

对比一下使用了Debug Visualizers再显示vector中的数据,非常友好,简洁,直观:

8512.image2.png-550x0

这个真的对我们调试程序查看变量的时候很有帮助,当你用windbg或者GDB查看乱成一团麻的变量值,如天书般的内存数据的时候,你会觉得vs的这个功能多么方便,多么幸福。

.natvis文件

vs之所以能够聪明向你显示变量的值,其实它是根据.natvis这个xml格式的文件的定义来操作的。一个典型的.natvis 文件格式如下:

其中 Type元素就是每个你要重新解释的类型。

我们把.natvis文件放到:

  • %VSINSTALLDIR%Common7PackagesDebuggerVisualizers
  • %USERPROFILE%My DocumentsVisual Studio 2012Visualizers

目录,每次启动调试会话的时候,vs都会从这里读取数据。也就意味着我们修改了.natvis文件之后不必重启vs,规则就可以生效。

我们编写.natvis有它自己的语法规则,有时候我们编写的.natvis有语法错误,那么显示对应类型变量的时候,vs还是用默认的规则去解释显示类型。如果你想知道.natvis到底哪里出现了错误,你可以在注册表里创建以下值打开诊断模式:

这样当出现错误的时候,会在vs的output窗口输出错误诊断信息,如下一个错误:

这个错误时因为无法计算width_1*height_的值,因为不存在width_1这个成员变量。

自定义Debug Visualizers规则

我们先写个例子代码:

显示变量的value

DisplayString字段是设置显示变量的value值,比如我想在value中显示MyRect的面积:

QQ20150527175851

比如就显示了变量a的面积为56,变量b的面积为0,则根据条件”width_ == 0 || height_ == 0″显示成empty。

DisplayString可以指定多个,还可以有Condition条件,从第一个开始,最先符合条件的DisplayString就生效显示出来。

对于成员值,可以用{}包裹表达式来显示值,如果想要显示{},则包含两个{},如:

StringView

除了用DisplayString显示值,还支持StringView指定显示的值,点击value后面的放大镜,会显示各种格式显示字符串值。

QQ20150527181648

子值

某些复杂数据类型是由其他复杂数据类型组成的,因此可以展开类型,查看其内部的其他组成子类型。比如:

QQ20150527212015

还可以显示数组类型的值:

QQ20150527213110

此外还可以显示链表结构,树状结构数据,这不一一说了。

可以参考https://code.msdn.microsoft.com/windowsdesktop/Writing-type-visualizers-2eae77a2,还有http://blogs.msdn.com/b/vcblog/archive/2013/06/28/using-visual-studio-2013-to-write-maintainable-native-visualizations-natvis.aspx。

发表评论

电子邮件地址不会被公开。 必填项已用*标注