Visual Studio 的 C++ 调试 - 向量大小变化的观察点

Posted

技术标签:

【中文标题】Visual Studio 的 C++ 调试 - 向量大小变化的观察点【英文标题】:C++ debugging by Visual Studio - Watchpoint on vector size change 【发布时间】:2013-01-31 07:31:50 【问题描述】:

我想用我的矢量来探索变化。因此,我想在向量大小上设置一个 whatchpoint。因此,Visual Studio 将让我在每次大小更改后查看向量中的内容。我该怎么做?

Here in this link你可以找到如何设置条件断点。我尝试设置这样的条件:my_vect.size() 变量 on Has changed 事件(根据 8. Conditional breakpoints),但它很烂。

【问题讨论】:

您使用的是什么特定版本的 Visual Studio? 【参考方案1】:

my_vect.size() 不是一个变量,而是一个函数。它看起来像这样:

size_type size() const _NOEXCEPT
       // return length of sequence
    return (this->_Mylast - this->_Myfirst);
    

所以这里是解决方案:使用调试器启动您的程序。在向量大小改变之前中断。添加新数据断点。假设您的向量称为myvec。然后在地址字段中分别输入&myvec._Mylast&myvec._Mylast。现在,只要指向向量中第一个或最后一个元素的指针发生变化,调试器就会停止。

【讨论】:

为什么不呢?你怎么定义方便? 问题是每次你都要去vector文件,多跳几次,到你想看vector内容的地方。第二个问题是每次重新分配都会导致中断。 您希望收到有关尺寸更改的通知。当然,重新分配会触发中断 天哪!这适用于条件断点!假设你想在一个向量(在本地)不为空时中断,那么条件是myvec._Mylast != myvec._Myfirst !谢谢【参考方案2】:

您可以打开 <vector> 标头并在 std::vector 的每个更改向量大小的方法(如 push_back、erase 等)的开头(或结尾)设置断点。

【讨论】:

我没有使用观察点。我刚刚检查了它,但似乎它们不像断点那样工作(修改变量时调试器不会停止)。我认为您必须使用我描述的断点。 这也将打破每个向量。但我可能有数千个向量。我只需要调试其中一个。【参考方案3】:

作为上述@Marius Bancila 答案的补充,在我的情况下,std::vector 实现更为复杂,其size 实现为:

_NODISCARD size_type size() const noexcept 
    auto& _My_data = _Mypair._Myval2;
    return static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst);

我怀疑它在最新版本的 Visual Studio 中已更改,因为我使用的是 Visual C++ 2019 编译工具包。

所以看:

第一:

yourVector._Mypair._Myval2._Myfirst

最后:

yourVector._Mypair._Myval2._Mylast

【讨论】:

以上是关于Visual Studio 的 C++ 调试 - 向量大小变化的观察点的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2012 中调试 C++ 代码时跳过 STL 代码?

在 Visual Studio 2012 Express 中设置 C++ 调试环境

C++ 调试在 Visual Studio 中找不到“=”运算符

带有枚举的 C++ Visual Studio 调试器错误

尝试使用 Visual Studio 2010 调试 dll (C++) 时出现错误消息

Visual Studio 2017 社区中 C++ 调试与发布构建结果的差异 [关闭]