如果我有std::vector
或std::map
变量,并且我想查看内容,那么在调试时看到第n个元素会非常痛苦。是否有插件或一些技巧,以便在调试(VS2003/2005/2008)
时更容易观察STL容器变量?
答案 0 :(得分:18)
如果您想同时观看多个元素,可以附加逗号和元素数量:
(v._Myfirst)[startIndex], count
但是,请注意,count必须是常量,它不能是另一个表达式的结果。
答案 1 :(得分:14)
对于向量,msdn论坛上的这个thread有一个代码片段,用于设置可能有帮助的向量索引上的监视。
答案 2 :(得分:11)
在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]下的内容。在修改之前,请小心并备份此文件。
答案 3 :(得分:7)
要在Visual Studio调试器中查看容器的第n个元素,请使用:
container.operator[](n)
答案 4 :(得分:5)
您可以创建自定义可视化工具 看看这个:http://www.virtualdub.org/blog/pivot/entry.php?id=120
答案 5 :(得分: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<*>">
<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>
答案 6 :(得分:3)
Visual Studio 2008,至少对我来说,在标准鼠标悬停内容框中显示STL容器的内容。
答案 7 :(得分:1)
您还可以右键单击手表中的任何值,然后选择“添加手表”。如果您只需要查看地图或集合的一个元素,这将非常有用。
它还导致了christopher_f为向量发布的解决方案 - ((v)._ Myfirst)[index]
答案 8 :(得分: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:如果您没有收到错误'LINK,则不需要此步骤:致命错误LNK1123:转换为COFF期间失败:文件无效或损坏'。否则浏览
项目属性 - &gt;链接器(常规) - &gt;更改启用增量链接为否(/ INCREMENTAL:NO)
答案 9 :(得分:0)
在2015年,我无法获得任何这些工作 所以,我写了一些代码
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
基本上我所做的是将矢量转换为字符串。 我有矢量矢量所以我有字符串矢量填充。
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
希望它有所帮助。