如何用natvis可视化一个简单的std :: string?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用natvis可视化一个简单的std :: string?相关的知识,希望对你有一定的参考价值。
调试时我无法在VS2015中看到基本的std:string。我按照这个地址给出的说明:https://msdn.microsoft.com/fr-fr/library/jj620914.aspx(调试器类型设置为本机模式,并取消选中Use Managed Compatibility Mode
和Use Native Compatibility Mode
)。我还将stl.nativs文件添加到我的解决方案中。
我想看到我的变量str
(而不是非常复杂的树)直接“测试”的值。你能帮帮我吗?
我找到了答案,出于一个非常奇怪的原因,我在VS安装目录中找到的stl.natvis文件(C:Program Files (x86)Microsoft Visual Studio 14.0Common7PackagesDebuggerVisualizers
对我来说)以及我添加到项目中的stl.natvis文件无法被调试器自动识别。
所以解决方案是在我的解决方案中添加另一个Debugger visualization file (.natvis)
(右键单击 - >添加新项目)并将stl.natvis
文件的内容复制/过去到这个新文件。重建后,调试器会正确显示标准std:string。
为了完整性,请参阅以下stl.natvis
中针对visual studio 2015处理std :: string的部分。
<!-- VC 2015 -->
<Type Name="std::basic_string<char,*>">
<DisplayString Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,na}</DisplayString>
<DisplayString Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,na}</DisplayString>
<StringView Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,na</StringView>
<StringView Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,na</StringView>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item>
<Item Name="[allocator]" ExcludeView="simple">_Mypair</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mysize</Size>
<ValuePointer Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
<ValuePointer Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- VC 2015 -->
<Type Name="std::basic_string<wchar_t,*>">
<AlternativeType Name="std::basic_string<unsigned short,*>" />
<AlternativeType Name="std::basic_string<char16_t,*>" />
<DisplayString Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,su}</DisplayString>
<DisplayString Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,su}</DisplayString>
<StringView Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,su</StringView>
<StringView Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,su</StringView>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item>
<Item Name="[allocator]" ExcludeView="simple">_Mypair</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mysize</Size>
<ValuePointer Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
<ValuePointer Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="std::basic_string<char32_t,*>">
<DisplayString Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,s32}</DisplayString>
<DisplayString Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,s32}</DisplayString>
<StringView Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,s32</StringView>
<StringView Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr,s32</StringView>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mysize</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myres</Item>
<Item Name="[allocator]" ExcludeView="simple">_Mypair</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mysize</Size>
<ValuePointer Condition="_Mypair._Myval2._Myres < _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
<ValuePointer Condition="_Mypair._Myval2._Myres >= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
编辑
请参阅下面的最终手表控制台:(另请注意,您应该只复制您想要的部分stl.natvis
,似乎完整副本/过去不起作用。)
我发现你在VS中选择的语言会对此产生影响。 .natvis xml文件的模式在$(VSINSTALLDIR)/ xml / schemas / $(LANG)/natvis.xsd中定义,在我的计算机中有两个版本:1033和2052,后者比另一个更新,它有更多的元素定义(例如在stl.nativs中使用的<SmartPointerUsage>)。如果您发现调试器的变量检查不起作用,您可以尝试将语言更改为具有较新natvis.xsd的特殊语言。
以上是关于如何用natvis可视化一个简单的std :: string?的主要内容,如果未能解决你的问题,请参考以下文章
在 VSCode/Natvis 中使用 CustomListItems
为 JsonCpp 寻找 Visual Studio 可视化工具(natvis)