0

您知道标题中描述的这种情况的可能原因是什么?这是我的 bt 的样子:

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

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

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

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

我知道磁盘上没有空间的段错误,但这不是这种情况(因为我有一个应用程序的看门狗,它再次重新启动程序并且一切正常)。

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

编辑


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();
        }
    }
}

**注意**不能粘贴整个代码,它是 10+ 数千个代码的一部分。此外,这在实时系统上的不同应用程序上工作了多年。这样的崩溃非常非常罕见 - 一年两次。所以,我不认为这是代码中的问题。我知道没有人可以帮助我处理这种事情,这就是为什么我只是在寻求任何想法,为什么 fflush 可能会导致段错误。

4

4 回答 4

1

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

无论如何,没有代码很难分辨。

于 2010-11-23T11:34:42.907 回答
1

看起来,由于某些原因,权限有些奇怪(不确定到底是什么),但这发生在一个小时的变化中,因为每个小时都会写入不同的文件。所以,在某种程度上,文件被创建了,但是没有权限写入它,或者类似的东西。没有人真正理解这是什么、为什么以及如何发生的(因为在崩溃之后,应用程序重新启动并且一切都很好)。所以,flush崩溃了,因为没有这样做的权限。

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

于 2010-12-17T10:02:08.733 回答
0

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

于 2010-11-23T12:44:08.967 回答
0

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

于 2010-11-23T17:15:57.837 回答