繁体   English   中英

如何使用natvis可视化简单的std :: string?

[英]How to visualise a simple std::string with natvis?

调试时,我无法对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.0\\Common7\\Packages\\Debugger\\Visualizers ),我添加到我的项目的调试器无法自动识别。

因此,解决方案是向我的解决方案中添加另一个Debugger visualization file (.natvis) (右键单击->添加新项),然后将stl.natvis文件的内容复制/ stl.natvis到该新文件中。 重建后,调试器会适当显示标准std:string。

为了完整stl.natvis ,请参见下面的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一部分,看来完整复制/ stl.natvis不起作用。)

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM