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

缘起

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

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

直接观察

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

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

你很可能需要知道这个调试小技巧_第1张图片

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

2、通过 watch 窗口观察。

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

你很可能需要知道这个调试小技巧_第2张图片

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

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

你很可能需要知道这个调试小技巧_第3张图片

3、通过 quick watch 窗口观察。

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

你很可能需要知道这个调试小技巧_第4张图片

同样,没什么用。

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

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

开启 natvis 后观察

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

你很可能需要知道这个调试小技巧_第5张图片

2、通过 watch 窗口观察。

你很可能需要知道这个调试小技巧_第6张图片

3、通过 quick watch 窗口观察。

你很可能需要知道这个调试小技巧_第7张图片

有木有很方便?要是很多元素要观察(比如,有 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 下。

你很可能需要知道这个调试小技巧_第8张图片

提示

在高版本的 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 文件,大家可以做个参考。

示例



  
    
  {{size = {_C_alloc._C_end - _C_alloc._C_begin}}}  
    
    _C_alloc._C_end - _C_alloc._C_begin  
    (_C_alloc._C_bufend - _C_alloc._C_begin)  
      
      _C_alloc._C_end - _C_alloc._C_begin  
      _C_alloc._C_begin  
      
    
  

总结

  • 调试时,鼠标悬停到对应的变量上可以通过悬浮提示观察变量的值。

  • 使用 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

需要你的

你可能感兴趣的:(你很可能需要知道这个调试小技巧)