Моя программа вылетает на Fflush из-за неисправности SEG, ... но не всегда?

StackOverflow https://stackoverflow.com/questions/4255578

Вопрос

Какие возможные причины вы знаете о ситуации, описанной в названии? Вот что выглядит мой 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().

Запустите вашу программу под валгринда, это поможет вам найти источник того, где память вашего приложения повреждена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top