标准错误到文件;但没有缓冲

发布于 2024-09-02 19:00:53 字数 112 浏览 6 评论 0原文

我正在尝试隔离一个令人讨厌的错误,它会导致我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅唱々樱花落 2024-09-09 19:00:53

实际上,stderr 默认情况下是无缓冲的,但我认为这只是就 C 运行时而言。我们之前已经解决过这个问题:(

fflush (stderr); fsync (fileno (stderr));

虽然我们实际上是对 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:

fflush (stderr); fsync (fileno (stderr));

(although we actually did it to stdout but the same rules apply - the actual fflush may not be necessary for stderr but it does no harm).

The fflush flushes the C runtime buffers to the OS, the fsync forces write to disk.

Keep in mind this may severely affect your performance.

请别遗忘我 2024-09-09 19:00:53

您可以使用 fflush(stderr); 强制刷新缓冲区

You can force flushing the buffer, using fflush(stderr);

滿滿的愛 2024-09-09 19:00:53

您可以在启动应用程序时尝试使用 setvbuf

setvbuf(stderr, NULL, _IONBF, 0);

但是,您将读取 stdio 缓冲区,但仍然存在“内核中”缓冲区问题,除非您进行 fsync,否则该问题不会消失。然而,从用户空间跟踪内核错误可能并不是最好的方法。

您可以使用串行控制台并在另一台机器上获取输出吗?这样你就可以同时获得 oops 和 stderr 消息

You can try to use setvbuf when starting your app

setvbuf(stderr, NULL, _IONBF, 0);

However, 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文