缘起

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

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

直接观察

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

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

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

2、通过 watch 窗口观察。

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

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

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

3、通过 quick watch 窗口观察。

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

同样,没什么用。

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

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

开启 natvis 后观察

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

2、通过 watch 窗口观察。

3、通过 quick watch 窗口观察。

有木有很方便?要是很多元素要观察(比如,有 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 Documents\Visual Studio 2015\Visualizers

  • Install directory: %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers

我放到了 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers 下。

提示

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

排错

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

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger]
"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

References

[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

需要你的

你很可能需要知道这个调试小技巧相关推荐

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

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

  2. 调试小技巧---利用调用堆栈

    2019独角兽企业重金招聘Python工程师标准>>> 调试小技巧---利用调用堆栈 如图:在解决bug的时候,不能确定下一步程序执行到哪,可以利用Xcode中的调用堆栈  来快速查 ...

  3. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  4. 11个强大的Visual Studio调试小技巧

    伯乐在线注:我们在@程序员的那些事 微博上推荐了英文原文,感谢@halftone_被禁用了的热心翻译. 简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍 ...

  5. 遇到BUG手足无措?还不快进来学习调试小技巧!

    目录 一.什么是BUG? 二.调试是什么? 调试的基本步骤 Debug和Realease的介绍 三.调试的具体方法 调试中的快捷键 查看临时变量的值 调试的实例 四.如何写出优秀(易于调试的代码) 常 ...

  6. 我从别人那里偷学的前端调试小技巧(浏览器篇)

    发现光,欣赏光,学习光 每个人身上都有着不同的闪光点,把焦点凝结在缺点上只会让互相难过.转移焦点,放在他的优点上,你会发现,唔还不错.而且,你还可以学习它,让你变得更棒.(我越来越擅长写鸡汤了???? ...

  7. 一些Chrome 调试小技巧汇总

    写在前面 本文包括浏览器调试,不包括web移动端调试. 本文调试均在chrome浏览器进行 alert 这个不用多说了,不言自明 console 基本输出 想必大家都在用console.log在控制台 ...

  8. 你不知道的 IDEA Debug 调试小技巧!

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来自:http://suo.im/4vlcHB 1.多线程 ...

  9. VS2010调试小技巧

    在VS下做开发的时候我们进行调试的时候路径是这个样子的:http://localhost:端口号/项目名称/index.aspx 但是发布到服务器上面的时候却是这个样子的:http://www.xxx ...

最新文章

  1. 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板
  2. .so 依赖目录 cmake_CMAKE最全实战(2)
  3. ITFriend创业败局(四):菜鸟CEO的自我修养
  4. 编写Eclipse插件教程–第1部分
  5. php三个表格,phpspreadsheet-excel工作表中有多个“格式为表”的表
  6. DIV块中 元素垂直居中
  7. springBoot微信支付(native)基本使用
  8. 【人脸识别】基于matlab GUI PCA算法人脸识别门禁系统【含Matlab源码 1777期】
  9. JAVA与js加密解密我常用的方法
  10. 2021-05-15 SqlServer面试题 通用篇
  11. 【QBKbupt】洛谷P2525Uim的情人节礼物·其之壱
  12. sqlplus命令连接oracle数据库,sqlplus命令行登录oracle数据库的N种方法盘点
  13. 软件产品上线的基础知识
  14. 德州学院计算机专业地址,德州学院 计算机系 谢延红老师简介 联系方式 手机电话 邮箱...
  15. Makefile的常见错误信息
  16. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
  17. 参加中国移动开发者大会有感
  18. 手机应用开发的原生app,WEBAPP,混合app的认识
  19. h5获取当前浏览器ip和城市名称
  20. 奢潮自信即刻拥有,KOREANO ESSENTIAL春夏系列上市

热门文章

  1. Oracle笔记 三、function 、select
  2. iio Engine logoHTML5 应用框架 iio Engine
  3. easy html5 - Jquery mobile
  4. 极速理解设计模式系列:2.观察者模式(Observer Pattern)
  5. AJAX+JavaScript无刷新检查用户名
  6. Bye Bye Embed-再见了Embed,符合web标准的媒体播放器代码
  7. 小程序禁用ios 左右滑动_如何在使用应用程序时禁用iOS控制中心
  8. JavaScript-client、offset、scroll、定时器
  9. python - work3
  10. 深入剖析Redis系列(五) - Redis数据结构之字符串