GDB调试器挂在std::cout上

GDB debugger hanging on std::cout

本文关键字:cout std 调试器 GDB      更新时间:2023-10-16

由于我的学习,我一直在编写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次,调试器挂在那里。

启动调试器

调试器挂起,箭头消失

下面是一个示例代码。它是芬兰语的,所以你可能不明白我想要打印的内容,但这并不重要。

类"Henkilo"包含两个私有变量,string表示姓名,int表示年龄。此外,<<运算符是重载的,允许对象直接被cout打印。这段代码的任务是演示复制构造函数的用法。

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

int main()
{
    Henkilo henkilo1;
    henkilo1.setName("Jaakko");
    henkilo1.setAge(24);
    Henkilo henkilo2(henkilo1);
    std::cout << "nLuotiin henkil2241, jonka tiedot ovat: " << std::endl << henkilo1 << std::endl;
    std::cout << "Kopioitiin henkil2241 objektiin henkil2242. Henkil224n 2 tiedot ovat: " << henkilo2 << std::endl;
    return 0;
}

请原谅我所犯的错误,这是我的第一次。

编辑:

@KennyOstrom

是的,我可以进入这个函数,现在我测试了它。它似乎也坚持在那里。

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

它似乎挂在插入字符串字面值到"os"对象的那一行。

编辑:

@PaulMcKenzie

对不起,我完全没有想到这一点。下面是这个类的实现。它是person的基本类,具有用于名称和年龄的字段。

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 << "Ik204 : " << obj.age << std::endl;
    return os;
}
Henkilo::~Henkilo() {};

看起来您的outputstream操作符的重载没有返回任何东西。第一行之后是返回语句,后面什么都没有。试试这个:

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