标准错误到文件;但没有缓冲
我正在尝试隔离一个令人讨厌的错误,它会导致我的 Linux 内核崩溃。我正在将消息打印到 stderr,并且 stderr 被重定向到日志文件。有没有办法禁用文件访问缓冲?当内核挂起时,我会丢失缓冲区中的消息。
I am trying to isolate a nasty bug, which brings down my linux kernel. I am printing messages to stderr and stderr is redirected to a log file. Is there a way to disable buffering on the file access? When kernel hangs, I am losing the messages in the buffer.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
实际上,
stderr
默认情况下是无缓冲的,但我认为这只是就 C 运行时而言。我们之前已经解决过这个问题:(虽然我们实际上是对
stdout
这样做的,但同样的规则适用 - 实际的fflush
对于stderr
可能不是必需的代码> 但它没有坏处)。fflush
将 C 运行时缓冲区刷新到操作系统,fsync
强制写入磁盘。请记住,这可能会严重影响您的表现。
Actually,
stderr
is unbuffered by default but I think that's only in terms of the C runtime. We've solved this before with:(although we actually did it to
stdout
but the same rules apply - the actualfflush
may not be necessary forstderr
but it does no harm).The
fflush
flushes the C runtime buffers to the OS, thefsync
forces write to disk.Keep in mind this may severely affect your performance.
您可以使用 fflush(stderr); 强制刷新缓冲区
You can force flushing the buffer, using
fflush(stderr);
您可以在启动应用程序时尝试使用 setvbuf
但是,您将读取 stdio 缓冲区,但仍然存在“内核中”缓冲区问题,除非您进行 fsync,否则该问题不会消失。然而,从用户空间跟踪内核错误可能并不是最好的方法。
您可以使用串行控制台并在另一台机器上获取输出吗?这样你就可以同时获得 oops 和 stderr 消息
You can try to use
setvbuf
when starting your appHowever, you will get read of the stdio buffer, but still have the "in kernel" buffer problem, that won't disappear unless you fsync. However may be tracking a kernel bug from userspace isn't the best way to go at it.
Can you use a serial console and get the output on another machine ? This way you could get both the oops and the stderr messages