如果我有一个 std :: vector std :: map 变量,并且我想看到内容,那么看到第n个元素会很痛苦调试。在调试(VS2003 / 2005/2008)时是否有插件或一些技巧可以更容易地观察STL容器变量?

有帮助吗?

解决方案

对于矢量,这个 msdn论坛上的主题有一个代码片段,用于设置可能有帮助的矢量索引上的监视。

其他提示

如果您想同时观看多个元素,可以附加逗号和元素数量:

(v._Myfirst)[startIndex],count

但是,请注意,count必须是常量,它不能是另一个表达式的结果。

在VS2005和VS 2008中,您可以看到STL容器的内容。获取数据的规则在autoexp.dat" c:\ Program Files \ Microsoft Visual Studio 9 \ Common7 \ Packages \ Debugger \ autoexp.dat"中。

AutoExp.dat旨在自定义。但是,STL defs位于名为[Visualizer]的部分下。如果您能找出该部分中使用的语言,那么您可以获得更多权力,但我建议您只留下该部分。

Autoexp.dat存在于VS2003中,但不支持STL容器([Visualizer]不存在)。在VS2003中,您必须手动导航基础数据表示。

通过修改autoexp.dat,可以添加用于导航自己类型的数据表示的规则,以便更容易调试。如果你这样做,你应该只添加[AutoExp]下的内容。在修改之前,请小心并备份此文件。

要在Visual Studio调试器中查看容器的第n个元素,请使用:

container.operator[](n)

您可以创建自定义可视化工具 看看这个: http://www.virtualdub.org/blog/pivot /entry.php?id=120

最简单的方法是你必须准备一个指针来观察这样的变量。

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._Myfirst [0]”在VisualStudio2015中,但它不是显示数组数据。

如果您可以使用“ natvis ”,将解决你的问题。

这是“sample.natvis”。用于显示Visual Studio 2015的std :: vector数据。

<?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>

<强>之前

<强>后

Visual Studio 2008,至少对我来说,在标准鼠标悬停内容框中显示STL容器的内容。

您还可以右键单击手表中的任何值,然后选择“添加手表”。如果您只需要查看地图或集合的一个元素,这将非常有用。

它还导致了christopher_f为向量发布的解决方案 - ((v)._ Myfirst)[index]

上面讨论的方法 [((v)._ Myfirst)[index]] 仅适用于特定容器(std :: vector),不适用于所有可能的STL容器。例如,如果要查看std :: deque的内容,则必须查找其他方法来浏览std :: deque中的内容。

也许您可以尝试以下类似的设置来解决您的问题

[我仅针对随Microsoft Visual Studio 2010 Service Pack 1安装的Visual Studio 2010 Professional版本测试了此设置]

步骤1:卸载Microsoft Visual Studio 2010 Service Pack 1 - 对于我的项目工作,我并不真正需要Service Pack 1,因此卸载Service Pack 1不会对我的案例造成任何问题。

第2步:重新启动系统。

步骤3:如果您没有收到错误'LINK,则不需要此步骤:致命错误LNK1123:转换为COFF期间失败:文件无效或损坏'。否则浏览

项目属性 - &gt;链接器(常规) - &gt;更改启用增量链接为否(/ INCREMENTAL:NO)

在2015年,我无法获得任何这些工作
所以,我写了一些代码

1:我有长长元素向量的向量

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

基本上我所做的是将矢量转换为字符串。 我有矢量矢量所以我有字符串矢量填充。

2:如果您只有长长元素的矢量,那么只需转换如下:

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger
希望它有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top