在 MSVS 调试器中导出扩展 std::vector 转储

Exporting an extended std::vector dump in MSVS debugger

在调试问题时,我想保存一份 6000+ 大小的副本 std::vector 以便我可以与 运行 运行.

进行比较

现在 Microsoft Visual Studio 调试器有一个 'Immediate Window',您可以在其中转储变量,包括 std::vector,方法是输入类似

的命令

>Debug.Print m_MyVector

(此命令有一个简单的别名 ?

问题是,它是有限的。尝试转储一个长向量,然后得到类似的输出 < More... (The first 100 of 6529 items were displayed.) >

我的问题是如何得到其余的。如果它像实用程序 more 并且您可以一次获得 100 个,那就可以了。或者,如果您可以将块设置为一次超过 100 个。

虽然我可以编写一个自定义序列化器并转储到一个文件,但我还没有 <iostream> 包含在这个模块中,我不想开始添加这样的东西只是为了调试。

还有其他方法可以从 MSVS 调试器中导出大数据对象吗?

立即打印零碎的值Window

If it was like the utility more and you could get it 100 at a time, that would be OK.

您可以通过递增指针并重新打印来安排此操作。不幸的是,运算符重载在 Immediate Window 中不可用,因此您不能执行 ?(&m_MyVector[0] + 100) 之类的操作。相反,您必须引用未记录的私有成员。例如:

?(m_MyVector._Myfirst), 100

    ...Prints first 100 items

?(m_MyVector._Myfirst + 100), 100

     ...Prints next 100 items

?(m_MyVector._Myfirst + 200), 100

     ...Prints next 100 items

……等等。 , 100 语法告诉它要打印多少项目。不,要求超过 100 件商品是行不通的。您刚刚收到原始消息:

< More... (The first 100 of n items were displayed.) >

看到记忆中的大图Window

也许更好的解决方案涉及内存 window。这利用了 std::vector 是一个连续容器这一事实,因此它的所有元素将在内存中彼此相邻存储。内存 window 只是转储内存的内容,这将有效地为您提供矢量内容的无限转储。

  1. 使用立即数Window确定向量第一个成员的实际地址:

    ?m_MyVector._Myfirst
    0x00440068
    
  2. 确保显示内存 window。 Debug → Windows → Memory → Memory 1(实际上有4个,用哪个都无所谓)。或者直接按 Alt+6.

  3. 复制你从即时 Window 中得到的地址到内存 window 的顶部,那里写着 "Address"。将 0x 前缀留在那里,以防万一。按输入.

  4. 内存 window 将刷新其视图以向您显示该地址处的内存内容,并紧随其后。您可以根据需要向下滚动。没有 100 个项目的限制。

现在,唯一的缺点是内存 window 字面上显示字节的十六进制转储。所以如果你有一个字符串向量,你不会像你有一个整数向量那样快乐,就像我在这里(按顺序填充,从 0 开始):

从Auto/Locals转储到剪贴板Window

您在 中提到的解决方案也适用。使用 Autos 或 Locals window 展开 m_MyVector 对象。执行 Select 全部,或在顶部和底部使用 Shift+单击以排除其他不需要的项目。然后复制。如果你有一个特别大的矢量,转动你的拇指 30 秒以上,同时 Visual Studio 将所有这些数据转储到你的剪贴板。然后粘贴到记事本中。清除前几行后,您将得到一个不错的小转储文件:

std::vector<int,std::allocator<int> >
        [size]  60000   unsigned long
        [capacity]  61447   unsigned long
        [0] 0   int
        [1] 1   int
        [2] 2   int
        [3] 3   int
        [4] 4   int
        [5] 5   int
        [6] 6   int
        [7] 7   int
        [8] 8   int
        [9] 9   int
        [10]    10  int
        ...