【发布时间】: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