Visual Studio 2013 C++:STL容器的元素显示在调试器中

Dmi*_*iyH 11 c++ debugging data-visualization visual-studio-2013

在C++调试期间的MSVS 2013(Autos和Watch窗口)仅显示STL容器的大小:

MSVS 2010: "[9](9,8,7,6,5,4,3,2,1)"
MSVS 2013: "{ size=9 }"
Run Code Online (Sandbox Code Playgroud)

需要行扩展才能在MSVS 2013中查看元素的值.
有没有办法让MSVS 2013在调试器中显示像MSVS 2010这样的STL容器?
我试图删除stl.natvis(它在2013年使用),但它没有帮助:autoexp.dat仍未使用.
有可能强制MSVS 2013使用autoexp.dat吗?
是否可以修改stl.natvis脚本(从容器元素的值构造DisplayString)?
还有其他方法吗?

Mic*_*urr 7

作为部分解决方案,您可以将多个条件DisplayString元素添加到文件中的每个容器类型的信息中.natvis.

对此的限制是您可以指定在DisplayString调试器输出中仅显示最多一些固定最大值的元素(但是,在调试器显示中单击变量的+符号时,所有元素仍显示在扩展区域中).

例如,将其放入名为的文件中%USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\custom.stl.natvis:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

<Type Name="std::vector&lt;*&gt;">
    <DisplayString Condition="(_Mylast - _Myfirst) >  3">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]}, {_Myfirst[2]}, ...)</DisplayString>
    <DisplayString Condition="(_Mylast - _Myfirst) == 3">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]}, {_Myfirst[2]})</DisplayString>
    <DisplayString Condition="(_Mylast - _Myfirst) == 2">[{_Mylast - _Myfirst}] ({_Myfirst[0]}, {_Myfirst[1]})</DisplayString>
    <DisplayString Condition="(_Mylast - _Myfirst) == 1">[{_Mylast - _Myfirst}] ({_Myfirst[0]})</DisplayString>
    <DisplayString>{{ size={_Mylast - _Myfirst} }}</DisplayString>
    <Expand>
        <Item Name="[size]">_Mylast - _Myfirst</Item>
        <Item Name="[capacity]">_Myend - _Myfirst</Item>
        <ArrayItems>
            <Size>_Mylast - _Myfirst</Size>
            <ValuePointer>_Myfirst</ValuePointer>
        </ArrayItems>
    </Expand>
</Type>

</AutoVisualizer>
Run Code Online (Sandbox Code Playgroud)

在您的下一个VS2013 C++调试会话向量中,将以DisplayString类似于旧的autoexp.dat显示的格式显示调试器输出中的前三个元素.

您可以对自定义natvis进行明显的附加编辑,以显示3个以上的元素.不幸的是,你需要为你希望以这种方式显示的每种容器类型做类似的事情; 对于实习生来说可能是一份好工作.


Dmi*_*iyH 2

我找到了一种强制 MSVS 2012/2013 使用 autoexp.dat 的方法:设置“启用编辑并继续”和“启用本机编辑并继续”。
它禁用 C++ 的“数据查看增强功能”(natvis),并且 std::vector 的元素(std::list、std::map、...)显示在变量的主线上(MSVS 2010 样式)。
但是,仍然很有趣,是否可以修改stl.natvis以获得相同的显示结果?

  • IMO natvis 是一个巨大的回归(以及 Vs2012/13 中的其他回归)。将 xml 用于充满 &amp;、&lt; 和 &gt; 的内容的想法本身就是荒谬的。我猜微软有人中了 XML 毒。 (2认同)