Che cos'è un errore di segmentazione?


27

In Ubuntu ho riscontrato molte volte l'errore di segmentazione. Che cos'è un errore di segmentazione e quando si verifica?


1
Solo per nasconderlo: avevo un problema simile, mentre i miei segfault non erano riproducibili in modo affidabile e provenivano da (quasi) applicazioni casuali. Ho scoperto che molto probabilmente la mia memoria è rotta. Quindi se un qualsiasi programma causa segfault, si potrebbe dare un'occhiata più da vicino alla RAM.

Risposte:


25

Un errore che dice un errore di segmentazione (o segfault o SIGSEGV ) in Ubuntu e altri sistemi operativi simili a Unix o che dice un errore di protezione generale in Windows, è quando un programma tenta di accedere a una parte della memoria a cui non è possibile accedere, o a cui il programma è vietato l'accesso. Un errore di segmentazione è un tipo di arresto anomalo del programma, ovvero un'interruzione anomala di un programma. Vedi gli articoli di Wikipedia su incidenti , protezione della memoria , errore di segmentazione , errore di protezione generale , e SIGSEGV per ulteriori informazioni (e di una comprensione più strutturata del tema che è qui presentato).

Un errore di segmentazione è quasi sempre dovuto a un bug nel programma in cui si verifica. Immagino che la maggior parte o tutti i tuoi errori di segmentazione provengano dalla stessa applicazione. Fornisci maggiori dettagli sulle circostanze in cui si verificano errori di segmentazione sulla tua macchina e su quale programma sta andando in crash. Fornisci anche il testo completo ed esatto del messaggio di errore che stai ricevendo e tutti gli altri messaggi che appaiono prima di esso. Ciò dovrebbe consentirci di fornire consigli dettagliati specifici per il tuo problema (anziché solo informazioni generali su cosa sia un errore di segmentazione).

Il modo migliore per fornire queste informazioni è modificare la domanda per includerla . In alternativa, se si desidera che questa domanda riguardi solo gli errori di segmentazione in generale, è possibile pubblicare una nuova domanda per porre domande su ciò che sta causando in modo specifico gli errori di segmentazione (in tal caso, assicurarsi di fornire tutti questi dettagli nella nuova domanda) .


fortunatamente tutti gli errori di segmentazione vengono risolti aggiornando os :). La mia domanda riguarda l'errore di segmentazione in generale. Non per una particolare app.
Tachyons,

@ Io non sono un utente che ho modificato la mia risposta di conseguenza. (Conservo le istruzioni per fornire ulteriori informazioni, a beneficio di altri utenti che riscontrano errori di segmentazione, anche se so che non hai bisogno di assistenza specifica con loro in questo momento.)
Eliah Kagan,

Bene, si tratta di un errore di segmentazione in un'app. Volevo chiederlo se si verifica in un programma C ++ in cui lo stesso programma funziona perfettamente in Windows o Turbo C ++ (nel vino) (uso anjuta in Linux). E questi sono solo programmi di base e non applicazioni (programmi come TREES , GRAFICI, ecc.)
Nirmik,

Grazie. Ma nella maggior parte dei casi ho paura che porre domande sull'errore di segmentazione nell'app sia offtopico qui. :)
Tachyons,

@Nirmik: probabilmente è l'argomento dello
stackoverflow

4

L'errore di segmentazione è causato da un bug nell'applicazione. Tecnicamente significa che l'applicazione tenta di leggere o scrivere su una parte della memoria che non appartiene ad essa (o non esiste). È ovviamente vietato leggere o scrivere nella memoria di qualcun altro e quando il sistema (kernel) lo rileva, forzerà la chiusura dell'applicazione.


0

Sono finiti i giorni in cui le persone erano solite rintracciare il codice assembly e eseguire il debug di un problema. Abends, Dr Watson, errore di segmentazione. Quei giorni verdi sono andati.

Uno dei motivi di un errore di segmentazione è quando il codice che ha accesso diretto alla memoria fallisce. Quando un pezzo di codice tenta di accedere al segmento di memoria di un'altra applicazione, si verifica un errore di segmentazione. Le allocazioni di memoria vengono talvolta spostate per consentire l'allocazione di blocchi contigui di memoria più grandi. Mentre tenta di ripristinare, il kernel si impegna a fondo per salvare tutte le informazioni sulla memoria in un file, lo stato corrente di tutte le applicazioni in esecuzione sulla cpu e il loro stato (ultima istruzione eseguita) in un file e muore. Tenterà inoltre di archiviare quante più informazioni di recupero e di chiudere quanti più file possibile, in modo che l'hdd non ottenga collegamenti interrotti.

Esegui il debug e correggilo se riesci a riprodurlo spesso. Se non riesci a riprodurlo, basta unire le mani, inginocchiarsi e pregare come l'inferno di non vederlo "regolarmente".


I Segfaults possono essere attivati ​​in qualsiasi programma scritto in una lingua che consente l'accesso diretto alla memoria. In genere non arresteranno nemmeno il kernel.
Alex L.

@AlexL. questo è accurato. Modificherò la mia risposta.
Siddharth,

Spero di aver rappresentato correttamente i miei pensieri.
Siddharth

@AlexL. Puoi per favore rivederlo ancora una volta. Lo cancellerò, se non è ancora preciso.
Siddharth

Questo è meglio. Tuttavia, (1) sebbene sia possibile, è estremamente raro che un programma imposti il SIGSEGVgestore su qualcosa di diverso da SIG_DFL(che è il dump del core ed esce per a SIGSEGV) poiché se si accede alla memoria che non si dovrebbe fare, qualcosa è andato molto sbagliato e il recupero è probabilmente impossibile. (2) Un core verrà scaricato solo dopo che il processo è stato interrotto. (3) Il dump principale include solo la memoria e i registri del processo che è stato scaricato. (4) Altri processi, la CPU e il kernal non sono influenzati dalla segfault di un altro processo.
Alex L.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.