C++ 在VisualStudio调试中检查STL容器
如果我有一个C++ 在VisualStudio调试中检查STL容器,c++,visual-studio,debugging,stl,C++,Visual Studio,Debugging,Stl,如果我有一个std::vector或std::map变量,并且我想查看内容,那么在调试时查看第n个元素是一件非常痛苦的事情。是否有一个插件或一些技巧可以使调试(VS2003/2005/2008)时更容易地查看STL容器变量?对于向量,msdn论坛上的这篇文章有一个代码片段,用于在向量索引上设置监视,这可能会有所帮助。Visual Studio 2008,至少对我来说,在标准鼠标悬停内容框中显示STL容器的内容。您可以创建自定义可视化工具 查看此项:您也可以右键单击手表中的任何值,然后选择“添加手
std::vector
或std::map
变量,并且我想查看内容,那么在调试时查看第n个元素是一件非常痛苦的事情。是否有一个插件或一些技巧可以使调试(VS2003/2005/2008)
时更容易地查看STL容器变量?对于向量,msdn论坛上的这篇文章有一个代码片段,用于在向量索引上设置监视,这可能会有所帮助。Visual Studio 2008,至少对我来说,在标准鼠标悬停内容框中显示STL容器的内容。您可以创建自定义可视化工具
查看此项:您也可以右键单击手表中的任何值,然后选择“添加手表”。如果您只需要查看地图或集合的一个元素,则此功能非常有用
它还导致了christopher_f针对向量发布的解决方案-((v)。_Myfirst)[index]如果您想同时查看多个元素,可以添加逗号和元素数,如下所示:
(v._Myfirst)[startIndex],计数
但是,请注意计数必须是常量,它不能是另一个表达式的结果。在VS2005和VS2008中,您可以看到STL容器的内容。获取数据的规则在autoexp.dat“c:\Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat”中
AutoExp.dat旨在进行自定义。但是,STL定义位于名为[Visualizer]的部分下。如果你能理解这一部分中使用的语言,那就给你更大的权力,不过我建议你还是别管这一部分
VS2003中存在Autoexp.dat,但不支持STL容器([Visualizer]不存在)。在VS2003中,必须手动导航基础数据表示
通过修改autoexp.dat,可以添加用于导航您自己类型的数据表示的规则,以便更易于调试。如果这样做,则只应在[AutoExp]下添加内容。在修改此文件之前,请小心并保留其备份。上述方法[((v)。\u Myfirst)[index]]仅适用于特定容器(std::vector),而不适用于所有可能的STL容器。例如,如果您想查看std::deque的内容,那么必须寻找其他方法来浏览std::deque中的内容
也许您可以尝试以下类似设置来解决您的问题
[我仅针对安装了Microsoft Visual Studio 2010 Service pack 1的Visual Studio 2010专业版测试了此设置]
步骤1:卸载Microsoft Visual studio 2010 Service pack 1-对于我的项目工作,我并不真正需要Service pack 1,因此卸载Service pack 1不会对我的案例造成任何问题
步骤2:重新启动系统
步骤3:如果您没有收到错误“链接:致命错误LNK1123:转换为COFF期间失败:文件无效或损坏”,则无需执行此步骤。否则浏览
项目属性->链接器(常规)->将启用增量链接更改为否(/Incremental:No)要在Visual Studio调试器中查看容器的第n个元素,请使用:
container.operator[](n)
在vs 2015中,我无法使任何一项正常工作
所以,我写了一些代码
1:我有长元素向量的向量
std::向量vs(M_+1);
对于(unsigned long long i=0;i最简单的方法是,您必须准备一个指针来监视这样的变量
vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".
向量a={0,1,2,3,4,5};
int*ptr=&a[0];//在VisualStudio观察窗口中观察此ptr,如“ptr,6”所示。
我在VisualStudio2015中尝试了“a._Myfirst[0]”,但它没有显示阵列数据
如果您可以使用“”,它将解决您的问题
这是用于VisualStudio2015显示std::vector数据的“sample.natvis”
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="std::vector<*>">
<DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
<ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
之后
我也是,我相信VS2005也做了同样的事情。Visual Studio 2010(可能还有其他版本)中的命名差异很小:(v.mu start)[startIndex],count
我必须做(v.Myfirst+startIndex),count
在VS2010 SP1中我必须做v.Myfirst(),在VS2015中计数。对于那些懒于遵循链接的人,解决方案是((v)._Myfirst)[index]
似乎比_Myfirst选项更容易,我使用了&来查看内存窗口中的原始缓冲区谢谢,没有使用natvis,而是在Watch窗口中使用指针表达式,添加了数组后缀:a._Mypair.\u Myval2._Myfirst,10
(用向量大小替换10
).顺便说一句,这是唯一提到“我的伴侣”和“我的瓦尔2”的答案,也许它们出现在VS 2015中?这可以作为答案发布
vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="std::vector<*>">
<DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
<Expand>
<Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
<Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
<ArrayItems>
<Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
<ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>