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

缘起

最近在调试的时候,需要观察第三方容器中每一个元素的值。默认情况下,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

需要你的

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

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

相关文章

List(C++模版实现的带哨兵的双向链表)

List(C模版实现的带哨兵的双向链表&#xff09; // // Created by 许加权 on 2021/7/10. //#ifndef C11LEARN_LIST_H #define C11LEARN_LIST_H template<typename T> class List { protected:class Node{public:Node *pre;Node *next;T key;Node(){}Node(const T key):k…

Java实现栈(顺序栈,链栈)

顺序栈&#xff1a; package SeqStack;public class Stack {private int top;private int base[];private int stackSize;public Stack(){stackSize 100;base new int[stackSize];top -1;}public Stack(int n){stackSize n;base new int[stackSize];top -1;}public bool…

全宇宙首本 VS Code 中文书,来了!

大家好&#xff01;我是韩骏&#xff0c;VS Code 中文社区创始人&#xff0c;VS Code 的代码贡献者。2013 年&#xff0c;毕业于上海交通大学软件学院&#xff0c;现在是微软开发平台事业部的软件工程师。写过 20 多款 VS Code 插件&#xff0c;其中最热门的 Code Runner 插件有…

用一个单链表L实现一个栈(算法导论第十章10.2-2题)

用一个单链表L实现一个栈&#xff08;算法导论第十章10.2-2题&#xff09; template<typename T> class HalfNode { public:T key;HalfNode* next; public:HalfNode(){next nullptr;};HalfNode(const T key):key(key){next nullptr;}; }; template<typename T> …

Java实现队列(循环队列,链队列)

循环队列: package SeqQueue;public class Queue {private int data[];private int queueSize;private int front,rear;public Queue(){data new int[100];queueSize 100;front rear 0;}public Queue(int n){queueSize n;data new int[queueSize];front rear 0;}publi…

C# 从1到Core--委托与事件

委托与事件在C#1.0的时候就有了&#xff0c;随着C#版本的不断更新&#xff0c;有些写法和功能也在不断改变。本文温故一下这些改变&#xff0c;以及在NET Core中关于事件的一点改变。一、C#1.0 从委托开始1. 基本方式什么是委托&#xff0c;就不说概念了&#xff0c;用例子说话…

用一个单链表L实现一个队列(算法导论第十章10.2-3)

用一个单链表L实现一个队列&#xff08;算法导论第十章10.2-3) template<typename T> class HalfNode { public:T key;HalfNode* next; public:HalfNode(){next nullptr;};HalfNode(const T key):key(key){next nullptr;}; }; template<typename T> class Singl…

开源导入导出库Magicodes.IE 多sheet导入教程

多Sheet导入教程说明本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入。要点多个相同格式的Sheet数据导入多个不同格式的Sheet数据导入主要步骤1. 多个相同格式的Sheet数据导入1.1 创建导入Sheet的Dto主要代码如下所示&#xff1a;学生数据Dto/// <su…

Java实现二叉树

二叉树: package Tree;import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Stack;public class BinTree {private class TreeNode{int data;TreeNode left;TreeNode right;public TreeNode(){data 0;left null;right nul…

解决 Azure AD 在 Azure Front Door 下登录失败的问题

点击上方关注“汪宇杰博客” ^_^导语最近我给博客系统加上了 Azure Front Door&#xff0c;集齐了12项 Azure 服务打算召唤神龙。没想到刚上线&#xff0c;Azure AD 的单点登录就爆了。OIDC 跳转错误当我尝试登录博客后台的时候&#xff0c;OIDC的跳转URL突然变成了 https://ed…

二叉搜索树的插入与删除(C语言)

代码如下: BinTree Insert( BinTree BST, ElementType X ) {if( !BST ){ /* 若原树为空&#xff0c;生成并返回一个结点的二叉搜索树 */BST (BinTree)malloc(sizeof(struct TNode));BST->Data X;BST->Left BST->Right NULL;}else { /* 开始找要插入元素的位置 */…

算法导论10-2.4题

算法导论10-2.4题 template<typename T> typename List<T>::Node* List<T>::search01(const T &key) {Nil->key key;Node * current Nil->next;while (current->key!key){current current->next;}return current; }其他全部代码链接

Linux中作业控制命令

开门见山&#xff0c;最近.NET劝退师要在linux上写些长时间运行的脚本&#xff0c;获取Azure BlobStorage存储的数据。记录一下Linux中后台执行作业的命令。Linux作业作业(Job)是shell管理的进程(每个job都有一个关联的PID)&#xff0c;每个作业会被分配一个线性job ID。有两种…

使用单项循环链表实现字典操作(算法导论第十章10.2-5题)

使用单项循环链表实现字典操作(算法导论第十章10.2-5题) template<typename T> void insert(SingleCycleL<T> & l,T key) {HalfNode<T> * t new HalfNode<T>(key);t->next l.Nil->next;l.Nil->next t; } template<typename T> …

《Unit Testing》2.1 经典学派如何做测试隔离

经典学派如何解决隔离问题首先&#xff0c;再回顾一下单元测试的三个重要特性&#xff1a;验证一小段代码&#xff08;或者叫一个单元&#xff09;执行速度快使用隔离的方式进行针对第一个特性就会引出一个问题&#xff1a;多小的一段代码才足够小&#xff1f;如果你采用针对每…

AVL树的旋转与插入(C语言)

代码如下: typedef struct AVLNode *Position; typedef Position AVLTree; /* AVL树类型 */ struct AVLNode{ElementType Data; /* 结点数据 */AVLTree Left; /* 指向左子树 */AVLTree Right; /* 指向右子树 */int Height; /* 树高 */ };int Max ( int a, int b …

单项循环链表

单项循环链表 // // Created by 许加权 on 2021/7/12. //#ifndef C11LEARN_SINGLECYCLELINK_H #define C11LEARN_SINGLECYCLELINK_H #include "chapter10.h" template<typename T> class SingleCycleL { public:HalfNode<T> *Nil; public:SingleCycleL(…

Hacker News热文:请停止学习框架,学习领域驱动设计(DDD)(获500个点赞)

在 Hacker News 上获得接近 500 个点赞的一篇名为《停止学习框架》的文章称&#xff1a;我们是程序员&#xff0c;每天都在了解最新的技术&#xff0c;每天都在学习编程语言、框架和库&#xff0c;因为我们知道的现代编程工具越多越好&#xff0c;对吧&#xff1f;不停地追随 A…

堆的定义与操作(C语言)

代码如下: typedef struct HNode *Heap; /* 堆的类型定义 */ struct HNode {ElementType *Data; /* 存储元素的数组 */int Size; /* 堆中当前元素个数 */int Capacity; /* 堆的最大容量 */ }; typedef Heap MaxHeap; /* 最大堆 */ typedef Heap MinHeap; /* 最小…

Θ(n)反转单链表(算法导论第三版第十章10.2-7)

Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if(l.head nullptr || l.head l.tail) return;HalfNode<T> * tail l.head;HalfNode<T>*pre l.head;HalfNode<T>*current pre-&g…