【问题标题】:std::ofstream constructor blockingstd::ofstream 构造函数阻塞
【发布时间】:2014-11-06 13:19:45
【问题描述】:

我有以下代码:

std::ofstream stat("/opt/lic_status");
if ( stat.is_open() )
{
    stat << ver;
    stat.close();
}

我的问题是在第一行执行被阻止。在此块期间,看门狗生成了一个核心转储,它看起来像这样:

(gdb) bt
#0  0x00cb5430 in __kernel_vsyscall ()
#1  0x00b2833b in open () from /lib/libc.so.6
#2  0x00ac37c8 in _IO_new_file_fopen () from /lib/libc.so.6
#3  0x00ab73dd in __fopen_internal () from /lib/libc.so.6
#4  0x00ab9c4c in fopen64 () from /lib/libc.so.6
#5  0x00d6e877 in std::__basic_file<char>::open(char const*, std::_Ios_Openmode, int)     () from /usr/lib/libstdc++.so.6
#6  0x00d1d75e in std::basic_filebuf<char, std::char_traits<char> >::open(char const*,     std::_Ios_Openmode) () from /usr/lib/libstdc++.so.6
#7  0x08b625b8 in open () at /usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include    /c++/4.4.4/fstream:699
#8  basic_ofstream () at /usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/fstream:628

我需要提一下,当问题发生时,我不知道 /opt/lic_status 文件的状态是什么。我不知道它是被其他进程打开的,还是根本存在的。

任何人对可能导致这种情况的原因有什么建议吗? 我只有核心转储,我可以从中获取任何信息吗?

【问题讨论】:

  • 你能重现这个问题吗?
  • 我不这么认为。如果我能复制它,我能得到什么信息?

标签: c++ linux gcc gdb centos


【解决方案1】:

“我需要提一下,我不知道 /opt/lic_status 文件,当问题发生时。我不知道它是被其他进程打开,还是根本不存在。”

根据我的理解,文件的上述属性/状态都不会导致程序阻塞在该特定行上(即用户模式程序在 std::ofstream 构造函数中调用 open() 的位置)。每当用户模式程序调用open() 系统调用打开文件时,系统都会以适当的错误代码完成调用。系统(内核模式)不会返回用户模式。

有人对造成这种情况的原因有任何建议吗?一世 只有核心转储,我可以从中获取任何信息吗?

  1. 整个系统(内核)状态不佳(由于某些未知原因)。
  2. 该程序是多线程的,并且一些其他线程被卡在某个地方。通过查看该线程的调用堆栈,它看起来没问题,因为它正在内核模式下执行并调用open() 系统调用。

如果我们遇到第一种情况,那么我相信我们不能做太多,程序的核心转储文件不会提供任何额外的信息来识别/确认这一点。核心转储文件仅包含该特定进程的快照。

但是,如果我们是第二种情况,那么我们应该尝试进一步分析 core-dump 文件。加载核心转储文件后,我们可以在GDB 命令提示符中触发以下命令。

$info threads
$thread apply all backtrace

上面的命令会给出信息(如果你的程序是多线程的)以及所有线程的调用堆栈。这可能有助于理解您的问题。以上信息如果你已经做过,可以忽略。

【讨论】:

  • 感谢您的回答。事实上,我还有其他线程(大约 40 个),其中大部分都被阻塞了(如预期的那样)。另一个线程的状态如何影响 open() 系统调用的行为?
  • 现在我们在两台不同的机器上两次解决了完全相同的问题。会不会是内核问题?
  • 根据我的理解,应该是用户模式程序问题(不是内核问题)。您应该尝试分析其他线程调用堆栈并仔细理解它们。理想情况下,没有线程应该能够影响您的 open() 系统调用线程,这可能是其他线程状态的牺牲品。最终你必须弄清楚:)。万事如意..
  • 也可能是内核级别的问题。但是在那种情况下,其他一些程序(除了当前的)或整个系统应该是缓慢的......这又是我根据我的理解和经验的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多