如何用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 ModeUse Native Compatibility Mode)。我还将stl.nativs文件添加到我的解决方案中。

目前我的调试器看起来像:enter image description here

我想看到我的变量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&lt;char,*&gt;">
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,na}</DisplayString>
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,na}</DisplayString>
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,na</StringView>
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _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 &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
        <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

  <!-- VC 2015 -->
  <Type Name="std::basic_string&lt;wchar_t,*&gt;">
    <AlternativeType Name="std::basic_string&lt;unsigned short,*&gt;" />
    <AlternativeType Name="std::basic_string&lt;char16_t,*&gt;" />
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,su}</DisplayString>
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,su}</DisplayString>
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,su</StringView>
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _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 &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
        <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

  <Type Name="std::basic_string&lt;char32_t,*&gt;">
    <DisplayString Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Buf,s32}</DisplayString>
    <DisplayString Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">{_Mypair._Myval2._Bx._Ptr,s32}</DisplayString>
    <StringView Condition="_Mypair._Myval2._Myres &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf,s32</StringView>
    <StringView Condition="_Mypair._Myval2._Myres &gt;= _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 &lt; _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Buf</ValuePointer>
        <ValuePointer Condition="_Mypair._Myval2._Myres &gt;= _Mypair._Myval2._BUF_SIZE">_Mypair._Myval2._Bx._Ptr</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

编辑

请参阅下面的最终手表控制台:(另请注意,您应该只复制您想要的部分stl.natvis,似乎完整副本/过去不起作用。)

enter image description here

另一答案

我发现你在VS中选择的语言会对此产生影响。 .natvis xml文件的模式在$(VSINSTALLDIR)/ xml / schemas / $(LANG)/natvis.xsd中定义,在我的计算机中有两个版本:1033和2052,后者比另一个更新,它有更多的元素定义(例如在stl.nativs中使用的<SmartPointerUsage>)。如果您发现调试器的变量检查不起作用,您可以尝试将语言更改为具有较新natvis.xsd的特殊语言。

以上是关于如何用natvis可视化一个简单的std :: string?的主要内容,如果未能解决你的问题,请参考以下文章

在 VSCode/Natvis 中使用 CustomListItems

Natvis FourCC 可视化语法

Natvis FourCC可视化语法

为 JsonCpp 寻找 Visual Studio 可视化工具(natvis)

在 natvis 可视化器的第一个扩展级别上扩展模板类型的成员

VSCode natvis 处理某些变量,但不处理相同模板类型的其他变量