Contents

我在之前的博客定制自己的Visual Studio的Debugger Visualizer如何把 Visutal studio中的“print-on-breakpoint”消息打印在程序的任何地方中介绍过如何用Debugger Display Attributes来定制C#的对象在Visual Studio调试时如何显示,今天介绍一下如何通过Natvis对C++的对象做类似的事情。

首先看我们的示例的C++代码,一个类是用户,有一个成员变量是姓名,一个成员变量是懂得的技术。Main函数就是创建这个类的对象,并且赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class User
{
public:
User(string name);
void AddSkill(string skill);

private:
string m_Name;
vector<string> m_Skills;
};

User::User(string name)
{
m_Name = name;
}

void User::AddSkill(string skill)
{
m_Skills.push_back(skill);
}

int _tmain(int argc, TCHAR* argv[])
{
User u("Dawei");
u.AddSkill("C++");
u.AddSkill("C#");

User u2("Tom");
return 0;
}

在Main函数return的那一行打个断点,并且把uu2加到Watch窗口,我们可以看到在Visual Studio中显示如下,这就是Visual Studio默认显示一个对象的方式。

为了让这个对象显示的更加友好,我们可以写一个Natvis文件,告诉Visual Studio如何显示这个对象。我们的Natvis内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="User">
<DisplayString Condition="m_Skills._Mylast - m_Skills._Myfirst == 0">{m_Name} has no skill!</DisplayString>
<DisplayString>{m_Name} has {m_Skills._Mylast - m_Skills._Myfirst} skills!</DisplayString>
<Expand>
<ArrayItems>
<Size>m_Skills._Mylast - m_Skills._Myfirst</Size>
<ValuePointer>m_Skills._Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>

在这个Natvis中:

  1. TypeName表明这个Natvis针对那个对象,如果有namespace的话需要用::隔开,比如Windows::UI::Xaml::Controls::TextBox。也可以使用通配符*。
  2. DisplayString表明这个对象应该怎么显示。可以使用成员变量,但是不能调用方法,因为调用方法有可能会有副作用。
  3. DisplayString可以有条件判断,比如在这个例子中如果m_Skills的大小是0,就输出没有技能,如果不是0,就输出有几项技能。
  4. Expand用来表明如果展开这个对象,怎么显示。在这个例子中通过ArrayItems来把vector的每个元素都显示出来。
  5. 还有一些别的用法,比如可以用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中就可以看到如下的显示了。

Contents