你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速。理想情况下,通过特定的属性值快速定位它们会很棒。对我们来说幸运的是,Visual Studio有两个不为人知的属性,即托管用户称为DebuggerDisplay,本地C ++用户称为Natvis。通过这些属性,您可以自定义在调试器窗口中查看对象的方式,例如Watch,Autos,Locals和datatips!

图1 - 带有和不带DebuggerDisplay属性的Locals和DataTips窗口附加到代码

什么是DebuggerDisplay属性?

通过在类的顶部编写DebuggerDisplay语法,您可以在调试器窗口中的每个对象节点的顶部选择所需的字符串和属性。除了在调试器窗口中显示字符串外,在DebuggerDisplay属性中添加花括号({})允许Visual Studio显示您指定的属性或方法的值。您还可以向DebuggerDisplay 添加格式说明符,以便进一步更改在调试器窗口中显示和格式化值的方式。在图2中,DebuggerDisplay附加格式说明符“nq”(无引号)。生成的显示将显示字符串属性Title而不包含周围的引号。

图2 - 添加到Book类顶部的Basic DebuggerDisplay语法

图3 - Locals窗口,上面的DebuggerDisplay语法添加到代码中

执行此任务的先前解决方法是覆盖类的ToString()方法。相比之下,DebuggerDisplay控制项目的显示方式而不 覆盖该方法。因此,如果您不想在ToString()方法中调试相关内容(特别是在实际程序中调用该方法时),那么DebuggerDisplay就是您的最佳选择!

我可以在调试器窗口中显示每个对象的表达式吗?

有时您可能希望在调试器窗口中显示表达式。好消息:您可以使用DebuggerDisplay属性显示表达式!

图4 - 包含表达式的DebuggerDisplay属性示例

图5 - 具有上述DebuggerDisplay语法和添加的表达式评估的Locals窗口

坏消息:在调试代码时,DebuggerDisplay表达式可能会导致其他问题。潜在问题包括大型或复杂表达式的性能命中,表达式语言与正在调试的语言不同时的编译和运行时错误,以及表达式变异属性时应用程序状态更改。

图6 - 添加了Visual Basic样式三元表达式语法的DebuggerDisplay属性

图7 - 在C#中调试时使用上面的Visual Basic样式语法后收到的运行时错误

但不要害怕!使用表达式减少这些潜在问题的一种方法是创建一个私有属性或方法,该属性或方法返回已执行表达式的字符串并告知DebuggerDisplay显示该属性。

图8 - 创建包含DebuggerDisplay引用的更复杂表达式和格式的私有属性

图9 - 创建一个包含DebuggerDisplay引用的更复杂表达式和格式的方法

与C ++用户的DebuggerDisplay等效的功能是什么?

DebuggerDisplay与C#,F#和Visual Basic兼容,但如果你在C ++中调试,Natvis是一个很好的选择!虽然不像在DebuggerDisplay类的顶部添加语法那么简单,但是将.natvis文件添加到项目中可以自定义对象的显示方式。

图10 - 在Locals窗口中使用Natvis的示例

在Solution Explorer中右键单击C ++项目节点,选择Add > New Item,然后选择Visual C ++> Utility> Debugger可视化文件(.natvis)。结果是一个XML文件,您可以在其中控制调试时显示的属性。

图11-对应于上面显示的显示的示例Natvis文件

要了解有关在调试C ++项目时使用Natvis的更多信息,请查看文档

这些功能非常棒,可以节省很多时间!如何帮助与其他人共享DebuggerDisplay和Natvis?

有趣的事实:DebuggerDisplay和Natvis属性已经在Visual Studio中使用多年了!这些属性对大多数开发人员非常有用,但仍然不像它们可以发现和众所周知的那样。因此,我们目前正在努力提供一种更简单的方法来更好地发现这些属性,您的反馈将有助于实现这一目标!请完成此调查,这将使我们能够在使用这些属性时提供改进的体验。

自定义Visual Studio调试器中的对象显示方式的更多相关文章

  1. 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件

    查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求.   内容 查找符号 (.pdb) 文件 查找源文件   查找符号 (.pdb) 文件 说明 在之前的 Vis ...

  2. 在Visual Studio调试器中显示Unreal的数据类型的值

    转自:https://blog.csdn.net/witton/article/details/5977766 在Unreal引擎中大量使用了自定义的数据类型如:FName,FString,TArra ...

  3. C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)

    两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...

  4. 使用 Visual Studio 调试器附加到运行的进程

    为什么调试附加进程? Visual Studio 调试器可以附加到在 Visual Studio 外运行的进程. 可以使用此附加功能执行以下操作: 调试并非在 Visual Studio 中创建的应用 ...

  5. Visual Studio调试器指南---多线程应用程序调试(一)

    线程是操作系统向其授予处理器时间的指令序列. 在操作系统中运行的每个进程都包含至少一个线程. 包含多个线程的进程称为多线程.有多个处理器.多核处理器或超线程进程的计算机可以同时运行多个线程. 使用多个 ...

  6. 【Asp.net入门4-02】使用Visual Studio调试器

  7. Visual Studio 调试系列9 调试器提示和技巧

    系列目录     [已更新最新开发文章,点击查看详细] 01 固定数据提示 如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看. 即使在重新启动后,固定的变量也能 ...

  8. 12个Visual Studio调试效率技巧

    在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...

  9. Visual Studio 调试系列10 附加到正在运行的进程

    系列目录     [已更新最新开发文章,点击查看详细] 可将 Visual Studio 调试器附加到本地或远程计算机上正在运行的进程. 进程运行后,在 Visual Studio 中选择“调试” & ...

随机推荐

  1. 移动端触发touchend后阻止click事件

    // vue里面简单的处理方式,可以同时兼容PC和移动端 <div @touchend.stop.prevent="doSomething" @click.stop.prev ...

  2. 解决spark dataframe get 报空指针异常 java.lang.NullPointerException

    Spark 编程读取hive,hbase, 文本等外部数据生成dataframe后,一般我们都会map遍历get数据的每个字段,此时如果原始数据为null时,如果不进行判断直接转化为string,就会 ...

  3. (转)阿里 RocketMQ 安装与简介

    原文:阿里 RocketMQ 安装与简介 一.简介 官方简介: l  RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: l  能够保证严格的消息顺序 l  提供丰富的消息拉取模式 l ...

  4. Android 亮度调节功能开发思路整理

    做 Android 音视频播放器开发的时候,我们基本都会遇到一类需求:音量 & 亮度 调节.其中做亮度调节功能的时候,发现还是有一定复杂度的. Android亮度调节分为两个类,分别是: An ...

  5. 更改 undo_retention 时,Lob retention 不更改 (Doc ID 563470.1)

    Lob retention not changing when undo_retention is changed (Doc ID 563470.1) APPLIES TO: Oracle Datab ...

  6. Linux第三章-Linux搭建Java环境

    本文安装系统是基于 CentOS 7 版本及以上 一.安装JDK 1.先去 Oracle官网 下载Linux1.8的版本以 .tar.gz 为后缀的文件,我这里用的是 jdk-8u181-linux- ...

  7. golang中的pflag示例

    现在晚上在家啃kubeadm的源码, 在啃源码前,pflag,viper,cobra这三件套好像是必须的, 那就先弄懂一下这三个套件的套路吧. 第一个,pflag. https://www.cnblo ...

  8. KVM使用总结

    目录 一.虚拟化介绍 二.通过kvm安装centos7系统 三.常用操作 虚拟机列表 开关机 导出虚拟机 重命名 挂起&恢复 查看某个虚拟机对应的端口 kvm开机启动 console登陆(失败 ...

  9. 关于sublime建立python工程的说明

    https://www.zhihu.com/question/22681628此链接说明的不错,可以参考. 为了方便使用sublime,难免要定义一些快捷键,https://www.whidy.net ...

  10. Redis思维导图

    Redis基本数据结构 1.String 1.1 数据结构 long len byte数组长度 long free 可用数组长度 char buff[] 数据内容 1.2 命令 键值:设置值通过字符串 ...