在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 从容器元素的值)?
还有别的办法吗?
作为部分解决方案,您可以添加多个条件 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<*>">
<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个以上的元素。不幸的是,你需要为你希望以这种方式显示的每种容器类型做类似的事情;对于实习生来说可能是一份好工作。
我找到了一种强制MSVS 2012/2013使用autoexp.dat的方法:set“启用编辑并继续“和”启用本机编辑并继续”。
它禁用C ++的“数据查看增强”(natvis),并且std :: vector(std :: list,std :: map,...)的元素将显示在变量的主线上(MSVS 2010样式)。
但是,它仍然很有趣,是否可以修改 stl.natvis 获得相同的显示结果?
仅供参考,要在VS2015中使用autoexp.dat,请在“使用本机兼容模式”下设置
Options > Debugging > General
取消选中“在变量窗口中显示对象的原始结构” Options > Debugging > General
。