跟踪对std :: cout的调用

时间:2019-01-01 07:56:13

标签: c++ linux

如何跟踪对std :: cout的调用?

我时不时遇到的情况是代码(通常是一些第三方代码),它将调用std :: cout且缓冲区不会立即被刷新。

因此,数据将不会立即打印到stdout,并且稍后在其他调用std :: cout并通过std :: endl或std :: flush刷新缓冲区时显示。因此,我想知道谁叫std :: cout?现在,我必须逐一介绍C ++标准库函数调用。如果对std :: cout的调用根深蒂固,那么跟踪下去可能会很烦人。

有什么好的方法可以跟踪std :: cout或任何类似的C ++标准库函数以查看在何处?我的平台是Linux,尽管它可以应用于任何系统。

1 个答案:

答案 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);
    // ...
}