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.

  • Come bloccare automaticamente e temporaneamente un indirizzo IP che crea troppi colpi sul server in un periodo di tempo ridotto?
  • I Macports sono buoni o cattivi come ho l'impressione?
  • l'inoltro di port iptables non ha effetto quando server e client sulla stessa macchina?
  • PCI Compliance: installare Apache 2.4.17 su Ubuntu 14.04.3?
  • pidof che dà risultato inesatto
  • Perché il chroot_local_user di vsftpd è insicuro?
  • Il segfault può essere soppresso e l'applicazione non riceve segnale? O quali errori dmesg può significare?

  • Same problemi di disco rigido in dmesg su diversi server
  • kernel: EDAC MC0 spam in dmesg
  • Come convertire il formato di tempo 'dmesg' in formato 'reale'
  • Centos Linux con dimesg timestamp
  • dmesg SYN inondazione su 80 sysctl -p
  • Alta media di carico, ma basse CPU / IO figure - come diagnosticare? (output dmesg inclusa)
  • 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.