gpt4 book ai didi

c++ - 程序崩溃时 C++ ofstream 的行为

转载 作者:可可西里 更新时间:2023-11-01 10:36:03 24 4
gpt4 key购买 nike

我正在尝试调试导致我的程序在执行过程中卡住的运行时错误。我创建了一个日志系统,它在执行过程中写入一个简单的日志文本文件。

我简单地使用 ofstream 对象的流插入 (<<) 运算符和 std::string 类型的消息将信息写入日志文件。

void foo(){
// ... Code block 1 ...
// myLogger.Write (timestamp, "Code block1 successfully executed");
// ... Code block 2 ... PROGRAM FREEZE AND CRASH!
}

我的问题是:假设我的程序死机了,我需要从任务管理器中终止它的进程,我可以相信我的日志系统在崩溃点之前可靠地写入了所有消息吗?

或者,引用上述代码,如果代码块 2 导致我的程序卡住,我是否可以相信“代码块 1 成功执行”消息在任何情况下都会确实显示在我的日志文件中?

附言我在 Windows 上,我感到担心的原因是我不完全相信在奇怪的情况下围绕文件权限的操作系统行为。我的程序确实对该文件具有读/写权限,但我不知道在崩溃期间会发生什么奇怪的事情。也许我只是多疑,如果是这样请告诉我。

是否有更好的方法来检测发生崩溃的代码块?

最佳答案

"can I trust that the "Code block1 successfully executed" message will in every case indeed show up in my log file?"

不,您不能相信当执行该语句时,任何内容最终都会写入您的日志文件,并且您的程序实际上处于某种异常状态。

通过隐含在要写入的行中的 flush() 调用,机会会变得更好,但仍然无法保证。这取决于您的程序遇到的异常条件。

考虑一个案例,您的程序由于未定义的行为而崩溃,该行为不小心弄乱了 Logger 类实例使用的缓冲区或数据中的某些内容。此外,如果您遇到某种内存不足的情况,则无法保证后续执行的代码,即使它被正确捕获也是如此。


另请注意:
多线程应用程序上下文中的日志系统通常不需要同步刷新。 flush() 的同步调用可能会改变实际应用的线程行为,并隐藏/混淆竞争条件,这些条件会在日志记录关闭时立即出现。

关于c++ - 程序崩溃时 C++ ofstream 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938824/

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