【问题标题】:How to visualise a simple std::string with natvis?如何用 natvis 可视化一个简单的 std::string?
【发布时间】:2017-03-06 03:21:46
【问题描述】:

在调试时,我无法对 VS2015 中的基本 std:string 有一个像样的视图。 我按照这个地址给出的说明进行操作:https://msdn.microsoft.com/fr-fr/library/jj620914.aspx (即调试器类型设置为纯模式,并取消选中 Use Managed Compatibility ModeUse Native Compatibility Mode)。我还在我的解决方案中添加了 stl.nativs 文件。

目前我的调试器看起来像:

我希望将变量 str 直接“测试”为一个值(而不是一个非常复杂的树)。你能帮我解决这个问题吗?

【问题讨论】:

  • 你的测试用例包含了什么样的 Natvis XML 文件?
  • 谢谢 - 看我的回答 - 调试器没有考虑 stl.natvis 文件。

标签: c++ debugging visual-studio-2015 natvis


【解决方案1】:

我找到了答案,出于一个非常奇怪的原因,我在我的 VS 安装目录中找到的 stl.natvis 文件(对我来说是 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers)并且我已经添加到我的项目中不是被调试器自动识别。

所以解决方案是在我的解决方案中添加另一个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 的一部分,似乎完整的复制/过去不起作用。)

【讨论】:

  • 更新 natvis 文件后能否显示调试器窗口?
  • 感谢您的分享,Malick :) 请将您的回复标记为答案,以便其他遇到相同问题的社区成员有所帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2022-10-14
    • 2021-01-06
    • 2021-04-03
    相关资源
    最近更新 更多