如果应用程序崩溃,Windows控制台记录到文件会丢失尾部;怎么看尾巴?

时间:2009-07-03 16:43:14

标签: windows logging console truncation

我们构建了复杂的基于控制台的工具,可以在控制台上产生大量的评论。这些工具处理大量数据,因此运行成本很高,我们不喜欢经常这样做,特别是在我们必须重复运行它们的测试期间。在此类测试期间,我们经常将结果记录到文件中以捕获此注释以供检查:        C:> [ourcommand]> log.txt 当应用程序运行完成时,这很有效。

如果应用程序崩溃(非法内存引用等),Windows会在评论的尾部之前删除日志文件,这样我们就无法看到崩溃时发生了什么。它还在同一个地方插入控制台输出。因此,当我们得到截断的日志文件时,我们必须在没有日志文件的情况下再次完成所有操作,以查看最终答案。如果不记录,Windows似乎不会缓冲控制台输出。

有没有办法告诉Windows在登录时不要缓冲控制台输出?我们的应用程序确实使用了(Windows)C运行时系统,不久之前我们使用了“setvbuf” 如下:       setvbuf(stdout,NULL,_IONBF,0); 但无济于事。

3 个答案:

答案 0 :(得分:2)

您可以随时刷新控制台的缓冲区:

Console.Out.Flush();

这使用TextWriter.Flush()

如果你需要确保这种情况总是发生,那么编写一个像WriteLine一样工作的控制台的方法会很容易,但最后会包含一个flush语句。


编辑:

你没有指定语言......我打算用C#编写一个例子。

在C#中,您可以轻松创建一个提供类似方法的静态实用程序类:

public static class FlushingConsole {
    public static void WriteLine(string format, params Object[] args) {
        Console.WriteLine(format, args);
        Console.Out.Flush();
    }
    // Add other overloads as required
}

然后打电话:

FlushingConsole.WriteLine(....);

同样的方法也适用于几乎任何其他语言。


编辑2:

由于您使用的是C ++,因此除了setvbuf之外还有一些其他选项可能会引起您的兴趣。

首先,您应该可以通过执行以下操作来关闭cout中的缓冲:

cout.unsetf(ios_base::unitbuf);

如果你将stdio(即:printf)与iostream混合,你也可能需要设置sync_with_stdio

答案 1 :(得分:0)

您没有指定语言,但对于C ++,您应该能够使用stdout作为第一个关闭缓冲的参数来调用setvbuf

答案 2 :(得分:0)

您似乎正在使用标准输出。你最好使用“标准错误”。 (C库中的stderr,iostream中的cerr)这些都没有缓冲。或者,每次要同步时,都可以使用FlushFileBuffers(或模拟)。