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 中找不到“=”运算符