你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速。理想情况下,通过特定的属性值快速定位它们会很棒。对我们来说幸运的是,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. 第04组 Beta版本演示

    小组信息 组名:斗地组 组长博客:地址 组内成员: 组员 学号 林涛(组长) 031702616 童圣滔 031702117 林红莲 031702213 潘雨佳 031702214 覃鸿浩 03170 ...

  2. Python中的模块引用机制

    一.模块引用 Def: 在Python 程序中使用另一个文件定义的类(方法).函数.数据等 被引用模块位置.通常 Python2 : "/Library/Python/2.7/site-pa ...

  3. java之集合(Set、List、Map)

    java集合类存放于java,uti包中,是一个用于存放对象的容器. 集合只能存放对象,比如存入的是int型数据1,那么它会自动转换成Integer包装类后再存入: 集合存放的是多个对象的引用,对象本 ...

  4. [python / selenium] - 用python刷公选课是一种什么体验?

    前言 看公选课还是能学到很多知识的,这里是给大家提供一个selenium的使用思路(好好学公选课,我真的看了) 思路 当观看者移动鼠标到某一范围时就会停止播放,就让selenium一直将鼠标悬停在视频 ...

  5. HTML5 3D 在智慧物业/地产管理系统中的应用

    概述 该博文主要展示采用 HT for Web 提供的可视化技术,对智慧房产.智慧物业相关方向的可视化呈现做的一点尝试. 传统的 智慧房产/楼宇自动化/智慧物业 常会采用 BIM(建筑信息模型 Bui ...

  6. ASP.NET中使用附文本框插件

    使用附文本选项框插件步骤 Newtonsoft.Json 改变js的配置文件的url 最后一定要关闭页面中的 ValidateRequest=false

  7. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  8. [browser navigator 之plugins] 写了一个检测游览器插件

    检测IE插件 function hasIEPlugin(name){ try{ new ActiveXObject(name); return true; }catch(ex){ return fal ...

  9. selenium时间等待方法

    在UI自动化测试中,必然会遇到环境不稳定.网络慢等情况.当你觉得定位没有问题,但程序却直接报了元素不可见时,那你就需要思考是否因为程序运行太快或者页面加载太慢而造成了元素不可见,必须要再等待直至元素可 ...

  10. manjaro安装后的配置

    1.添加中科大源 参考https://blog.csdn.net/liyunfu233/article/details/87381017 sudo nano /etc/pacman.conf 在文末添 ...