用Natvis定制C++对象在Visual Studio调试时如何显示
我在之前的博客定制自己的Visual Studio的Debugger Visualizer和如何把 Visutal studio中的“print-on-breakpoint”消息打印在程序的任何地方中介绍过如何用Debugger Display Attributes来定制C#的对象在Visual Studio调试时如何显示,今天介绍一下如何通过Natvis对C++的对象做类似的事情。
首先看我们的示例的C++代码,一个类是用户,有一个成员变量是姓名,一个成员变量是懂得的技术。Main函数就是创建这个类的对象,并且赋值。
1 | class User |
在Main函数return
的那一行打个断点,并且把u
和u2
加到Watch窗口,我们可以看到在Visual Studio中显示如下,这就是Visual Studio默认显示一个对象的方式。
为了让这个对象显示的更加友好,我们可以写一个Natvis文件,告诉Visual Studio如何显示这个对象。我们的Natvis内容如下:
1 |
|
在这个Natvis中:
Type
的Name
表明这个Natvis针对那个对象,如果有namespace的话需要用::
隔开,比如Windows::UI::Xaml::Controls::TextBox
。也可以使用通配符*。DisplayString
表明这个对象应该怎么显示。可以使用成员变量,但是不能调用方法,因为调用方法有可能会有副作用。DisplayString
可以有条件判断,比如在这个例子中如果m_Skills
的大小是0,就输出没有技能,如果不是0,就输出有几项技能。Expand
用来表明如果展开这个对象,怎么显示。在这个例子中通过ArrayItems
来把vector的每个元素都显示出来。- 还有一些别的用法,比如可以用
UIVisualizer
来定制一个图像显示,就和我之前的那篇博文效果一样了。
把这个Natvis存放在如下位置,Visual Studio就能找到了,每次修改之后不需要重启Visual Studio,只需要重新运行一次Debug就行了。1
2%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers (requires admin access)
%USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\
如果发现没有起作用,可以在注册表中加入如下的键值,这样在Visual Studio的Output窗口就可以看到加载Natvis时的错误信息了。1
2[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\Debugger]
"EnableNatvisDiagnostics"=dword:00000001
加上这个Natvis之后,在Visual Studio中就可以看到如下的显示了。