由于seg故障,我的程序因fflush而崩溃,但并非总是如此?

时间:2010-11-23 11:31:42

标签: c++ crash rhel5 fflush core-file

您对标题中描述的情况了解哪些可能的原因?这是我的bt的样子:

#0  0x00a40089 in ?? ()
#1  0x09e3fac0 in ?? ()
#2  0x09e34f30 in ?? ()
#3  0xb7ef9074 in ?? ()
#4  0xb7ef9200 in ?? ()
#5  0xb7ef9028 in ?? ()
#6  0x081d45a0 in LogFile::Flush ()
#7  0x081d45a0 in LogFile::Flush ()
#8  0x081d46e0 in LogFile::Close ()
#9  0x081d4dbf in LogFile::OpenLogFile ()
#10 0x081d4eb9 in LogFile::PerformPeriodicalFlush ()
#11 0x081d4fca in LogFile::StoreRecord ()
#12 0x081d50c2 in LogFile::StoreRecord ()

它给了我Program terminated with signal 11, Segmentation fault.

fflush()的包装很简单,什么都不做,只调用fflash并检查错误(如果返回的代码是< 0)。所以,我猜这个seg错误是由fflash引起的。或者它可能在其他地方,因为堆栈顶部的??

操作系统:RHEL5; gcc版本3.4.6 20060404(Red Hat 3.4.6-3);使用gdb调试,使用原始exe,其中包含最大调试信息。

我知道磁盘上没有空间的seg故障,但这不是这种情况(因为我有一个看门狗的应用程序,重新启动程序,一切都保持正常工作)。

任何想法都会有所帮助。 感谢。

编辑


void LogFile::PerformPeriodicalFlush( const utils::dt::TimeStamp& tsNow )
throw( LibCException )
{
 m_tsLastPeriodicalCheck = tsNow;

 struct stat LogFileStat;
 int nResult = stat( m_sCurrentFullFileName.c_str(), &LogFileStat );
 if ( 0 == nResult && S_ISREG( LogFileStat.st_mode ) )
 {
  //we successfuly stated the file, so it exists. We can safely perform 
  //a flush.
  try
  {
   Flush();
   return;
  }
  catch ( LibCException& )
  {
   OpenLogFile( tsNow );
   return;
  }
 }
 else
 {
  OpenLogFile( tsNow );
 }
}
void RotatingLogFile::Flush() throw( object::LibCException )
{
    if ( m_pFile != NULL )
    {
        if ( fflush( m_pFile ) (less_than) 0 )
        {
            throw object::LibCException();
        }
    }
}

**注意**不能粘贴整个代码,它是成千上万代码的一部分。此外,它在不同的应用程序上,在实时系统上工作多年。这种撞车非常非常罕见 - 有点一年两次。所以,我不认为这是代码中的问题。我知道没有人可以帮我解决这类问题,这就是为什么我只是要求任何想法,为什么fflush可能会导致seg错误。

4 个答案:

答案 0 :(得分:1)

我的猜测:你在某处有内存损坏,LogFile的“this”指向你无法访问的内存区域。

无论如何,没有代码就很难说出来。

答案 1 :(得分:1)

看起来,由于某些原因,权限有些奇怪(不确定究竟是什么),但这发生在一小时更改,因为每小时写入不同的文件。因此,在某种程度上,文件已创建,但没有权限写入,或类似的东西。没有人真正理解发生了什么,为什么以及如何发生(因为在崩溃之后,应用程序重新启动,一切都非常好)。所以,flush崩溃,因为没有权限这样做。

它仍然是个谜......但解决了xD

答案 2 :(得分:0)

您没有提供Flush()的代码,但我发现它被调用两次听起来很奇怪。事实上它似乎自称。这可能会导致一些资源泄漏,具体取决于Flush()的实现。

答案 3 :(得分:0)

valgrind下运行您的程序,它将帮助您找到应用程序内存损坏的来源。