您对标题中描述的情况了解哪些可能的原因?这是我的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();
}
}
}
答案 0 :(得分:1)
我的猜测:你在某处有内存损坏,LogFile的“this”指向你无法访问的内存区域。
无论如何,没有代码就很难说出来。
答案 1 :(得分:1)
看起来,由于某些原因,权限有些奇怪(不确定究竟是什么),但这发生在一小时更改,因为每小时写入不同的文件。因此,在某种程度上,文件已创建,但没有权限写入,或类似的东西。没有人真正理解发生了什么,为什么以及如何发生(因为在崩溃之后,应用程序重新启动,一切都非常好)。所以,flush
崩溃,因为没有权限这样做。
它仍然是个谜......但解决了xD
答案 2 :(得分:0)
您没有提供Flush()
的代码,但我发现它被调用两次听起来很奇怪。事实上它似乎自称。这可能会导致一些资源泄漏,具体取决于Flush()
的实现。
答案 3 :(得分:0)
在valgrind下运行您的程序,它将帮助您找到应用程序内存损坏的来源。