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


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

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

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


8794
2017-12-28 21:38


起源

看来你可以修改文件: code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2 - cageman
自VS2012以来不再使用autoexp.dat。你必须使用.natvis文件。请参阅@ user3125562链接以获取说明。别忘了保存原始文件的副本! - Sjoerd
是的,文件可以修改,但我从文章中无法理解,如何构建 DisplayString 来自元素的价值观。 - DmitriyH
boost也有自己的可视化器,也许那些可以帮助?或尝试寻找其他例子。否则,请解释您的位置和出错的位置。 - cageman
@ user3125562,我发现了boost visualizers包(用于VS2012 / VS2013的C ++ Debugger Visualizers),但boost * .natvis文件中的每个记录也只显示了容器大小 DisplayString。所以,问题是“如何将所有元素值放入 DisplayString 在* .natvis?“仍然没有回答.. - DmitriyH


答案:


作为部分解决方案,您可以添加多个条件 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>

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

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


7
2017-12-30 08:13



感谢你的回答!我会用它,如果没有找到任何其他方式。但是三个元素太少,需要特殊脚本才能生成custom.stl.natvis,能够显示1..32个元素:) - DmitriyH
我同意三个要素太少;这只是为了证明这个想法。我也同意,对于合理数量的元素和一组合理的容器来说这样做会很乏味。幸运的是,它只需要完成一次,但它可能需要针对不同版本的VS进行调整/修复。 - Michael Burr


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


2
2017-12-30 07:10



IMO natvis是一个巨大的回归(其中包括Vs2012 / 13)。将xml用于充满&,<和>的东西的想法是荒谬的。我猜有人在微软中毒了XML。 - Pavel
顺便说一下,我希望我能够使用你的建议让我的autoexp.dat工作,否则我仍然坚持使用vs2008 - Pavel
有一个建议 这里 在MS,这是一种要求MS下车并解决问题的方法。如果您希望在下一个版本中修复它,请投票给它。 - Adrian
我尝试使用Visual Studio 2013社区,它没有用,即。它没有使用autoexp.dat文件。 :-( - martinako


仅供参考,要在VS2015中使用autoexp.dat,请在“使用本机兼容模式”下设置

Options > Debugging > General


1
2017-08-17 11:11



如果该选项显示为灰色,请禁用“启用编辑并继续”。 - Ste


取消选中“在变量窗口中显示对象的原始结构” Options > Debugging > General


1
2017-10-07 05:23