GNU/Linux >> Linux Esercitazione >  >> Linux

Il modo più semplice per individuare un errore di segmentazione

+1 per la risposta di Tibors.

Su programmi più grandi o se usi librerie aggiuntive potrebbe anche essere utile guardare il backtrace con gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html


Usa un debugger, come gdb o se questo non è applicabile un strace strumento per ottenere una migliore comprensione di dove si verifica il segfault.

Se usi gcc , assicurati di compilare con -g switch per includere le informazioni di debug. Quindi, gdb ti mostrerà la posizione esatta in un codice sorgente in cui si verifica il segfault.

Ad esempio, se abbiamo questo ovvio programma difettoso di segmentazione:

nuovo.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}

Lo compiliamo con gcc -g new.c -o new e poi esegui gdb sessione con gdb new :

Emettiamo run comando nella sessione interattiva e il resto è chiaro:

(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]

Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6               printf("%d", *i);
(gdb)

Come hanno sottolineato DasMoeh e netcoder, quando si è verificato un segfault, puoi usare backtrace comando nella sessione interattiva per stampare uno stack di chiamate. Questo può aiutare a individuare ulteriormente la posizione di un segfault.


Il modo più semplice è usare valgrind . Indicherà la posizione in cui si verifica l'accesso non valido (e altri problemi che non hanno causato l'arresto anomalo ma erano comunque non validi). Ovviamente il vero problema potrebbe essere da qualche altra parte nel codice (ad esempio:puntatore non valido), quindi il passaggio successivo è controllare il sorgente e, se ancora confuso, utilizzare un debugger.


Linux
  1. Come installare Zoom su Ubuntu (il modo più semplice)

  2. Flameshot:il modo più semplice per acquisire e annotare schermate

  3. Installa Zabbix su Ubuntu 18.04:il modo più semplice e veloce!

  4. RDP da Linux a Windows:il modo più semplice 2019!

  5. C'è un modo per cambiare le variabili d'ambiente di un altro processo in Unix?

Come modificare i file PDF in Linux nel modo più semplice possibile

Portainer:il modo più semplice per gestire Docker

Il modo più veloce per contare i file in modo ricorsivo in Linux

Installa Postman Ubuntu 18.04:il modo più semplice!

Qual è il modo più semplice per liberare spazio su un disco rigido?

Qual è il modo più semplice per visualizzare i dati da stdout come grafico?