Segmentierungsfehler am 14.04, aber kein Fehler am 10.04

Segmentierungsfehler am 14.04, aber kein Fehler am 10.04

Ich verwende Ubuntu 14.04 64bit LTS und schreibe ein Bildverarbeitungsprogramm in C. Wenn ich ein Programm im Terminal ausführe, wird ein Segmentierungsfehler (Core Dump) angezeigt.
Das gleiche Programm läuft problemlos unter 10.04.

Irgendwelche Hilfe, bitte?

$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)

Antwort1

Was im Einzelnen tatsächlich passiert ist, lässt sich schwer sagen, aber ich gebe ein Beispiel für die Art des Problems.

Wichtig ist, dass das Programm unter 10.04 funktionierte, unter 14.0 jedoch nicht funktioniert. Das genaue Problem könnte anders sein, ist aber ähnlich und verwandt:

Etwas ist gegen die Regeln

Der Fehler „Segmentierungsfehler“ bedeutet normalerweise, dass auf Speicher zugegriffen wurde, der nicht zum Programm gehört. Es kann sein, dass sowohl unter 10.04 als auch unter 14.04 ein solcher illegaler Speicherzugriff stattfand, aber unter 10.04 verursachte er kein Problem.

Regeln werden nicht strikt durchgesetzt

Das würde bedeuten, dass es in 10.04 nur zufällig funktioniert hat. Das ist durchaus möglich, denn aus vielen Gründen kann Speicher in der Nähe des „offiziellen“ Speichers Ihres Programms technisch auch zu Ihrem Programm gehören.
Das soll dem Compiler die Arbeit erleichtern oder das Programm durch regelmäßigeren Speicherzugriff schneller machen.
Dadurch kann das Programm möglicherweise Dinge tun, die es laut Programmtext nicht tun darf.

Toleranz kann sich ändern

Auf welchen „inoffiziellen“ Speicher Sie ohne Segmentierungsfehler zugreifen können, hängt von der Compilerversion und den Bibliotheksversionen ab, die sich beide geändert haben.

Der einfachste und häufigste Fall dürfte ein Programmfehler sein, bei dem ein Speicherzugriff zu weit ging, wie etwa beim Zugriff auf das Byte nach einem Array aufgrund eines Of-by-One-Fehlers im Index.

Zusammenfassung

Der Fehler bestand schon vorher, aber es funktionierte trotzdem.
Jetzt funktioniert es nicht mehr und es handelt sich nur noch um einen normalen Fehler, der einen Segmentierungsfehler verursacht.

Das Positive daran ist: Als es funktionierte, konnte es aufgrund des Fehlers zu falschen Ergebnissen kommen – was viel schlimmer ist als der Absturz, den Sie jetzt sehen.


Setzen Sie die Regeln durch

Ein guter Ansatz zum Debuggen dieser Art von Problemen besteht darin, das Programm so zu instrumentieren, dass es die Regeln durchsetzt, die vom normalen Laufzeitsystem nicht durchgesetzt werden.
Ein Tool, das dies bei der Suche nach Problemen mit dem Speicherzugriff ermöglicht, istvalgrind(man valgrind).

verwandte Informationen