【问题标题】:Debugging C++ code involving use of: vector, string, STL调试涉及使用的 C++ 代码:向量、字符串、STL
【发布时间】:2021-04-09 08:52:04
【问题描述】:

我是 C++ 初学者。当我尝试使用以下构造(如字符串、某些本机类型的向量、STL 等)调试 C++ 代码时,调试变得乏味。我使用 MS Visual Studio 2010/Visual C++ 2010 Express。

例如

-- 使用字符串时如下:

string str;

getline(cin, str);

for(i=0; i<str.size();i++)

观察窗口不显示 str[i] 的值。它说未找到重载运算符。我必须手动折叠整个字符串变量 str 并在该特定索引处查看 char elem,这很麻烦。

-- 如下使用矢量时,同样的问题。如果我在监视窗口中设置变量 v1[k] 相同的错误。

vector<int> v1(100);


for(int k=0;k<100;k++)
{
    v1.push_back(k);
}

-- 尝试使用简单的 STL 迭代器,如 it.begin()、it.end() 和类似 sort()、reverse() 等算法,我无法通过单步调试这些函数,或者无法设置断点那些。(我知道它们在 STL 或一些这样的标准库中,可以确保它们没有错误,但仍然可以通过传递无效/不正确的东西来错误地使用它们)

从多年的 C 语言使用到 C++,我发现缺乏“调试能力”或其中的一些限制,这很痛苦,而我正在尝试理解其他人编写的大量 C++ 代码,在工作。

我的问题 -

在使用诸如步入、断点、观察点、观察窗口等惯用语时,有哪些有效方法可以调试工作代码以了解其功能。是否有任何特定的调试器比其他的更好/更差。(比如说 gdb 更好)或者是否有任何特定的技巧/提示来帮助调试。

一般而言,如何分析 C++ 代码以了解其工作原理?

【问题讨论】:

  • 我想知道什么是如此离题以至于有人投票支持它!
  • 我投票决定关闭,因为询问“什么是有效的”、“哪个特定的调试器比另一个更好/更差”,基本上你的其余问题完全是主观的。
  • @Marlon - 主要问题不是这个,如果你看到的话。
  • @Marlon:询问调试 STL 使用的有效方法有什么问题?这是一个非常重要(和客观)的问题!

标签: c++ debugging


【解决方案1】:

正如您所发现的,尝试在监视窗口中使用重载运算符根本行不通。您需要打开对象并拉出成员变量。

在 MSVC 中,std::vector 有一个成员变量 _Myfirst,它指向其缓冲区的第一个元素。要获取索引 i 处的项目,您可以添加

(v._Myfirst)[i]

到观察窗口。你也可以使用

(v._Myfirst),10

显示数组的前 10 个元素。

std::string 应该有一个类似的成员变量。

【讨论】:

  • 谢谢。那真的很有用但是在我的 Visual Studio 2010 编译器中,当我在监视窗口中看到一个向量变量时,我看到的只是 - 第一个元素被命名为 size,它是向量的大小。第二个元素是容量。然后是向量中的各个元素。看不到任何指向第一个元素的指针:(
  • @goldermean:啊,所以他们已经在 2010 年更改了它,我只使用了 2008 年。肯定有一个选项可以显示原始成员变量吗? (我现在在黑暗中拍摄)。
  • @goldenmean 这对于 VC10 来说很正常。他们实现了有用的调试工具,将相当深奥的成员转换为实际的项目数组。诚然,这对您的案例没有帮助,但如果您需要将vector 视为一个数组,它可以让您相当合理地覆盖。
  • @goldermean:我发现有人说使用((v)._Myfirst)[i] 应该适用于您选择的任何i
  • @Peter - 是的。试过 ((v1._Myfirst)+190), 10 这也很好用。谢谢。
【解决方案2】:

为极少数类型指定了“调试可视化工具”以协助调试。它们通常是一个很棒的帮助,我发现现在没有它们几乎不可能完成任何事情(为什么我关心向量的实现......我只想知道它里面有什么!)

但是,如果您确实想要禁用它们,请在谷歌周围搜索控制它的“autoexp.dat”文件。您可以删除其中的几行,一切都会回到平面类型。我会警告你,如果没有可视化器,地图和集合之类的东西基本上就无法调试了。

或者,切换到 C++/CLI。 VS2010 不支持 C++/CLI 中的调试可视化工具,这通常会令人非常沮丧,但我想这可能是您正在寻找的。​​p>

【讨论】:

    【解决方案3】:

    在工具>选项..>调试>常规中取消选中以下项目:

    • 在变量窗口中显示对象的原始结构
    • 使用本机兼容模式

    然后你会看到格式化的输出。

    【讨论】:

      【解决方案4】:

      我喜欢彼得亚历山大的回答,但由于某种原因对我不起作用。我正在使用 gnu GCC 编译器,看起来实现数据类型不同。

      启发我找到了下面的那个,它在我的情况下有效:

      要获取索引 (i) 处的项目,您可以添加

      *(v._M_impl._M_start+i)
      

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多