自定义Visual Studio调试器中的对象显示方式
你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速。理想情况下,通过特定的属性值快速定位它们会很棒。对我们来说幸运的是,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调试器中的对象显示方式的更多相关文章
- 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求. 内容 查找符号 (.pdb) 文件 查找源文件 查找符号 (.pdb) 文件 说明 在之前的 Vis ...
- 在Visual Studio调试器中显示Unreal的数据类型的值
转自:https://blog.csdn.net/witton/article/details/5977766 在Unreal引擎中大量使用了自定义的数据类型如:FName,FString,TArra ...
- C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)
两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...
- 使用 Visual Studio 调试器附加到运行的进程
为什么调试附加进程? Visual Studio 调试器可以附加到在 Visual Studio 外运行的进程. 可以使用此附加功能执行以下操作: 调试并非在 Visual Studio 中创建的应用 ...
- Visual Studio调试器指南---多线程应用程序调试(一)
线程是操作系统向其授予处理器时间的指令序列. 在操作系统中运行的每个进程都包含至少一个线程. 包含多个线程的进程称为多线程.有多个处理器.多核处理器或超线程进程的计算机可以同时运行多个线程. 使用多个 ...
- 【Asp.net入门4-02】使用Visual Studio调试器
- Visual Studio 调试系列9 调试器提示和技巧
系列目录 [已更新最新开发文章,点击查看详细] 01 固定数据提示 如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看. 即使在重新启动后,固定的变量也能 ...
- 12个Visual Studio调试效率技巧
在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...
- Visual Studio 调试系列10 附加到正在运行的进程
系列目录 [已更新最新开发文章,点击查看详细] 可将 Visual Studio 调试器附加到本地或远程计算机上正在运行的进程. 进程运行后,在 Visual Studio 中选择“调试” & ...
随机推荐
- Luogu P1583 魔法照片
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- Java题库——Chapter6 一维数组
1)What is the representation of the third element in an array called a? 1) _______ A)a(3) B) a(2) C) ...
- python 使用tesseract进行图片识别
from PIL import Image import pytesseract text = pytesseract.image_to_string(Image.open(r'E:\guo\2432 ...
- Android开发与Sequoyah的安装问题
首次接触Android开发,在搭建开发环境时遇到困难,写出来和大家分享分享. 使用的ide为捆绑了adt插件和android sdk的eclipse adt bundle,无需安装android sd ...
- ListenAndServe源码剖析
使用goland追踪阅读ListenAndServe源码,剖析服务器启动流程 ListenAndServe阅读 func ListenAndServe(addr string, handler Han ...
- SQL Serve里DBA要去改变的3个配置选项
用安装向导安装了全新的SQL Server,最后你点击了完成按钮.哇噢~~~现在我们可以把我们的服务器进入生产了! 抱歉,那并不是真的,因为你的全新SQL Server默认配置是未优化的,一个合格的D ...
- webpack打包 The 'mode' option has not been set, webpack will fallback to
webpack 打包报错 The 'mode' option has not been set, webpack will fallback to 'production' for,Module no ...
- Linux uevent分析、用户接收uevent以及mdev分析
关键词:uevent.netlink.ADD/REMOVE/CHANGE.uevent_helper.hotplug.usermode helper.mdev.mdev.conf等等. 本文从三方面了 ...
- Octave移动数据
A=[1 2;3 4;5 6] size(A) 会返回(3,2) length(A) 会返回矩阵的维度 =3 pwd :查看当前Octave的路径 cd D:/... :改变Octave的 ...
- Octave中的矩阵常用操作2
sum(a):矩阵里的数据求和prod(a):乘积floor(a):向上取整ceil(a):向下取整max(A,[],1):取每一列的最大值max(A,[],2):取每一行的最大值max(max(A) ...