你很可能需要知道这个调试小技巧

简介: 你很可能需要知道这个调试小技巧

缘起

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

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

直接观察

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

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

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

2、通过 watch 窗口观察。

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

watch-in-watch-window.png

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

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

copy-watch-expression.png

3、通过 quick watch 窗口观察。

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

watch-in-quick-watch-window.png

同样,没什么用。

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

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

开启 natvis 后观察

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

watch-in-tip-with-natvis.png

2、通过 watch 窗口观察。

watch-in-watch-window-with-natvis.png

3、通过 quick watch 窗口观察。

watch-in-quick-watch-window-with-natvis.png

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

如何开启

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

搜索位置及顺序转载如下

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 下。

natvis-path.png

提示

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

排错

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

[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]
  • [Defrag Tools #139 - Debugging - 'dx' Command Part 2]

最后,附上文中用到的 .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<*>">  
  <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 命令,可谓神器,但是本文并未介绍,感兴趣的小伙伴儿可以直接看视频!

参考资料

相关文章
|
网络协议 数据处理
WebSocket协议基础
WebSocket协议基础
363 0
|
3月前
|
人工智能 自然语言处理 机器人
2026年阿里云OpenClaw(原Moltbot)零门槛部署指南:三大方式+百炼API配置实操
2026年,OpenClaw(原Moltbot/Clawdbot)作为阿里云生态下的明星零代码RPA平台,凭借与大语言模型的深度集成能力,成为办公自动化、智能客服、多平台协同场景的首选工具。它无需编写复杂脚本,通过自然语言指令即可实现邮件管理、文档处理、网页操作等自动化任务,更能打造具备持久记忆、主动执行功能的定制化AI助理,像“7×24小时不下班的AI员工”一样持续创造价值。
810 6
|
11月前
|
JSON 算法 Java
打造终端里的下载利器:Python实现可恢复式多线程下载器
在数字时代,大文件下载已成为日常需求。本文教你用Python打造专业级下载器,支持断点续传、多线程加速、速度限制等功能,显著提升终端下载体验。内容涵盖智能续传、多线程分块下载、限速控制及Rich库构建现代终端界面,助你从零构建高效下载工具。
699 1
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课15 集成DeepSeek等大模型
本文介绍了如何在PolarDB数据库中接入私有化大模型服务,以实现多种应用场景。实验环境依赖于Docker容器中的loop设备模拟共享存储,具体搭建方法可参考相关系列文章。文中详细描述了部署ollama服务、编译并安装http和openai插件的过程,并通过示例展示了如何使用这些插件调用大模型API进行文本分析和情感分类等任务。此外,还探讨了如何设计表结构及触发器函数自动处理客户反馈数据,以及生成满足需求的SQL查询语句。最后对比了不同模型的回答效果,展示了deepseek-r1模型的优势。
937 3
|
设计模式 API 数据处理
TICK 中Kapacitor功能和使用说明
TICK 中Kapacitor功能和使用说明
563 2
|
存储 数据挖掘 索引
Python streamlit框架开发数据分析网站并免费部署
使用Python的Streamlit框架,开发了一个在线数据分析工具,替代Excel查看设备温度CSV数据。通过pandas读取数据,matplotlib绘制图表。程序处理CSV,提取所需列,计算最大最小平均值,用户可多选查看特定数据。[GitHub](https://github.com/yigedaigua/MGHB)上有完整代码,应用已部署至Streamlit Cloud。
594 1
|
存储 前端开发 安全
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
这篇文章介绍了如何使用Supabase实现RESTful风格的API接口,用于网站分类和子站点的增删改查(CURD)功能。文章首先阐述了表设计,包括ds_categorys和ds_websites两张表的列名、类型和用途,并提到了为每张表添加的user_id和email字段以支持用户身份识别。接着,文章描述了接口设计,以ds_websites表为例,说明了如何通过RESTful API实现CURD功能,并给出了使用SupabaseClient实现插入数据的相关代码。文章最后提供了项目效果预览和总结,指出学习了Nuxt3创建接口及调用Supabase数据库操作。
624 0
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
|
程序员
汇编语言中的带符号比较跳转指令
汇编语言中的带符号比较跳转指令
1074 0
|
数据采集 数据挖掘
指标体系构建-03-交易型的数据指标体系
指标体系构建-03-交易型的数据指标体系