gpt4 book ai didi

c++ - 跟踪对 std::cout 的调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:24 26 4
gpt4 key购买 nike

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

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

因此数据不会立即打印到 stdout,而是在其他东西调用 std::cout 并通过 std::endl 或 std::flush 刷新缓冲区时显示。因此我想知道是谁调用了 std::cout?现在我必须追查 C++ 标准库函数调用。如果对 std::cout 的调用隐藏得很深,追踪起来会很麻烦。

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

最佳答案

最简单的方法是使 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);
// ...
}

关于c++ - 跟踪对 std::cout 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53993903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com