Моя программа падает на 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, это поможет вам найти источник повреждения памяти вашего приложения.

Другие вопросы по тегам