GDB调试器挂在std :: cout上

时间:2016-06-27 21:21:21

标签: c++ debugging

由于我的学习,我现在已经编写了一段时间来编写C和C ++。在学校的编码课程中,我们曾经使用Visual Studio作为IDE。

我现在正在尝试学习使用GNU编译器工具和调试器。我正在使用CodeLite IDE版本9.1.8,使用TDM-GCC-64 5.1.0编译器。

我的具体问题是GDB调试器。我对它的用法有点熟悉(Step into,Step over等)。每次我尝试调试我自己的代码时,调试器在断点处停止运行并让我继续从那里开始。

然而,每次我用调试器点击“cout”时,它都拒绝进入下一行。当用“cout”打一些线时,按“F10”进入下一行,但调试器不会从那里继续。它总是冻结,不响应任何命令,我必须强制关闭调试器。其他任何可以想象的陈述都很好,但不是任何形式的“cout”。

熟悉CodeLite的人在调试时可能知道文本编辑器窗口左边的绿色箭头。当箭头点击“cout”并按“F10”进入下一行时,箭头会闪烁。当我再次点击“F10”时,箭头再次闪烁。在箭头从左侧边栏完全消失并且调试器挂起之前,这可以完成大约3-4次。

Starting debugger

Debugger hanging and arrow disappeared

这是一个示例代码。它是芬兰语,所以你可能无法理解我想要打印的内容,但这并不重要。

“Henkilo”类包含两个私有变量,name为name,int为age。另外<<运算符被重载,允许对象直接由cout打印。这段代码的赋值是为了演示拷贝构造函数的用法。

#include <iostream>
#include "Henkilo.h"


int main()
{
    Henkilo henkilo1;

    henkilo1.setName("Jaakko");
    henkilo1.setAge(24);

    Henkilo henkilo2(henkilo1);

    std::cout << "\nLuotiin henkil\2241, jonka tiedot ovat: " << std::endl << henkilo1 << std::endl;
    std::cout << "Kopioitiin henkil\2241 objektiin henkil\2242. Henkil\224n 2 tiedot ovat: " << henkilo2 << std::endl;
    return 0;
}

请原谅我发布的任何错误,这是我的第一次。

编辑:

@KennyOstrom

是的,我能够进入该功能,现在我测试了它。它似乎也挂在那里。

std::ostream& operator<< (std::ostream& os, const Henkilo& obj) 
    os << "\nNimi : " << obj.name<< std::endl << "Ik\204 : " << obj.age << std::endl; 
    return os;
}

它似乎挂在您将字符串文字插入“os”对象的行。

编辑:

@PaulMcKenzie

对不起,根本没想过这一点。这是该类的实现。这是一个人的基本类,有名称和年龄的字段。

Henkilo.h

#include <string>
#include <iostream>

class Henkilo
{
private:
    std::string name;
    int age;
public:
    Henkilo();
    Henkilo(std::string initName, int initAge);
    Henkilo(const Henkilo& henkilo);
    void setName(std::string newName);
    std::string getName();
    void setAge(int newAge);
    int getAge();
    friend std::ostream& operator<< (std::ostream& os, const Henkilo& obj);
    ~Henkilo();

};

Henkilo.cpp

#include "Henkilo.h"

Henkilo::Henkilo() : name(""), age(0) {};
Henkilo::Henkilo(std::string initName, int initAge) : name(initName), age(initAge) {};
Henkilo::Henkilo(const Henkilo& henkilo) : name(henkilo.name), age(henkilo.age) {};

void Henkilo::setName(std::string newName) { name = newName; };
std::string Henkilo::getName() { return name; };
void Henkilo::setAge(int newAge) { age = newAge; };
int Henkilo::getAge() { return age; };

std::ostream& operator<< (std::ostream& os, const Henkilo& obj) 
{ 
    os << "\nNimi : " << obj.name<< std::endl << "Ik\204 : " << obj.age << std::endl;
    return os;
}
Henkilo::~Henkilo() {};

1 个答案:

答案 0 :(得分:0)

看起来你的输出流操作符的重载并没有返回任何东西。你在第一行之后有你的return语句,它后面没有任何内容。试试这个:

std::ostream& operator<< (std::ostream& os, const Henkilo& obj) {
  os << "\nNimi : " << obj.name<< std::endl << "Ik\204 : " << obj.age << std::endl; 
  return os;
}