在 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 只是转储内存的内容,这将有效地为您提供矢量内容的无限转储。
使用立即数Window确定向量第一个成员的实际地址:
?m_MyVector._Myfirst
0x00440068
确保显示内存 window。 Debug → Windows → Memory → Memory 1(实际上有4个,用哪个都无所谓)。或者直接按 Alt+6.
复制你从即时 Window 中得到的地址到内存 window 的顶部,那里写着 "Address"。将 0x
前缀留在那里,以防万一。按输入.
内存 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
...
在调试问题时,我想保存一份 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 只是转储内存的内容,这将有效地为您提供矢量内容的无限转储。
使用立即数Window确定向量第一个成员的实际地址:
?m_MyVector._Myfirst 0x00440068
确保显示内存 window。 Debug → Windows → Memory → Memory 1(实际上有4个,用哪个都无所谓)。或者直接按 Alt+6.
复制你从即时 Window 中得到的地址到内存 window 的顶部,那里写着 "Address"。将
0x
前缀留在那里,以防万一。按输入.内存 window 将刷新其视图以向您显示该地址处的内存内容,并紧随其后。您可以根据需要向下滚动。没有 100 个项目的限制。
现在,唯一的缺点是内存 window 字面上显示字节的十六进制转储。所以如果你有一个字符串向量,你不会像你有一个整数向量那样快乐,就像我在这里(按顺序填充,从 0 开始):
从Auto/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
...