VS2019调试查看变量_你很可能需要知道这个调试小技巧

be342ece1750336151c07315ab5d473d.png

缘起

最近在调试的时候,需要观察第三方容器中每一个元素的值。默认情况下,vs 并不知道如何显示第三方容器的内容,只能手动观察容器中的每一个值,超级不方便。我找到一个非常给力的好办法,你还知道其它好办法吗?

为了更直观的感受这种便利,我特意截图对比了三种常用的观察变量的方法。

直接观察

1、通过 vs 的悬浮提示观察。

小贴士:把鼠标移动到对应的变量即可。

c5e98fc7aa73123ac48c4b1b6a4eccc7.png

可以发现,现在 vs 并不知道如何解析 pts 的内容,只能 “傻傻” 的显示出 bvector 中的三个成员。

2、通过 watch 窗口观察。

小贴士:可以使用快捷键 ctrl + alt + w, 1 来打开第一个 watch 窗口。据我观察,最多支持 4watch 窗口。

121dd6556c668945777f5cf4d1fb2de9.png

可以发现,我们可以在代码中使用的 at(index)[index] 已经失效了,只能使用蹩脚的 (pts._C_alloc)._C_begin + index 来观察对应的变量(反人类,有木有)。

你也许好奇,我是怎么知道可以使用 (pts._C_alloc)._C_begin + index 来观察的,简单!在悬浮提示中,右键,复制表达式(X),如下图:

b1516633663244a7776f1df1dd63c4ed.png

3、通过 quick watch 窗口观察。

小贴士:可以选中要观察的变量,然后按快捷键 shift + f9 打开快速监视窗口。

dae66bc5128f443bf9d699c6b68daa57.png

同样,没什么用。

难道只能这么低效吗?vs2012 之前是的,但是事情从 vs2012 发生了变化。从 vs2012 开始,vs 支持通过 natvis 来观察变量,超级方便。

话不多说,开启 natvis 后再使用上面的三种方法观察同样的变量。

开启 natvis 后观察

1、通过 vs 的悬浮提示观察。

fcd608bd1c845b692f9465138e875492.png

2、通过 watch 窗口观察。

128f466ee5b772281d4732c0938954f4.png

3、通过 quick watch 窗口观察。

bf33077ab21393c97513e1211e932dd5.png

有木有很方便?要是很多元素要观察(比如,有 128 或者 1024 个),是不是可以节省很多时间?

如何开启

可以自己编写 .natvis文件并放到指定目录下,重启 vs 后即可加载。请原谅我比较懒,直接从官方文档上摘录了一段,更多内容可以参考文末给出的参考链接。

搜索位置及顺序转载如下[1]

If multiple valid entries are encountered for the same type, the first one in the following list will be used:
  • PDB
  • Project/solution
  • User directory: %USERPROFILE%My DocumentsVisual Studio 2015Visualizers
  • Install directory: %VSINSTALLDIR%Common7PackagesDebuggerVisualizers

我放到了 %USERPROFILE%My DocumentsVisual Studio 2013Visualizers 下。

7412ae9c50831ee21b403cc0090e8035.png

提示

在高版本的 vs 中(vs2017/vs2019vs2015 没亲自确认),可以自动重新加载修改的 .natvis 文件内容,但是 vs2012/vs2013 并不支持动态加载。

排错

如果 natvis 加载有问题,可以通过设置注册表开启诊断信息[2]

[HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio11.0_ConfigDebugger]
"EnableNatvisDiagnostics"=dword:00000001

windbg 中的 natvis

windbg 中也可以使用 dx 命令来进行一些高级查看(超级超级厉害的 dx 命令),具体参考 defrag tools 上的视频。

  • Defrag Tools #138 - Debugging - 'dx' Command Part 1[3]
  • Defrag Tools #139 - Debugging - 'dx' Command Part 2[4]

最后,附上文中用到的 .natvis 文件,大家可以做个参考。

示例

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><!--from bvector --><Type Name="Bentley::Bstdcxx::bvector&lt;*&gt;">  <DisplayString>{{size = {_C_alloc._C_end - _C_alloc._C_begin}}}</DisplayString>  <Expand>  <Item Name="[size]">_C_alloc._C_end - _C_alloc._C_begin</Item>  <Item Name="[capacity]">(_C_alloc._C_bufend - _C_alloc._C_begin)</Item>  <ArrayItems>  <Size>_C_alloc._C_end - _C_alloc._C_begin</Size>  <ValuePointer>_C_alloc._C_begin</ValuePointer>  </ArrayItems>  </Expand>  </Type>
</AutoVisualizer>

总结

  • 调试时,鼠标悬停到对应的变量上可以通过悬浮提示观察变量的值。
  • 使用 ctr + alt + w,1 可以快速打开 watch 1 窗口。
  • 鼠标悬浮到变量上,按 shift + f9 可以打开快速观察窗口。
  • .natvis 文件可以让我们个性化的观察变量,可以极大的提高我们的调试效率。
  • 在高版本的 vs 中,我们甚至可以动态编辑 .natvis 文件的内容,更加灵活的观察变量。
  • windbg 中的 dx 命令,可谓神器,但是本文并未介绍,感兴趣的小伙伴儿可以直接看视频!

参考资料

  • https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/
  • https://blogs.msdn.microsoft.com/vcblog/2014/06/12/project-support-for-natvis/
  • https://docs.microsoft.com/en-us/cpp/build/reference/natvis-add-natvis-to-pdb?view=vs-2017
  • https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2017
  • https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode
  • https://stackoverflow.com/questions/17811628/user-defined-natvis-files-in-visual-studio-2012

参考资料

[1] 搜索位置及顺序转载如下: https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/

[2] 开启诊断信息: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode

[3] Defrag Tools #138 - Debugging - 'dx' Command Part 1: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-138-Debugging-dx-Command-Part-1

[4] Defrag Tools #139 - Debugging - 'dx' Command Part 2: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-139-Debugging-dx-Command-Part-2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux i2c子系统驱动probe

I2C 子系统I2C 子系统使用的概率非常大&#xff0c;我之前有做过手机的经验&#xff0c; 手机跑的安卓系统&#xff0c;内核是Linux&#xff0c;手机的很多器件都是用I2C通信的&#xff0c;我经历过从板级设备到dts设备树的阶段&#xff0c;知道I2C在整个系统的举足轻重&#x…

java生成flash_web-flash发布了代码生成插件

web-flash 是一个基于 Spring BootVue.js 的后台管理系统。现在发布了其基于 Intellij IDEA 的代码生成插件!你可以再 idea 插件仓库中搜索 webflash-generator (目前插件在发布审核中&#xff0c;可能会搜索不到)&#xff0c;或者直接从本地安装插件&#xff1a;flash-generat…

JAVA多线程程序ProgressBar

JAVA多线程程序ProgressBar 题目简介&#xff1a; 思维导图&#xff1a; 实验代码&#xff1a;建议先看CalThread类&#xff0c;计算线程的实现&#xff0c;再作基本CalFrame类的界面&#xff0c; 然后作ReadThread类&#xff0c;结合CalFrame的组件&#xff0c;最后完善CalFra…

为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?

关于C语言的goto语句存在很多争议&#xff0c;很多书籍都建议“谨慎使用&#xff0c;或者根本不用”。Linux之父Linus在Linux中大量使用goto&#xff0c;也是在启示着我们可以合理使用goto语句。存在即合理&#xff0c;既然是C语言中的一个知识点&#xff0c;我们还是有必要学会…

python特征匹配 查找_特征匹配+单纯形查找对象

我尝试使用opencv获取一个查询图像并在一个基本图像中进行匹配。我看了一下在线教程&#xff0c;你看&#xff0c;他们有示例代码来做这件事。所以我复制并粘贴了代码&#xff0c;并尝试用一些试用图像来运行它。下面是代码和一组图像示例。在import numpy as npimport cv2from…

python数据类型有哪些、分别有什么用途_python中的数据类型有哪些

python中的数据类型有9种&#xff0c;分别是1、字符串2、布尔类型3、整数4、浮点数5、数字6、列表7、元组8、字典9、日期。1、字符串 1.1、如何在Python中使用字符串 a、使用单引号() 用单引号括起来表示字符串&#xff0c;例如&#xff1a;strthis is string; print str; b、使…

java access jdbc_Java连接Access数据库

JDBC(Java DataBase Connectivity)是Java数据库连接API。JDBC能完成与一个数据库建立连接&#xff0c;然后向数据库发送SQL语句&#xff0c;再处理数据库返回的结果。JDBC在设计上和ODBC相似。JDBC和数据库建立连接的一种方式是首先建立起一个JDBC-ODBC桥接器。首先安装office2…

五分钟搞懂什么是红黑树(全程图解)

红黑树&#xff0c;对很多童鞋来说&#xff0c;是既熟悉又陌生。熟悉是因为在校学习期间&#xff0c;准备面试时&#xff0c;这是重点。然后经过多年的荒废&#xff0c;如今已经忘记的差不多了。如果正在看文章的你&#xff0c;马上快要毕业&#xff0c;面临着找工作的压力&…

SequenceFile文件

SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。目前&#xff0c;也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案&#xff0c;他们的基本思路就是将小文件进行合并成一个大文件&#xff0c;同时对这些小文件的…

win10右键闪退到桌面_WIN10设置闪退,桌面右键个性化显示设置等均无效

开始菜单点击设置&#xff0c;会报错&#xff0c;详细信息记不清了&#xff0c;提示路径C:\Windows\ImmersiveControlPanel\SystemSettings.exe&#xff0c;使用fix it修复工具无效尝试更新系统&#xff0c;更新至最新版本后仍然存在问题事件管理器中找到了这个错误应用程序名称…

Linux 内核红黑树分析

Android binder 内核实现是用红黑树的&#xff0c;理解红黑树我觉得是每一个Linux er的重中之重&#xff0c;感谢格子森同学的投稿&#xff0c;周末愉快。内核版本为 linux4.2.1 本文主要从红黑树的代码实现入手&#xff0c;来讨论linux内核中是如何实现红黑树的(主要是插入和删…

postgresql数据库安装及简单操作

自从MySQL被Oracle收购以后&#xff0c;PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法&#xff0c;供初次使用者上手。以下内容基于Debian操作系统&#xff0c;其他操作系统实在没有精力兼顾&#xff0c;但是大部分内容应该普遍适用。 一、安…

周末随想,野路子

焦虑不知道是不是因为科技太发达的原因&#xff0c;晚上睡觉之前总是要看看手机&#xff0c;现在写公众号之后&#xff0c;也经常有读者问问题&#xff0c;总是担心错过哪条消息&#xff0c;所以时刻想看手机&#xff0c;而且因为太过于焦虑的原因&#xff0c;我把微信设置为静…

sizeof你真的弄明白了吗?

sizeof基础在C语言中&#xff0c;sizeof是一个操作符&#xff08;operator&#xff09;&#xff0c;而不是函数&#xff01;其用于判断数据类型或者表达式长度&#xff08;所占的内存字节数&#xff09;。其有两种表达形式&#xff1a;&#xff08;1&#xff09;sizeof(类型说明…

一道90%都会做错的指针题

今天&#xff0c;在我们的一个小群里&#xff0c;一个同学发了一道题目给我看&#xff0c;这道题目应该是C语言面试的一股清流了&#xff0c;各种招聘笔试上都可以看到&#xff0c;我试着发到我的大群里去&#xff0c;发现有人对这个理解不是很深刻&#xff0c;所以再发出来&am…

python调用arcgis_arcgis python 调用工具两种两种方法

原博文 2019-09-20 11:26 − arcpy.Select_analysis("p","kk") arcpy.analysis.Select("p","kk1") ... 相关推荐 2019-12-18 20:28 − import time import wmi, zlib def get_cpu_info(): tmpdict {} tmpdict["CpuCores"] …

ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法

MySQL中Multiple primary key defined报错的解决办法创建主键可以有两种方式&#xff1a;create table 表名(字段名 类型&#xff0c;字段名 类型&#xff0c;……primary key(name));或者是create table 表名(字段名 类型 primary key&#xff0c;字段名 类型&#xff0c;………

Android ANR视角InputDispatcher

作者&#xff1a;王小二前言有好多人向我咨询过Input ANR问题&#xff0c;说实话&#xff0c;我也是一直无法彻底的解释清楚&#xff0c;我下决心要彻底搞懂这块知识点。话不多说先上图一个event的正常流程InputReader线程1.InputReader线程一旦发现有新的event&#xff0c;判断…

频繁跳槽,这谁顶得住~

最近应该是校招的时候&#xff0c;相信很多人都面临择业的问题&#xff0c;正念同学的文章&#xff0c;记录了自己一个嵌入式工程师这几年找工作换工作的经历。加我好友的都知道&#xff0c;我这几天发了一个朋友圈&#xff0c;说不要乱跳槽&#xff0c;我想表达的是&#xff0…

java script object_javascript Object与Array用法

引用类型&#xff1a;引用类型是一种数据结构&#xff0c;用于将数据和功能组织在一起。引用类型的值是引用类型的一个实例。一、ObjectECMAScript中的对象其实就是一组数据和功能的结合。Object类型其实是所有它的实例的基础&#xff0c;换句话说&#xff0c;Object类型所有具…