刷新基于 c/c++ 的可执行文件的标准输出消息

Flushing stdout messages of c/c++ based executable

我的问题很笼统,与特定的调试场景无关。

当程序意外终止时(紧急情况、内存损坏、访问冲突等...),有时最近的 stdout 消息不会出现在屏幕上,即使它们发生在终止之前。

这是因为 stdout 消息首先被写入缓冲区,该缓冲区在终止时也会被擦除,而无需提前写入 stdout。

我的问题是是否有一个通用选项来刷新所有调试消息 在程序意外终止之前的 c/c++ 代码中? (我更喜欢使用一些通用的编译器配置,而不是针对特定实现的临时解决方案,例如 std::cout - 如果有这样的选项,我很乐意知道它是否对 GCC 和 G++ 通用)

注意:我假设当为每个新到达的消息刷新此缓冲区时,会损害性能。但是,它仅适用于调试版本。

谢谢

尝试 setvbuf 设置无缓冲区

setvbuf(stream, NULL, _IONBF, 0)