【问题标题】:An easy way to watch a vector element in debugger在调试器中查看向量元素的简单方法
【发布时间】:2014-08-11 18:56:52
【问题描述】:

我正在使用 Visual Studio 2013,在其悠久的历史中,它从未能够在调试器中显示矢量元素,并抱怨 no operator "[]" matches these operands 消息。我知道有一种解决方法需要输入v.operator[](n),但这对我来说是不可接受的。我想将光标悬停在v[n] 上方并查看其值,或者最多选择或剪切并粘贴v[n] 以查看该值。是否可以使用其他 Windows C++ IDE?

我知道向量的所有元素都显示在AutosLocals 窗口中,但我的向量太长,不实用。

【问题讨论】:

标签: c++ visual-studio debugging visual-c++ stdvector


【解决方案1】:

只需在 Watch 字段中为每个 [] 加上 _Myfirst 前缀即可:

YourVector._Myfirst[n]

【讨论】:

  • _Myfirst 在 Visual Studio 2019 中不起作用(我没想到,答案很老了)。我像这样使用__begin_ YourVector.__begin_[index]
【解决方案2】:

这里的技巧:

假设您有一个std::vector<int> v;,并且您想在手表中看到v[23]v[23]..v[23+n],请执行以下操作:

  1. 将变量添加到监视窗口。
  2. 在变量名后添加,!(例如:v,!),表示VS要关闭调试器可视化。
  3. 展开向量成员,直到看到_Myfirst_Mylast_Myend。将_Myfirst 添加到手表。这是指向向量内存开头的指针。
  4. 如果需要,请从手表中删除 v,!
  5. _Myfirst 元素添加到手表的末尾添加+ offset, count,其中offset 是您希望在手表中首先看到的矢量索引,count 是您要查看的矢量元素的数量。会是这样的:(*((std::_Vector_val<std::_Simple_types<int> >*)(&(*((std::_Vector_alloc<0,std::_Vec_base_types<int,std::allocator<int> > >*)(&(v)))))))._Myfirst + 23, 100。这让您可以看到从位置 23 开始的向量的 100 个元素(是的,我知道 _Myfirst 元素很大)。您可以使用变量指定 offsetcount(例如:匹配代码中的表达式,如 v[n] 用作偏移量 ncount 任何你想要的,常量或变量。

关于Debugging Tips and TricksGoing Native Episode 28 从第 17 分钟开始的一些信息有一些好处,评估表达式可以在 cmets 中。示例你有一些代码。

v[n] = ... + pre_calculate(v[n]) + ...
// You could put a comment like this:
// (*((std::_Vector_val<std::_Simple_types<int> >*)(&(*((std::_Vector_alloc<0,std::_Vec_base_types<int,std::allocator<int> > >*)(&(v)))))))._Myfirst + n, 100
// And when you hover the mouse over the selected expression, you see the evaluation. Much better I think.

【讨论】:

  • 感谢您的详细回复,但我正在寻找更快的方法来完成它 - 请参阅我的问题。我有许多大向量和许多涉及向量元素的复杂表达式。
  • 一旦你添加了手表,另一个很容易,复制向量的基地址,将变量名v更改为有问题的向量,offsetelements需要。您不必一直执行 5 步过程。这里的提示是,,! 技巧和,count 技巧。其他可能的方法是Debugger Visualizations,不太了解,只有基础知识。在其他调试器(例如:lldb)中,您可以在 python 中进行可视化。
【解决方案3】:

在 MSVC 的标准库实现中,_M_start_M_finish_M_end_of_storage_Vector_base 中可以使用的公共成员。

vector._M_start[n]

【讨论】:

    【解决方案4】:

    此方法适用于您使用的任何 C++ IDE;首先,您必须知道存储第一个元素的向量成员名称。

    (在 borland 6 c++ 中)您可以通过在已添加到监视窗口后检查向量来执行此操作。在 Visual 中它被称为不同。

    然后你必须在手表中添加以下语法: nameVector.memberWichPointsToTheFirstElement[startIndex],numElementsDesiredToDisplay。

    你完成了。但是当向量在实例中时,它不会显示任何内容:不允许副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-19
      • 2014-09-12
      • 2019-11-04
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2018-07-06
      • 2011-02-23
      相关资源
      最近更新 更多