你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速。理想情况下,通过特定的属性值快速定位它们会很棒。对我们来说幸运的是,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. [译]Vulkan教程(21)顶点input描述

    [译]Vulkan教程(21)顶点input描述 Vertex input description 顶点input描述 Introduction 入门 In the next few chapters ...

  2. IT兄弟连 HTML5教程 HTML5表单 HTML表单设计2

    5  隐藏域 隐藏域不会在表单中显示.如果需要在页面之间传递重要数据,则在<input>标签中设置type属性值为“hidden”建立一个隐藏域.name和value属性是必需的,用来表示 ...

  3. RAC数据库的ORA-27123: Unable To Attach To Shared Memory Segment Linux-x86_64 Error: 22: Invalid argument

    RAC数据库的 ORA-27123: Unable To Attach To Shared Memory Segment Linux-x86_64 Error: 22: Invalid argumen ...

  4. C sharp #002# 结构化编程基础

    饮水思源:金老师的自学网站.C# Guide 索引 变量与数据类型 C#中For each的写法 C#控制台程序编程技巧 简易图片浏览器 BigInteger以及浮点数的比较 一.变量与数据类型 us ...

  5. java遍历request.getParameterMap()中的值

    在开发过程中发现request对象有提供一个request.getParameterMap()方法可以获取到从前端请求发送的参数Map. 但是在使用get()方法通过key(键)去获取这个参数Map中 ...

  6. Selenium(二):选择元素的基本方法

    1. 选择元素的基本方法 对于百度搜索页面,如果我们想自动化输入爱编程的小灰灰,怎么做呢? 这就是在网页中,操控界面元素. web界面自动化,要操控元素,首先需要选择界面元素 ,或者说定位界面元素 就 ...

  7. Add a Simple Action添加简单按钮

    In this lesson, you will learn how to create a Simple Action. For this purpose, a new View Controlle ...

  8. pip方式安装Jupyter

    pip方式安装Jupyter 如你的cmd命令窗口无法识别pip命令,请配置下环境变量(将python的''Scripts''文件夹路径添加至''path''变量里面). 使用以下命令更新pip和安装 ...

  9. dedecmsV5.7 调用其他站点的数据库的数据的方法

    问题:网站是用dedecmsv5.7写的,后来加了一套论坛discuzX3.4.因为dede要调用dz的数据,本来用jsonp跨域请求的数据,但是m端掉用的时候会把请求的链接的域名后面自动加个/m(不 ...

  10. raspberry-gpio-python(树莓派GPIO与Python编程)

    国外的设计接口设计得很棒,包括问题:读脏与防抖,还包括读这个数据提供了两种方式,一种是阻塞等待方式,还有一种是回调函数,前一种是通讯中常用的方式,后一种来自系统架构设计的整体性考虑.这种硬件接口设计的 ...