GNU/Linux >> Linux Esercitazione >  >> Linux

Un "errore di segmentazione" è un errore di sistema o un bug del programma?

Attualmente sto eseguendo uno script di modellazione statistica che esegue un'ANOVA filogenetica. Lo script funziona correttamente quando analizzo l'intero set di dati. Ma quando prendo un sottoinsieme, inizia l'analisi ma termina rapidamente con un errore di segmentazione. Non riesco davvero a capire cercando su Google se ciò potrebbe essere dovuto a un problema da parte mia (ad esempio set di dati di esempio troppo piccolo per l'analisi) e/o bug nello script o se questo ha qualcosa a che fare con il mio sistema Linux. Ho letto che ha a che fare con la scrittura di dati nella memoria, ma allora perché va tutto bene con un set di dati più grande? Ho provato a trovare maggiori informazioni usando google, ma questo ha reso il tutto più complicato.

Grazie per aver chiarito in anticipo!

Risposta accettata:

(tl;dr:È quasi certamente un bug nel tuo programma o una libreria che utilizza.)

Un errore di segmentazione indica che un accesso alla memoria non era legale. Cioè, in base alla richiesta emessa, la CPU emette un errore di pagina perché la pagina richiesta non è residente o ha autorizzazioni incongrue con la richiesta.

Dopodiché, il kernel controlla per vedere se semplicemente non sa nulla di questa pagina, se non è ancora in memoria e dovrebbe metterla lì, o se ha bisogno di eseguire una gestione speciale (ad esempio, copia su -write le pagine sono di sola lettura e questo valido errore di pagina potrebbe indicare che dovremmo copiarlo e aggiornare le autorizzazioni). Consulta Wikipedia per errori di pagina minori e maggiori (ad es. paginazione della domanda) e non validi.

Ottenere un errore di segmentazione indica il caso non valido:la pagina non solo non è in memoria, ma anche il kernel non ha alcuna azione correttiva da eseguire perché il processo non ha logicamente quella pagina del suo spazio di indirizzi virtuali mappata. In quanto tale, questo indica quasi certamente un bug nel programma o in una delle sue librerie sottostanti, ad esempio il tentativo di leggere o scrivere in memoria che non è valido per il processo. Se l'indirizzo fosse valido, potrebbe aver causato il danneggiamento dello stack o scarabocchiato su altri dati, ma la lettura o la scrittura di un un la pagina mappata viene rilevata dall'hardware.

Il motivo per cui funziona con il tuo set di dati più grande e non con il tuo set di dati più piccolo è del tutto specifico di quel programma:probabilmente è un bug nella logica di quel programma, che è scattato solo per il set di dati più piccolo per qualche motivo (ad esempio, il tuo set di dati potrebbe avere un campo che rappresenta il numero totale di voci e, se non è aggiornato, il tuo programma potrebbe leggere alla cieca nella memoria non allocata se non esegue altri controlli di integrità).

È diversi ordini di grandezza meno probabile che essere semplicemente un bug del software, ma un errore di segmentazione può anche essere un indicatore di problemi hardware, come memoria difettosa, CPU difettosa o hardware che inciampa su errata (ad esempio, vedi qui).

Correlati:Debian – Automatizzare l'installazione di singoli pacchetti debian 8 con prompt interattivi?

Ottenere segfault a causa di hardware difettoso spesso si traduce in un comportamento a volte funzionante, anche se un po 'di RAM fisica potrebbe essere mappato allo stesso modo in esecuzioni ripetute di un programma se non si esegue nient'altro nel mezzo. Puoi principalmente escludere questa possibilità avviando memtest86+ per verificare la presenza di RAM difettosa e utilizzando software come Prime95 per sottoporre a stress test la tua CPU (incluse le unità di esecuzione FMA matematiche FP).

Puoi eseguire il programma in un debugger come gdb e ottenere il backtrace al momento dell'errore di segmentazione, che probabilmente indicherà il colpevole:

% gdb --args ./foo --bar --baz
(gdb) r   # run the program
[...wait for segfault...]
(gdb) bt  # get the backtrace for the current thread

Linux
  1. Correggi l'errore PHP:non è sicuro fare affidamento sulle impostazioni del fuso orario del sistema

  2. Come reindirizzare le informazioni sull'errore del programma C eseguibile su Stdout? (Mac Os X)?

  3. Come installare una versione precedente di un programma?

  4. Come si configura una pagina di errore personalizzata?

  5. Come si esce dal programma X11 senza errori

Come risolvere l'errore Initramfs in Fedora

Come creare il tuo primo programma Java in Debian 10

Il tuo primo programma Java nel terminale di Ubuntu

Come creare una pagina di errore personalizzata 404 in cPanel

Come correggere l'errore "Rilevato problema del programma di sistema" su Ubuntu

Procedura:Introduzione alla programmazione:il tuo primo programma