你很可能需要知道这个调试小技巧
缘起
最近在调试的时候,需要观察第三方容器中每一个元素的值。默认情况下,vs
并不知道如何显示第三方容器的内容,只能手动观察容器中的每一个值,超级不方便。我找到一个非常给力的好办法,你还知道其它好办法吗?
为了更直观的感受这种便利,我特意截图对比了三种常用的观察变量的方法。
直接观察
1、通过 vs
的悬浮提示观察。
小贴士:把鼠标移动到对应的变量即可。

可以发现,现在 vs
并不知道如何解析 pts
的内容,只能 “傻傻” 的显示出 bvector
中的三个成员。
2、通过 watch
窗口观察。
小贴士:可以使用快捷键
ctrl + alt + w, 1
来打开第一个watch
窗口。据我观察,最多支持4
个watch
窗口。

可以发现,我们可以在代码中使用的 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/vs2019
,vs2015
没亲自确认),可以自动重新加载修改的 .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
文件,大家可以做个参考。
示例
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<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_beginItem>
<Item Name="[capacity]">(_C_alloc._C_bufend - _C_alloc._C_begin)Item>
<ArrayItems>
<Size>_C_alloc._C_end - _C_alloc._C_beginSize>
<ValuePointer>_C_alloc._C_beginValuePointer>
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
需要你的