【问题标题】:How do I set a breakpoint for when a vector<int> increases in length?当 vector<int> 长度增加时,如何设置断点?
【发布时间】:2011-09-30 20:43:37
【问题描述】:

我有一个空的向量,有东西在某处填充它,但我找不到它。我想设置一个内存断点,以便当 push_back 发生时程序会中断。

我使用的是 Visual Studio 2008,问题是向量没有在监视窗口中显示其内部成员(它似乎具有自定义格式)。它看起来像这样:

myVector[0]() std::vector >

表示大小为 0。有什么提示吗?

【问题讨论】:

  • 为什么不在 push_back 上设置断点?
  • 这还不错,但不会捕获其他情况,例如调整大小、分配等。但是谢谢!
  • 向量没有虚函数,只有三个成员。一个是指针,一个是分配大小,一个是向量中实际元素的数量。在不知道实际的类布局的情况下(尽管您可以在 标头中查找它),通过反复试验应该不难找到要查看的内存地址(很可能是vec+ sizeof(void*)
  • 如果您添加 '!'观察窗口中的修饰符,将不会使用自定义可视化工具,您将看到任何变量的原始成员。在监视窗口中添加myVector,! 而不是myVector,然后瞧。
  • 不知道'!'诡计。谢谢!

标签: c++ visual-c++ stl vector breakpoints


【解决方案1】:

此答案适用于 VS 2010 - 其他版本的详细信息可能有所不同。

由于调试器使用数据可视化工具(或其他任何名称)来显示std::vector 的状态,因此您必须查看&lt;vector&gt; 标头以确定类的实际成员的名称以及哪个成员(s) 可能负责跟踪元素的数量。一个简单的方法是逐步调用vector::push_back()

在 VC++ 2010 中,这是一个名为 _Mylast 的成员指针。

所以您所要做的就是在写入&amp;v._Mylast 时设置一个数据断点(其中v 是您有兴趣调试的向量)。

下次添加元素时,调试器将中断并显示调用堆栈的确切位置。

【讨论】:

  • Windows 10 VS2019需要输入“v._Mypair._Myval2._Mylast”
  • VS能记住“v._Mypair._Myval2._Mylast”之类的数据断点的字符串吗?它似乎只记得计算出的地址,您需要在每个调试会话中删除旧的/添加新的,这是一场噩梦......
【解决方案2】:

在VC2010中显示为0,[0]表示向量的大小,项目将显示在()中。 并且可以使用内存输出窗口找出内存地址。

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多