Visual C++ 2015 中的可视化调试工具

[原文发表地址]Debug Visualizers in Visual C++ 2015

[原文发表时间] 2015/09/28 10:27 PM

当调试本地应用程序时,通常查看内存中具体对象的值非常有用,不论是自定义的字符串格式,甚至或是对数据执行操作,使其更有意义和更容易解释。自 VS2012,Visual Studio 提供了 .natvis 可视化工具设计来为不同类型的C/C++ 类型声明自定义可视化。可视化的类型改变了对象在本地表达式计算器的显示方式,包括在监视和变量窗口以及调试数据提示。额外关于表达式计算器的信息,参考这篇文档这篇博客.

编写简单的可视化工具

让我们从创建一个本地的Volcano类开始:

Using Namespace std;

class Volcano
{
private:
string m_EnglishName;
string m_nativeName;
string m_meaning;
int m_elevation;

//...rest of class definition

}

Natvis 项目模板

在VS2015中很容易用内置模板添加一个新的.natvis文件到一个工程,可以发现在添加新项目-实用 > 下-> 调试器可视化文件 (.natvis):

为了使我们Volcano对象更容易调试,我们将让显示字符串等于英文名字由于它是关联volcano对象中最好识别的实体。然后我们将创建一个扩展视图以显示所包含的成员。要删除前两个字符串的引号我们将在母语和英语的名字上应用到格式说明符,但会使它失去成员意义因为在调试时引号标记将有助于区分定义。因为我们整数 m_elevation 已经是清晰可读,我们将简单地列出这类变量,而无需修改。

下面是简单.natvis 可视化用于调试时根据需要在 c + + 表达式计算器显示我们Volcano对象。注意<DisplayString>节点上的大括号运算符,他会使值在应用程序调试时替换。这允许使用常规文本值以及调试对象中的值在输出。

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="https://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="Volcano">
<DisplayString>Name: {m_EnglishName,sb}</DisplayString>
<Expand>
<Item Name="Native name">m_nativeName,sb</Item>
<Item Name="Meaning">m_meaning</Item>
<Item Name="Elevation">m_elevation</Item>
</Expand>
</Type>
</AutoVisualizer>

Volcano对象的可视化的视图

一旦.natvis 文件集成到项目中, Volcano对象将在下面的可视化的监视窗口中所示。[原始视图] 节点可以展开很容易看到默认视图:

有关编写类型可视化工具里面.natvis 文件的更多信息,请查阅写作基本类型的可视化工具的完整文档

VS2015 中的新可视化功能

Natvis 文件的项目集成

如图所示,使用上面的模板和 VS2015 早期预览,.natvis 文件现在可以添加到项目或解决方案中并从中获益源代码,在构建未来消费的调试器能够链接到PDB的能力。除了个别的项目,对于.exe 项目,你也可以添加一个.natvis 文件作为高层解决方案的项目。手动将.natvis 文件拷贝到特殊目录下是不再必要的!

如果遇到同一类型的多个有效的条目,首先使用下面的列表:

  • PDB
  • Project/solution
  • User directory: %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers
  • Install directory: %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers

在调试时修改可视化工具

下面的动画演示了顶层对象的显示字符串从m_nativeName改变为m_EnglishName。对.natvis 文件的更改将立即被调试器检测到,并以红色文本显示差异:

改进的数组和向量调试

现在在表达式求值程序中支持[] 元素访问操作符,并且可以使用监视窗口以及在 .natvis文件的<ArrayItems>和 <IndexListItems> 元素. 这里有在监视窗口中的一个实例:

哈希表可视化CAtlMap

现在CATLMap 数据结构成员可以扩展为可视化的键和值对。

Natvis 诊断的改进

诊断问题在您自定义的.natvis 文件中是相对比较容易的。旧的 EnableNatvisDiagnostics 注册表开关已不再被使用。相反,现在你可以在工具-选项-调试-输出窗口 中启用 natvis 诊断工具,并选择其中一个选项:"关闭","错误"、"警告"和"详细",并将提供关于 XML 的解析失败的其他信息:

新的 Natvis 属性

" 可选 " 属性

•Any 节点可以具有"可选"属性。

• 如果任何子表达式的一个可选节点解析失败,只有将该节点抛出。其余的 <Type>条目仍然是有效的。先前对于这种类型的整个可视化将会失败。

•例如,你可能有一个只在调试配置中存在的成员,并且此功能允许您可以为条目跨越数据类型提供一个单一的.natvis 条目:

struct Foo
{
int i;
int j;
#if _DEBUG
std::string debugMessage;
#endif
};

 

<Type> " 继承 " 属性

· In VS2013,每个natvis条目不仅适用于指定的类型,还适用于所有派生类型。

· 大多数的时间,是基于反馈,但是有时是不可取的。(例如: 你可能想查看没有掩盖它的基对象的 natvis 派生对象的原始成员)

· In VS2015,"可继承"属性允许您控制此行为。默认值为"true"。如果为 false,natvis 条目只适用于基类。

" 优先级 " 属性

· "低","中低“ "中等","中高" "高",默认是"中等"

· 凡文件来自 (项目、 用户目录、 安装目录) 胜过优先级属性

· 示例: std::vector VS2013 声明"中低"优先默认情况下,使用 VS2015 版本,即使两个仍在维持传统的调试支持的可视化的文件中定义。针对旧的v120的工具集,如果你想要利用遗留的可视化工具,VC2013实现切换到”中高“ 或”高“, 这将覆盖中等默认优先级v140实施。

 

Android 的调试

VS2015 介绍了支持开发和调试 c + + Android 应用程序,通常包括基本.natvis 对许多常用 stl 容器支持

Natvis 的其他改进

·<IncludeView>和 <ExcludeView>现在可以使用 <Type>级别,而不是只对单个元素

· <CustomVisualizer>节点现在可以指定"条件"、"IncludeView"或"ExcludeView"属性

· Natvis 作用于自动窗口的函数返回值

· Natvis 作用于优化成一个寄存器结构

· 当natvis 条目递归引用其他的 natvis 条目时改进健壮性

未来的博客文章将讨论更高级的调试可视化工具Visual Studio中可用的选项。