GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Der einfachste Weg, einen Segmentierungsfehler zu lokalisieren

+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.


Linux
  1. So installieren Sie Zoom auf Ubuntu (der einfachste Weg)

  2. Apache2-Konfigurationstest fehlgeschlagen:Segmentierungsfehler (Core-Dump) [Gelöst]

  3. Was ist der einfachste Weg, ein virtuelles Paket in Debian zu erstellen?

  4. In Crontab generische Art, alle n Minuten anzugeben, wobei n > 60 ist

  5. Warnungen zu Linux-/Apache-Webserver-Segmentierungsfehlern

So bearbeiten Sie PDF-Dateien unter Linux auf die einfachste Art und Weise

Portainer – Eine einfachste Art, Docker zu verwalten

Der schnellste Weg zum rekursiven Zählen von Dateien unter Linux

Postman Ubuntu 18.04 installieren:Der einfachste Weg!

Was ist der einfachste Weg, um Speicherplatz auf einer Festplatte freizugeben?

Was ist der einfachste Weg, Daten von stdout als Diagramm zu visualisieren?