如何跟踪对std :: cout的调用?
我时不时遇到的情况是代码(通常是一些第三方代码),它将调用std :: cout且缓冲区不会立即被刷新。
因此,数据将不会立即打印到stdout,并且稍后在其他调用std :: cout并通过std :: endl或std :: flush刷新缓冲区时显示。因此,我想知道谁叫std :: cout?现在,我必须逐一介绍C ++标准库函数调用。如果对std :: cout的调用根深蒂固,那么跟踪下去可能会很烦人。
有什么好的方法可以跟踪std :: cout或任何类似的C ++标准库函数以查看在何处?我的平台是Linux,尽管它可以应用于任何系统。
答案 0 :(得分:4)
最简单的方法是使std::cout
始终刷新:
std::cout << std::unitbuf;
假设使用std::cout
,它将被所有正确编写的输出操作(例如,标准C ++库提供的所有输出操作都正确编写)自动刷新。
要在调试器中实际跟踪这些操作,最简单的方法是使用非缓冲过滤流缓冲区:由于没有缓冲区,因此每个字符都将调用此流缓冲区的overflow()
方法,因此易于拦截在调试器中:
struct trackbuf
: std::streambuf {
std::ostream&. d_out;
std::streambuf* d_sbuf;
explicit trackbuf(std::ostream& out)
: d_out(out), d_sbuf(out.rdbuf(this)) {
}
~trackbuf() { this->d_out.rdbuf(this->d_sbuf); }
int overflow(int c) override {
return this->d_sbuf->sputc(c); // set breakpoint here
}
};
// ...
int main() {
trackbuf buf(std::cout);
// ...
}