【问题标题】:My program crashes on fflush because of seg fault, ... but not always?由于段错误,我的程序在 fflush 上崩溃,......但并非总是如此?
【发布时间】:2010-11-23 11:31:42
【问题描述】:

您知道标题中描述的这种情况的可能原因是什么?这是我的 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 并检查错误(如果返回的代码是 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 可能会导致 seg 错误。

【问题讨论】:

  • 您应该至少发布 PerformPeriodicalFlush /OpenLogFile/Close/Flush 的代码
  • 我无法粘贴所有函数,因为它们使用一些用户定义的类型,进行额外的检查等。

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


【解决方案1】:

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

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

【讨论】:

  • 不能真正提供代码,因为我说的是数千(超过 10)行代码..
【解决方案2】:

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

这仍然是个谜……但解决了 xD

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不,它不是在自称:/
    【解决方案4】:

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

    【讨论】:

    • 问题是,我无法重现这种情况 - 我查看日志文件,一切似乎都很好。如果我重现问题,我会毫无问题地修复它,毫无疑问.但我不能:/这就是为什么我要求任何想法,任何:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2023-03-26
    • 2012-07-04
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多