Моя программа падает на fflush из-за ошибки seg, но не всегда?
Какие возможные причины вы знаете для ситуации, описанной в заголовке? Вот как выглядит мой bt:
# 0 0x00a40089 в?? () #1 0x09e3fac0 in?? () #2 0x09e34f30 in?? () #3 0xb7ef9074 in?? () #4 0xb7ef9200 in?? () #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 (Red Hat 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 ответа
Оказалось, что по каким-то причинам с разрешениями было что-то странное (не знаю, что именно), но это произошло с часовым изменением, так как разные файлы записываются для каждого часа. Итак, каким-то образом файл был создан, но не было разрешений на запись в него, или что-то в этом роде. На самом деле никто не понимал, что, почему и как это произошло (потому что после сбоя приложение было перезапущено, и все было просто отлично). Так, flush
потерпел крах из-за отсутствия разрешений на это.
Это все еще загадка.. но решено xD
Мое предположение: у вас где-то повреждена память, и LogFile "this" указывает на область памяти, к которой вы не можете получить доступ.
Во всяком случае, трудно сказать без кода.
Вы не предоставляете код для Flush()
, но звучит странно для меня, что это называется дважды. На самом деле кажется, что он сам себя называет. Это может вызвать некоторую утечку ресурсов, в зависимости от реализации Flush()
,
Запустите вашу программу под valgrind, это поможет вам найти источник повреждения памяти вашего приложения.