Моя программа падает на fflush из-за ошибки seg, но не всегда? - PullRequest
0 голосов
/ 23 ноября 2010

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

OS: 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 может вызвать ошибку seg.

Ответы [ 4 ]

1 голос
/ 17 декабря 2010

Оказалось, что по каким-то причинам в разрешениях было что-то странное (не знаю, что именно), но это произошло при смене часа, так как разные файлы записываются для каждого часа.Итак, каким-то образом файл был создан, но у него не было прав на запись или что-то в этом роде.Никто на самом деле не понимал, что, почему и как это произошло (потому что после сбоя приложение было перезапущено, и все было просто отлично).Итак, flush потерпел крах из-за отсутствия разрешений на это.

Это все еще загадка .. но решено xD

1 голос
/ 23 ноября 2010

Мое предположение: у вас где-то повреждена память, и LogFile "this" указывает на область памяти, к которой вы не можете получить доступ.

Во всяком случае, трудно сказать без кода.

0 голосов
/ 23 ноября 2010

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

0 голосов
/ 23 ноября 2010

Вы не предоставляете код для Flush(), но мне кажется странным, что он вызывается дважды.На самом деле кажется, что он сам себя называет.Это может вызвать некоторую утечку ресурсов, в зависимости от реализации Flush().

...