+1 für Tibors Antwort.
Bei größeren Programmen oder wenn Sie zusätzliche Bibliotheken verwenden, kann es auch nützlich sein, sich den Backtrace mit gdb anzusehen:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
Verwenden Sie einen Debugger wie gdb
oder falls dies nicht zutrifft eine strace
Tool, um einen besseren Einblick zu erhalten, wo der Segfault auftritt.
Wenn Sie gcc
verwenden , stellen Sie sicher, dass Sie mit -g
kompilieren wechseln, um Debugging-Informationen einzuschließen. Dann gdb
zeigt Ihnen die genaue Stelle in einem Quellcode, an der es segfaults gibt.
Zum Beispiel, wenn wir dieses offensichtliche segfaulty Programm haben:
neu.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
Wir kompilieren es mit gcc -g new.c -o new
und führen Sie dann gdb
aus Sitzung mit gdb new
:
Wir geben den run
aus Befehl in der interaktiven Sitzung und sonst ist klar:
(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)
Wie DasMoeh und Netcoder darauf hingewiesen haben, können Sie den backtrace
verwenden, wenn ein Segfault aufgetreten ist Befehl in der interaktiven Sitzung, um eine Aufrufliste zu drucken. Dies kann bei der weiteren Lokalisierung eines Segfaults hilfreich sein.
Der einfachste Weg ist die Verwendung von valgrind
. Es zeigt den Ort an, an dem der ungültige Zugriff auftritt (und andere Probleme, die keinen Absturz verursachten, aber immer noch ungültig waren). Natürlich könnte das eigentliche Problem woanders im Code liegen (z. B. ungültiger Zeiger), also ist der nächste Schritt, die Quelle zu überprüfen und, falls immer noch verwirrt, einen Debugger zu verwenden.