Come debug di guasti di segmentazione in C?

Come debug di guasti di segmentazione in C?

Una violazione dell'accesso si verifica quando la CPU tenta di istituire le istruzioni al di fuori della sua area di memoria o legge o scrive in una posizione riservata che non esiste, con conseguente errore di segmentazione. La presente applicazione viene interrotta a seguito di questa azione e viene generato un risultato designato come errore di segmentazione. Poiché i dati sono spesso condivisi tra le regioni di memoria su un sistema e lo spazio di archiviazione del programma è condiviso tra le applicazioni, questo problema si verifica.

Alcune macchine possono provare un errore di segmentazione, mentre altre no. Se ciò accade, di solito significa che hai un problema con il tuo codice e siamo riusciti a cavarsela su quel sistema per fortuna. Tutto si basa su come è organizzata la memoria e se è azzerata o meno. Esamineremo come identificare il problema della segmentazione del programma in questo articolo.

Qual è l'errore di segmentazione?

Un errore di segmentazione, spesso noto come Segfault, è una sorta di errore del computer che si verifica quando il processore tenta di accedere a un indirizzo di memoria al di fuori della sua regione di archiviazione del programma a causa di una condizione imprevista. Il termine "segmentazione" si riferisce al metodo di protezione della memoria di una memoria virtuale. Quando lavoriamo con puntatori in C ++/C, ci imbattiamo spesso in questo problema.

Utilizzo del compilatore GDB per guasto di segmentazione

Per scoprire perché i programmi C creano un errore di segmentazione, useremo GDB. Il GDB è un debugger C (e C ++). Consente al programma di correre fino a un punto specifico, quindi interrompe e segnala i valori delle variabili specificate in quel momento o passa attraverso il programma una riga alla volta, stampando i valori di ciascuna variabile dopo l'esecuzione di ogni riga. Il debugger GDB ci aiuterà a capire quali linee sono responsabili del problema della segmentazione.

Punti chiave per prevenire guasti di segmentazione

Mentre gli errori di accesso alla memoria causano la maggior parte dei guasti di segmentazione, è fondamentale garantire che i puntatori utilizzati in un programma si riferiscano sempre a posizioni di dati accettabili. I seguenti sono i modi per prevenire i guasti di segmentazione.

  • Poiché gli errori di accesso alla memoria causano la maggior parte dei guasti di segmentazione, è fondamentale garantire che i puntatori dell'applicazione puntino sempre a posizioni di dati valide.
  • Prima di dereferencing un riferimento sensibile, come uno incorporato in una struttura che viene mantenuta in un elenco o in un array, dovremmo invocare Assert ().
  • Ricorda sempre di inizializzare correttamente i puntatori.
  • Un mutex o un semaforo possono essere utilizzati per proteggere le risorse condivise dall'accesso simultaneo a multithreading.
  • Dovremmo usare la funzione Free ()

Esempio 1: programma di guasto alla segmentazione mediante dereferencing puntatore dal blocco di memoria in C

Abbiamo un'illustrazione di un errore di segmentazione in cui stiamo cercando di ottenere l'accesso all'indirizzo del puntatore che ha liberato. Nella seguente funzione C del programma C, abbiamo una dichiarazione variabile puntatore "int* a" e abbiamo assegnato la memoria alla variabile puntatore "A". Un errore di segmentazione verrà generato quando il programma tende a leggere dal puntatore di dereferencing *a.

#includere
int main (int argc, char ** argv)

int* a;
*a = 50;
restituzione 0;

Nella compilazione del codice sopra visualizzato sullo schermo in basso, la riga *A = 50 provoca un errore di segmentazione.

Esempio 2: programma di errore di segmentazione accedendo all'array fuori bond in C

Un errore di segmentazione si verifica nella maggior parte dei casi quando un programma cerca di leggere o scrivere la memoria oltre i suoi limiti. Nel seguente programma, abbiamo dichiarato una matrice di indice "10" Quindi, stiamo tentando di recuperare l'indice di un array che non è fuori limite e inizializzato con il valore numerico. Questo è il punto in cui otterremo guasti di segmentazione dopo aver eseguito la linea fuori campo del programma.

#includere
int main (int argc, char ** argv)

int myarr [10];
Myarr [1000] = 2;
restituzione 0;

Siamo nel compilatore GDB in cui abbiamo usato il comando dell'elenco GDB. Il comando Elenco GDB ha stampato la riga di codice dal programma Valve. Dalla linea "Myarr [1000] = 2", abbiamo avuto un errore di segmentazione. Puoi vederlo nella seguente console GDB.

Esempio 3: programma di guasto alla segmentazione mediante dereferencing null puntatore in c

I riferimenti sono puntatori nei linguaggi di programmazione che indicano dove un elemento è memorizzato in memoria. Un puntatore null è un puntatore che indica una posizione di memoria valida. Nel programma seguente, abbiamo dichiarato una variabile puntatore "Pointerval" e gli abbiamo assegnato un valore nullo. L'eccezione del puntatore null viene lanciata o l'errore di segmentazione si verifica quando un puntatore null è dereferencing sulla riga “*POPERVAL = 10”.

#includere
int main (int argc, char ** argv)

int *pointerval = null;
*PointerVal = 10;
restituzione 0;

Il risultato del programma sopra ha lanciato guasto di segmentazione all'esecuzione on line “*POINTERVAL = 10” mostrato di seguito.

Esempio 4: programma di errore di segmentazione da stack overflow in c

Anche se il codice non ha un singolo puntatore, non è un problema di punta. L'overflow dello stack si verifica quindi quando la funzione ricorsiva viene invocata ripetutamente, consumando tutta la memoria dello stack. La corruzione della memoria può avvenire anche quando lo stack si esaurisce. Può essere fissato tornando dalla funzione ricorsiva con una condizione di base.

Qui nel programma, abbiamo la funzione principale e nel corpo della funzione principale, abbiamo invocato un'altra funzione principale. Questo porta a un guasto alla segmentazione a causa di uno stack overflow.

#includere
int main (vuoto)

principale();
restituzione 0;

Puoi vedere il compilatore GDB fornisce l'errore di segmentazione on line in cui abbiamo invocato la funzione principale nel blocco della funzione principale del programma.

Conclusione

L'articolo ha fatto luce su ciò che sono i guasti di segmentazione e su come possiamo eseguire il debug utilizzando il compilatore GDB. Il compilatore GDB determina quali linee sono responsabili del fallimento della segmentazione. La sessione di debug di guasti di segmentazione è molto facile da gestire con un compilatore GDB nella programmazione C. Quindi abbiamo preso scenari diversi in cui possono verificarsi guasti di segmentazione. Spero che questo articolo abbia chiarito i problemi di errore di segmentazione.