Il segnale segfault è sempre inviato all'applicazione

La mia applicazione in genere si blocca e printing la pila per registrare se il segnale ricevuto segfault.

Ma in alcuni ambienti il ​​'dmesg' mostra messaggi segfault relativi alla mia applicazione, ma il tempo di impiego dell'applicazione è molto più vecchio.

Il segfault può essere soppresso e l'applicazione non riceve segnale? O quali errori dmesg può significare?

  • segnalazione output apache child pid Segnalazione guasto (11)
  • Apache segfault glibc segfault
  • Solaris cc segfaults quando si compila rsync su piattaforma intel
  • Errore di segmentazione PHP quando si utilizza più di 128M
  • Come diagnosticare i segreti frequenti
  • Molti errori di segmentazione nell'host Linux
  • i segfaults non si registrano nei / var / log / messages
  • Perché logrotate causa Apache a sego guasto each volta?
  • 4 Solutions collect form web for “Il segnale segfault è sempre inviato all'applicazione”

    È ansible un'applicazione o ignorare o fare un trattamento speciale per il segnale di guasto di segmentazione. La pagina manuale per i segnali e le relative pagine ha dettagli su di esso.

    Una ansible situazione che vedo potrebbe portre al comportmento descritto (dmesg reports segfaults ma l'applicazione è in esecuzione) è che l'applicazione forks e il child process segfaults. Per sapere se questo è il caso, controllare se l'ID di process riportto da dmesg è uguale a quello del process attualmente in esecuzione.

    I programmi che eseguono in background possono utilizzare bene la gestione di un SIGSEGV, se solo per accedere al fatto che sia accaduto insieme al context prima di uscire. Ciò fornisce non solo un'indicazione di cosa è andato storto in un file di registro, ma anche informazioni utili da includere in un report di bug. Sì, il segnale può essere ignorato, ma questo è solo attraverso azioni deliberate ed è quasi sempre una ctriggers idea (a less che non si stia testando sotto un kernel sperimentale con un sottosistema noto bug vmm).

    Purtroppo, una volta che il segnale viene catturato, QUALCUNO è sospetto. Ad esempio, utilizzando qualcosa che alloca memory all'interno del gestore SEGV è probabilmente una ctriggers idea. Lo stesso vale per le funzioni variadiche come printf (). Quindi, sì, mentre un'app è gestire il segnale, potrebbe non essere così efficace, quindi solo le tracce in dmesg.

    Comunque, sì, il segnale viene inviato all'applicazione, tuttavia SEGV non è un segnale in tempo reale e può essere unito dal kernel. Vale a dire, se un programma accede alla memory non ha diritti di accesso a 15 volte, esiste una buona probabilità che solo un SEGV verrà effettivamente erogato, a seconda della tempistica dell'accesso di memory illegale.

    Nei gestori di SEGV, open () write () e close () sono i tuoi amici e utilizzano un log di debug speciale (cioè non un stream di logging FILE che potrebbe essere stato aperto in precedenza).

    SIGSEGV viene inviato automaticamente dal kernel se un process fa qualcosa con la memory che non avrebbe dovuto fare; ma il segnale può essere intrappolato e il process può eseguire un gestore di segnali, che può tentare di recuperare dalla condizione di guasto. In questo caso, il process può continuare a funzionare.

    Il segnale può anche essere completamente ignorato, ma questo è qualcosa che dovrebbe essere evitato; get un SIGSEGV di solito significa che c'è qualcosa di veramente, davvero sbagliato in corso.

    Segmentazione L'errore di solito significa che qualcosa è andato molto sbagliato con lo stato interno dell'applicazione. Può essere solo così rotto, che non è in grado di eseguire il gestore di segnali – il gestore di segnali, che dovrebbe printingre il dump di stack, potrebbe anche schiantarsi.

    Modifica: Non ho capito abbastanza la parte 'vecchia di uptime', quindi l'ho ignorato. Come ora vedo la tua domanda è stata 'perché l'applicazione è ancora in esecuzione', quindi ecco la nuova risposta:

    Sì, l'applicazione può sopravvivere a un SIGSEGV. A volte SIGSEGV verrà inviato solo ad un filo less importnte (dovrebbe uccidere l'intera applicazione, ma a volte non lo è) o anche solo un process figlio: quello che vedete come un'applicazione può essere processi o thread multipli.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.