Was ist ein "segmentation fault"?
Was ist ein "segmentation fault"? Ist es anders in C und C++? Wie speicherzugriffsverletzungen und baumelnde Zeiger verwandt?
"segmentation fault" macht das compiler schlecht fühlen,.
Wenn das der Fall ist, warum in meinem Fall der compiler beschwerte sich nichts, es ging alles glatt, aber zur Laufzeit das system löst einen " segmentation fault (core dump)? T_T
Nur ein Speicher-dump, wenn etwas schief geht!
Witzig, aber Wann ist ein compiler haben eine Sache zu tun, mit seg-Fehler? Ist es nicht mehr die run-time-enviroment?
In der Regel aufgerufen, durch den Versuch einer Dereferenzierung eines null-Zeiger, so dass ein segmentation fault ist Häufig Analog zu einer Java -
Wenn das der Fall ist, warum in meinem Fall der compiler beschwerte sich nichts, es ging alles glatt, aber zur Laufzeit das system löst einen " segmentation fault (core dump)? T_T
Nur ein Speicher-dump, wenn etwas schief geht!
Witzig, aber Wann ist ein compiler haben eine Sache zu tun, mit seg-Fehler? Ist es nicht mehr die run-time-enviroment?
In der Regel aufgerufen, durch den Versuch einer Dereferenzierung eines null-Zeiger, so dass ein segmentation fault ist Häufig Analog zu einer Java -
NullPointerException
.InformationsquelleAutor Rajendra Uppal | 2010-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Segmentation fault ist eine bestimmte Art von Fehler, die durch den Zugriff auf den Speicher, "gehört nicht zu Ihnen." Es ist ein Helfer-Mechanismus, hält Sie korrumpieren die Erinnerung und Einführung von hard-to-debug-Speicher bugs. Wenn man einen segfault du weißt, du machst etwas falsch mit dem Speicher – Zugriff auf variable, der bereits freigegeben wurde, das schreiben in ein nur-lese-Teil des Speichers, etc. Segmentation fault ist im wesentlichen die gleiche in den meisten Sprachen, mit denen Sie Chaos mit dem Speicher-management, es gibt keine Action Unterschied zwischen segfaults in C und C++.
Gibt es viele Möglichkeiten, um einen segfault, zumindest in der lower-level-Sprachen wie C(++). Ein gemeinsamer Weg, um einen segfault ist zu dereferenzieren eines null-Zeigers:
Anderen segfault passiert, wenn Sie versuchen zu schreiben, um einen Teil des Speichers, der als gelesen markiert wurde-nur:
Baumelnden Zeiger verweist auf eine Sache, die existiert nicht mehr, so wie hier:
Den Zeiger
p
baumelt, weil es Punkte für Charakter-variablec
, aufgehört zu existieren, nachdem der block beendet. Und wenn Sie versuchen zu dereferenzieren baumelnden Zeiger (wie*p='A'
), würden Sie wahrscheinlich ein segfault.Sorry für den bump, aber nur eine Randnotiz... keines der Beispiele unbedingt die Ursache für segmentation Fault, in der Tat es nur zu undefiniertem Verhalten 😉
Es ist unmöglich, code zu schreiben, der unbedingt Ursachen ein segfault. Nicht zuletzt, weil es Systeme gibt, die funktionieren ohne Speicherschutz, kann daher nicht sagen, ob ein Stück der Speicher eigentlich "gehört Ihnen", und damit weiß nicht segfaults, nur ein Undefiniertes Verhalten... (classic AmigaOS, zum Beispiel)
Sie müssen verstehen, dass
c
lokal ist, bedeutet es, dass es wurden auf den stack geschoben, nachdem{
- und pop-ed aus es nach}
. die baumelnden Zeiger ist nur ein Verweis auf einen offset, der ist nun aus dem Stapel. das ist, warum ändern Sie es in einem einfachen Programm wird nie auslösen, segfault. auf der anderen Seite kann es dazu führen segfault in einem komplexeren Anwendungsfall, wo eine andere Funktion Aufrufe führen könnte, die Stapel wachsen und enthalten die Daten gezeigt, durch die baumelnden Zeiger. schreiben auf die Daten (lokale vars) führen würde zu undefiniertem Verhalten (segfault &Co)normalerweise, wenn Sie außerhalb des Bereichs, der compiler hat wieder einige stack-Speicher zu befreien, die nicht verwendete Stapel Speicherplatz, aber dies geschieht nicht immer (mit dem gcc als einer dieser Compiler). Auch der reservierte stack-Speicher ist normalerweise wieder verwendet werden, so habe ich gehört, keine Betriebssysteme, unbenutztes stack-Seiten auf das system, indem es diesen Raum Thema für ein
SIGSEGV
, so dass ich nicht erwarten, wie ein signal von mangeln mit dem stack.InformationsquelleAutor zoul
Wäre es erwähnenswert, dass "segmentation fault" ist nicht verursacht durch direkten Zugriff auf die ein anderer Prozess den Speicher (das ist, was ich höre manchmal), es ist einfach nicht möglich. Mit virtuellen Speicher jeder Prozess hat seinen eigenen virtuellen Adressraum, und es gibt keine Möglichkeit, ein weiteres mit jedem Wert von Zeiger. Ausnahme kann sein, shared libraries, die gleichen physikalischen Adressraum zugeordnet (möglicherweise) unterschiedlichen virtuellen Adressen und kernel-Speicher ist auch abgebildet in der gleichen Weise in jedem Prozess (um zu vermeiden, TLB Spülen auf syscall, denke ich). Und Dinge wie shmat 😉 - diese sind das, was zähle ich als 'indirekten' Zugang. Man kann jedoch überprüfen, dass Sie sind in der Regel langen Weg von der Prozess -, code-und wir sind in der Regel in der Lage, auf Sie zuzugreifen (dies ist, warum Sie dort sind, trotzdem den Zugriff auf Sie in einer unsachgemäßen Art und Weise zu produzieren "segmentation fault").
Immer noch, "segmentation fault" auftreten können, kann im Falle des Zugriffs auf unser eigenes (Prozess -) Speicher in unsachgemäßer Weise (zum Beispiel beim schreiben auf nicht beschreibbaren Raum). Aber der häufigste Grund ist, dass der Zugang zu dem Teil des virtuellen Adressraums, ist nicht belegt physischen überhaupt.
- Und all dies mit Bezug auf den virtuellen Speicher-Systeme.
Ja, ich weiß. Dies ist, was ich über den Geist in "Und Dinge wie shmat 😉 - diese sind das, was zähle ich als 'indirekten' Zugang."
In ein Betriebssystem mit virtuellem Speicher gibt es keine Möglichkeit (in der Regel, also bitte, das Betriebssystem implementors, don ' T flame me) für einen Prozess, um den Zugriff auf einen anderen Prozess virtuellen Speicher, nicht eine Art von Speicher befestigen Sie das call-system ermöglicht Ihnen den Zugriff. Virtuelle Speicheradressen in der Regel bedeuten verschiedene Dinge, je nach Prozess betrachtet wird.
InformationsquelleAutor konrad.kruczynski
Einen segmentation fault verursacht wird, indem eine Anforderung für eine Seite, dass der Prozess nicht aufgeführt haben in Ihrem Deskriptor-Tabelle, oder eine ungültige Anforderung für eine Seite, die es nicht haben, aufgeführt (z.B. write request auf read-only-Seite).
Einen dangling Pointer ist ein Zeiger, dass kann oder kann nicht auf eine gültige Seite, aber nicht auf eine "unerwartete" segment des Speichers.
InformationsquelleAutor Ignacio Vazquez-Abrams
Um ehrlich zu sein, wie die anderen Poster erwähnt haben, hat Wikipedia einen sehr guten Artikel über diese also haben Sie sich dort. Diese Art von Fehler ist sehr Häufig und werden oft als andere Dinge wie die Zugriffsverletzung oder Allgemeine Schutzverletzung.
Sind Sie nichts anderes in C, C++ oder anderen Sprachen können Zeiger. Diese Arten von Fehlern werden in der Regel durch Hinweise, die sind
InformationsquelleAutor Component 10
Laut wikipedia:
InformationsquelleAutor Orhan Cinar
Segmentation fault wird auch verursacht durch hardware-Fehler, in diesem Fall der RAM-Erinnerungen. Dies ist die weniger häufige Ursache, aber wenn Sie nicht finden, einen Fehler in Ihrem code, vielleicht ein memtest könnte dir helfen.
Die Lösung in diesem Fall, ändern Sie den RAM.
edit:
Hier gibt es eine Referenz: Segmentation fault von hardware
InformationsquelleAutor Alejo Bernardin
Segmentation fault tritt auf, wenn ein Prozess (laufende Instanz eines Programms) wird versucht, Zugriff auf nur-lese-Speicher-Adresse oder den Speicher-Bereich, die verwendet wird von anderen Prozess oder auf die non-existent (ungültig) Speicher-Adresse.
Baumelnden Referenz (Zeiger) problem bedeutet, dass beim Zugriff auf ein Objekt oder eine variable, deren Inhalt bereits aus dem Speicher gelöscht, e.g:
InformationsquelleAutor Sohail xIN3N
Wikipedia Segmentation_fault Seite hat eine sehr schöne Beschreibung darüber, nur zeigen Sie die Ursachen und Gründe. Ein Blick in die wiki für eine detaillierte Beschreibung.
In computing, ein "segmentation fault" (oft verkürzt segfault) oder Zugriffsverletzung wird eine Störung ausgelöst, die von hardware, die mit memory protection, müssen Sie ein Betriebssystem (OS) über eine Speicher-Zugriffsverletzung.
Folgenden sind einige typische Ursachen für einen "segmentation fault":
Diese wiederum sind Häufig verursacht durch Fehler in der Programmierung, führen zu ungültigen Speicherzugriff:
Dereferenzieren oder die Zuweisung an einen nicht initialisierten Zeiger (wild-pointer, die auf eine zufällige Speicheradresse)
Dereferenzieren oder die Zuordnung zu einem befreiten Zeiger (dangling pointer, welcher auf Speicher freigegeben/freigegeben/gelöscht)
Einen buffer overflow.
Einen stack-überlauf.
Versuch, ein Programm ausführen, das nicht ordnungsgemäß kompiliert werden. (Einige Compiler-Ausgabe wird eine ausführbare Datei, trotz der Anwesenheit von compile-time-Fehler.)
InformationsquelleAutor Roy
In einfachen Worten: "segmentation fault") ist das Betriebssystem ein signal zu senden, um das Programm
zu sagen, dass er erkannt hat, ein illegaler Speicherzugriff und ist vorzeitig beenden des Programms zu verhindern
Speicher wird beschädigt.
InformationsquelleAutor FilipeCanatto
Gibt es einige gute Erklärungen von "Segmentation fault" in den Antworten, da aber mit "segmentation fault" oft gibt es einen dump der Speicherinhalt, wollte ich teilen, wo die Beziehung zwischen den "core dumped" - Teil in Segmentation fault (core dumped) und Speicher kommt von:
Entnommen hier.
InformationsquelleAutor Viktor Nonov
Segmentation fault " oder eine Zugriffsverletzung tritt auf, wenn ein Programm versucht, Zugriff auf einen Speicherbereich, der nicht existiert, oder versucht, auf eine Speicherstelle in einer Weise, die nicht zulässig ist.
Ich hier[1000] nicht vorhanden, so segfault Auftritt.
Ursachen der segmentation fault:
es ist auch rund mit der Adresse, wenn Sie nicht über die Adresse, und wenn u versuchen, den Zugriff auf diese Adresse, auch dort wird seg. Schuld. Und in meinem Beispiel ist es nur für die zu verstehen, point-of-view.
InformationsquelleAutor Mohit Rohilla
"Segmentation fault" bedeutet, dass Sie versucht, auf Speicher zuzugreifen, die Sie nicht haben Zugang zu.
Das erste problem ist mit deinen Argumenten von main. Die main-Funktion int main(int argc, char *argv[]), und Sie sollten überprüfen, dass argc ist mindestens 2, bevor Sie Zugriff auf argv[1].
Auch, seit Sie vorbei sind in einem float printf (was, by the way, wird umgewandelt, um eine doppelte, wenn übergeben, um printf () verwenden, sollten Sie das %f-format-Bezeichner. Das %s-format specifier for strings ('\0'-terminierte Zeichen-arrays).
InformationsquelleAutor PHP Worm...