Моя программа вылетает на Fflush из-за неисправности SEG, ... но не всегда?
Вопрос
Какие возможные причины вы знаете о ситуации, описанной в названии? Вот что выглядит мой BT:
# 0x00a40089 в ?? () # 1 0x09e3fac0 в ?? () # 2 0x09E34F30 в ?? () # 3 0xb7ef9074 в ?? () # 4 0xb7ef9200 в ?? () # 5 0xb7ef9028 в ?? () # 6 0x081d45a0 в logfile :: flush () # 7 0x081d45a0 в logfile :: flush () # 8 0x081d46e0 в logfile :: Закрыть () # 9 0x081d4dbf в logfile :: openlogfile () # 10 0x081d4eb9 в logfile :: profiteriodicalflush () # 11 0x081D4FCA в Logfile :: StoreRecord () # 12 0x081D50C2 в 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();
}
}
}
** Примечание ** Не удается вставить весь код, это часть 10+ тысяч кодов. Также это работает много лет на разных приложениях, на системах в реальном времени. Такие аварии очень, очень редки - вроде два раза в год. Итак, я не думаю, что это проблема в коде. Я знаю, что никто не может помочь мне с такими вещами, поэтому я просто прошу любые идеи, почему Fflush может вызвать ошибку SEG.
Решение 2
Оказалось, что по некоторым причинам было что-то странное с разрешениями (не уверена, что именно), но это произошло в часе изменения, так как разные файлы записываются на каждый час. Итак, каким-то образом файл был создан, но не было никаких разрешений для записи в нем или что-то вроде этого. Никто на самом деле не понял, что, почему и как это произошло (потому что после аварии приложение было перезапущено, и все было просто отлично). Так, flush
разбился, из-за отсутствия разрешений сделать это.
Это все еще загадка .. но решена XD
Другие советы
Я думаю: у вас есть коррупция памяти где-то и логика «это» указывает на область памяти, которую вы не можете получить доступ.
Во всяком случае, без кода трудно сказать.
Вы не предоставляете код для Flush()
, но звучит странно для меня, что он называется дважды. На самом деле кажется, что он называет себя. Это может привести к тому, что некоторые утечки ресурсов в зависимости от реализации Flush()
.
Запустите вашу программу под валгринда, это поможет вам найти источник того, где память вашего приложения повреждена.