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)?
还有其他方法吗?
作为部分解决方案,您可以将多个条件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>
Run Code Online (Sandbox Code Playgroud)
在您的下一个VS2013 C++调试会话向量中,将以DisplayString
类似于旧的autoexp.dat显示的格式显示调试器输出中的前三个元素.
您可以对自定义natvis进行明显的附加编辑,以显示3个以上的元素.不幸的是,你需要为你希望以这种方式显示的每种容器类型做类似的事情; 对于实习生来说可能是一份好工作.
我找到了一种强制 MSVS 2012/2013 使用 autoexp.dat 的方法:设置“启用编辑并继续”和“启用本机编辑并继续”。
它禁用 C++ 的“数据查看增强功能”(natvis),并且 std::vector 的元素(std::list、std::map、...)显示在变量的主线上(MSVS 2010 样式)。
但是,仍然很有趣,是否可以修改stl.natvis以获得相同的显示结果?