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