Domanda

Quale possibile ragioni fai a sapere per la situazione, descritta nel titolo? Ecco cosa il mio aspetto bt come:

#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 ()

e mi dà Program terminated with signal 11, Segmentation fault.

Il wrapper per fflush () è semplice, non fa nulla, solo le chiamate fflash e controllo per gli errori (se il codice restituito è <0). Quindi, credo che il guasto è causato da seg fflash. O è possibile essere da qualche altra parte, a causa della ?? in cima alla pila?

OS: RHEL5; gcc version 3.4.6 20.060.404 (Red Hat 3.4.6-3); debug con gdb, con l'exe originale con le informazioni di debug massimo in esso.

so di colpa seg su alcuno spazio sul disco, ma questo non è il caso (come ho un cane da guardia per l'applicazione, che si riavvia il programma di nuovo e tutto continua a lavorare bene).

Tutte le idee sarebbe utile. Grazie.

Modifica


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();
        }
    }
}

** NOTE ** Non è possibile incollare l'intero codice, è una parte di oltre 10 migliaia di codice. Anche questo è lavorato per anni in diverse applicazioni, sui sistemi real-time. Tali incidenti sono molto, molto raro - un pò due volte l'anno. Quindi, non credo che questo è problema nel codice. So che nessuno mi può aiutare con questo genere di cose, è per questo che sto solo chiedendo per tutte le idee, perché fflush può causare guasti seg.

È stato utile?

Soluzione 2

E 'apparso, che per alcuni motivi, c'era qualcosa di strano con le autorizzazioni (non so cosa esattamente), ma questo era accaduto su un cambiamento ora, come diversi file sono scritti per ogni ora. Quindi, in qualche modo, è stato creato il file, ma non c'erano i permessi di scrivere in esso, o qualcosa di simile. Nessuno in realtà capito cosa, come e perché quello che è successo (perché dopo l'incidente, l'applicazione è stata riavviata e tutto era perfettamente bene). Così, si è schiantato flush, a causa di nessuna autorizzazione per farlo.

E 'ancora mistero .. ma risolto xD

Altri suggerimenti

La mia ipotesi:. Si dispone di corruzione della memoria da qualche parte e LogFile "This" punti ad un'area di memoria che non è possibile l'accesso

In ogni caso, è difficile dire senza codice.

non forniscono il codice per Flush(), ma suona strano a me che si chiama due volte. In realtà sembra che si chiama. Questo può causare qualche perdita di risorse, a seconda dell'implementazione di Flush().

Eseguire il programma sotto valgrind , che ti aiuterà a trovare la fonte di cui è danneggiato la memoria dell'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top