Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VisualStudio调试中检查STL容器_C++_Visual Studio_Debugging_Stl - Fatal编程技术网

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&lt;*&gt;">
    <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.mu 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&lt;*&gt;">
    <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>