GDB调试器挂在std::cout上
GDB debugger hanging on std::cout
由于我的学习,我一直在编写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;
}
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- "std::cout << std::endl;"如何编译?
- std::cout/std::cerr seg faults