vs2015调试时无法查看变量值(调试时无法查看string、vector等类型的值)

一、现象

  最近使用vs2015调试C++程序,结果发现了一个很奇怪的问题:调试时无法查看stl里面string,vector,list等容器类的值了,如下图所示,调试时把鼠标移动到“str”这个变量上面,结果发现显示“str|{...}”,无法显示str的值了。

 

正常情况下调试时应该显示“hello world”才对,如下图所示:

 

二、问题产生的可能原因

  问题发生的原因很可能跟XXX.natvis文件有关,在vs2012以上的版本,提供了.natvis可视化工具设计来为不同类型的
C/C++ 类型声明自定义可视化。可视化的类型改变了对象在本地表达式计算器的显示方式,包括在监视和变量窗口以及
调试数据提示。

 

三、找到问题产生的原因:

  首先,在“工具”->“选项”->“调试”->“常规”中把“使用托管兼容模式”和“使用本机兼容性模式”前面的勾去掉,否则可能无法使用natvis文件,如下图所示:

 

  第二步,在“工具”->“选项”->“调试”->“输出窗口”->“Natvis诊断消息(仅限C++)”,这里选择“详细”,(默认是“关闭”)。如下图所示:选择了“详细”我们才能在调试时发现是否是因为natvis文件不正常导致无法看到变量的值。

 

  点击“调试”->“开始调试”,然后“调试”->“全部终止”,然后我们可以在“输出窗口”这里找到问题产生的原因:“Natvis: D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\stl.natvis(152,37): 错误: 根据父元素 '{http://schemas.microsoft.com/vstudio/debugger/natvis/2010}Type' 的内容模型,元素 '{http://schemas.microsoft.com/vstudio/debugger/natvis/2010}SmartPointer' 为意外元素”。要求: {http://schemas.microsoft.com/vstudio/debugger/natvis/2010}AlternativeType, {http://schemas.microsoft.com/vstudio/debugger/n...”
如下图所示:

 上面这段错误信息的意思是:在vs的安装路径下(我电脑里是在D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers目录下),有个文件stl.natvis,这个文件保存了调试时stl容器类(vector,string,list等)的可视化信息,vs调试时会获取stl.natvis里面的信息,按照里面的内容实现可视化。但是在该文件的152行,37列时发生错误了。所以导致了调试时无法查看stl容器类的变量值。

 

四、解决方法

  知道问题发生的原因就好办了。我们把D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers目录下的stl.natvis拷贝到该项目的工程目录下,将工程目录下的stl.natvis重命名为NatvisFile.natvis,如下图所示:

 

然后“添加”->“现有项”,将NatvisFile.natvis添加到该工程里面,如下图所示:

 

然后重新点击“调试”->“开始调试”,然后“调试”->“全部终止”,我们可以在“输出窗口”这里看到NatvisFile.natvis文件的错误信息,如下图所示:

 

  然后我们打开NatvisFile.natvis,根据上述报错的信息:“Natvis: D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\stl.natvis(152,37): 错误: 根据父元素 '{http://schemas.microsoft.com/vstudio/debugger/natvis/2010}Type' 的内容模型,元素 '{http://schemas.microsoft.com/vstudio/debugger/natvis/2010}SmartPointer' 为意外元素”,找到NatvisFile.natvis文件中错误的位置,根据上述信息,知道了是在NatvisFile.natvis文件中的152行里面的“SmartPointer”发生了错误,如下图所示:

 

然后我们把“SmartPointer”所在的整段代码删掉,要删掉的代码如下(这个是对应于上图的,根据每个人的情况删掉的代码未必一样):

<!-- VC 2013 -->
<Type Name="std::unique_ptr&lt;*&gt;" Priority="MediumLow">
      <SmartPointer Usage="Minimal">_Myptr</SmartPointer>
      <DisplayString Condition="_Myptr == 0">empty</DisplayString>
      <DisplayString Condition="_Myptr != 0">unique_ptr {*_Myptr}</DisplayString>
      <Expand>
          <Item Condition="_Myptr != 0" Name="[ptr]">_Myptr</Item>
      </Expand>
</Type>

 

重新点击“调试”->“开始调试”,然后“调试”->“全部终止”,在“输出窗口”获取错误信息,删除掉NatvisFile.natvis文件中对应的错误代码,重复上述过程,最后当我们没有再看到任何错误时,证明NatvisFile.natvis没有问题了,如下图所示:此时我们可以在调试时正确得到stl容器类变量的值了

 

五、下载

如果嫌麻烦,可以直接下载博主修改好的natvis文件,把它添加到工程中,即可解决调试时无法查看值的问题,下载地址在 https://download.csdn.net/download/u014552102/10653438

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值