在调试问题时,我想保存6000+大小std::vector
的副本,以便我可以在运行中比较它。
现在,Microsoft Visual Studio调试器有一个“立即窗口”,您可以通过输入
之类的命令来转储变量,包括std::vector
>Debug.Print m_MyVector
(此命令的别名为简单?
)
问题是,它是有限的。尝试转储一个长向量,一个得到输出
< More... (The first 100 of 6529 items were displayed.) >
我的问题是如何得到余下的。如果它就像实用程序more
,你可以一次获得100,那就没问题了。或者,如果您可以将块一次设置为超过100个。
虽然我可以编写一个自定义序列化程序并转储到一个文件,但我还没有包含<iostream>
这个模块,我讨厌开始添加这样的东西只是为了调试。
从MSVS调试器中导出大型数据对象的其他任何方法吗?
答案 0 :(得分:1)
如果它就像实用程序
more
,你可以一次获得100,那就没关系。
您可以通过递增指针和重新打印来安排此操作。遗憾的是,立即窗口中没有运算符重载,因此您无法执行?(&m_MyVector[0] + 100)
之类的操作。相反,您必须引用未记录的私有成员。例如:
?(m_MyVector._Myfirst + 100), 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.) >
也许更好的解决方案将涉及内存窗口。这利用了std :: vector是一个连续容器的事实,因此它的所有元素将在内存中彼此相邻地存储。 Memory窗口只是转储内存的内容,这将有效地无限地转储向量的内容。
使用立即窗口确定向量的第一个成员的实际地址:
?m_MyVector._Myfirst
0x00440068
确保显示“内存”窗口。调试→Windows→内存→内存1(实际上有4个;你使用哪一个并不重要)。或者只需按 Alt + 6 。
将您从立即窗口获得的地址复制到内存窗口的顶部,其中显示&#34;地址&#34;。保留0x
前缀,以防万一。按 Enter 。
“内存”窗口将刷新其视图,以显示该地址的内存内容,并立即显示该内容。您可以根据需要向下滚动。没有100项限制。
现在,唯一的缺点是Memory窗口字面上显示十六进制字节转储。所以,如果你有一个字符串向量,你就不会像你有一个int的向量一样快乐,就像我在这里(从0开始按顺序填充):
您在a comment中提到的解决方案也可以使用。使用“Autos”或“Locals”窗口展开m_MyVector
对象。执行全选,或使用顶部和底部的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
...