最近使用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”所在的整段代码删掉,要删掉的代码如下(这个是对应于上图的,根据每个人的情况删掉的代码未必一样):
_Myptr
empty
unique_ptr {*_Myptr}
- _Myptr
重新点击“调试”->“开始调试”,然后“调试”->“全部终止”,在“输出窗口”获取错误信息,删除掉NatvisFile.natvis文件中对应的错误代码,重复上述过程,最后当我们没有再看到任何错误时,证明NatvisFile.natvis没有问题了,如下图所示:此时我们可以在调试时正确得到stl容器类变量的值了
如果嫌麻烦,可以直接下载博主修改好的natvis文件,把它添加到工程中,即可解决调试时无法查看值的问题,下载地址在 https://download.csdn.net/download/u014552102/10653438