35

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

4

11 回答 11

20

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

(v._Myfirst)[startIndex], count

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

于 2008-09-19T20:57:09.917 回答
14

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

于 2008-09-19T20:00:46.027 回答
11

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

AutoExp.dat 旨在定制。但是,STL 定义位于称为 [Visualizer] 的部分下。如果您能弄清楚该部分中使用的语言,那么您将获得更大的力量,但是我建议您不要理会该部分。

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

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

于 2008-09-21T18:28:50.973 回答
8

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

container.operator[](n)
于 2015-03-28T14:51:43.677 回答
5

您可以创建一个自定义可视化器检查一下:http ://www.virtualdub.org/blog/pivot/entry.php?id=120

于 2008-09-19T20:18:56.857 回答
4

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

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

我在 VisualStudio2015 中尝试了“a._Myfirst[0]”,但它不是显示数组数据。

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

这是用于显示 Visual Studio 2015 的 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>

在此处输入图像描述

在此处输入图像描述

于 2016-10-31T02:32:09.317 回答
3

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

于 2008-09-19T20:13:13.067 回答
1

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

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

于 2008-09-19T20:53:36.417 回答
1

上面讨论的方法[((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 步:如果您没有收到错误“链接:致命错误 LNK1123:转换为 COFF 期间失败:文件无效或损坏”,则无需执行此步骤。否则浏览

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

于 2013-08-06T15:38:02.153 回答
0

在 vs 2015 中,我无法让这些工作中的任何一个工作
,所以我写了一些代码

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

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:如果你只有一个 long long 元素的向量,那么只需转换如下:

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

希望它有所帮助。

于 2016-06-08T05:33:31.357 回答
0

这是旧的,但由于我经常偶然发现这篇文章,因为它在谷歌上的引用率仍然很高,截至 Visual Studio 2019,人们可以简单地在调试器的 Watch 中编写:

vectorName.data()

(用您的变量名替换vectorName)以获取指向内容的指针。

然后,知道向量的当前大小,您可以告诉调试器显示前 N 个单元格:

vectorName.data(),N

(N 是你的向量的大小)

如果像我一样,你有很多实际存储另一个数据结构的字节向量,你甚至可以告诉调试器将指针解释为其他东西的数组:

(float*)vectorName.data(),4

例如,我有一个 16 字节的 std::vector,使用它我可以告诉调试器向我显示一个包含 4 个浮点数的数组(这对我来说比单独的字节更有用)。

于 2022-02-01T02:52:43.303 回答