2010-11-18 28 views
0

Ich bekomme einen Segmentierungsfehler beim Zugriff auf ein Objekt, das in gdb als gültig und vollständig zugänglich erscheint. Ist die Segmentierung nicht immer ein unzugänglicher Speicher?Segmentierungsfehler bei gültigem Speicher

EDIT: Weitere Details.

Der Absturz geschah unter gdb, so dass ich den Speicher des Objekts untersuchen konnte. Es hatte die Mitglieder auf richtige Werte eingestellt, so dass ich keine Chance hatte, auf den Nur-Lese-Speicher zuzugreifen. Die Anweisung, bei der der Absturz stattgefunden hat, ist eine Art Var = Obj.GetMember(), wobei Var, GetMember und das entsprechende Element kurze Ganzzahlen sind. Fehlausrichtung? Ich nehme an, dass es Busfehler, nicht Segmentierung verursachen würde. Ich werde versuchen, alles wieder aufzubauen. Das Problem ist, dass dieser Codecode tausend Mal pro Sekunde ausgeführt wird und die Segmentierung einmal in mehreren Tagen stattfindet.

+2

Können Sie Code hinzufügen? – Kos

+0

Weitere Details bitte. –

+0

versuchen Valgrind nach Speicherbeschädigung zu überprüfen. –

Antwort

2

Versuchen Sie, komplett neu zu erstellen (machen sauber & & machen), das hatte mir ein paar Mal geholfen, wenn ich solche seltsamen Fehler begegnet.

Spät UPD:

Wenn das Problem nicht beheben, ist es in der Regel bedeutet, dass etwas mit Ihrer Make-Datei falsch ist, in der Regel verkorkste Abhängigkeiten zwischen CPP und H-Dateien, zum Beispiel: a.cpp umfasst bh , aber bh ist nicht in den Abhängigkeiten von a.cpp aufgeführt.

+0

Ich habe vor ein paar Wochen eine Frage dazu gestellt. http://stackoverflow.com/questions/3997404/initialization-of-member-bug-in-gcc-or-my-thinking –

0

Grundsätzlich ja. Haben Sie den Core-Dump zur Analyse Ihres Seg-Fehlers verwendet?

0

Code würde sehr helfen, aber haben Sie eine make clean gemacht? Wenn Sie die Größe einer Klasse erhöht haben und Ihre Abhängigkeiten nicht richtig sind, wird nicht genügend Speicherplatz für eine Instanz zugewiesen und diese Klasse wird dann überschreiben und korrumpieren, was auch immer im Speicher vorangeht.

2

können Sie Fehler erhalten, auch wenn „gültig“ Speicher unter Umständen Zugriff auf:

  • Sie versuchen, Speicher zu ändern, aber die spezifische Zuordnung ist nur lesbar
  • Sie versuchen, auszuführen, Code in ein Speicherbereich, der keine Ausführung ist
  • Sie versuchen, z Lade/Speicher bei einer falsch ausgerichteten Adresse und Ihre Hardware-Probleme Ausrichtung Ausnahmen

ohne einen Blick auf die coredump, um herauszufinden, was die fehlerhaften Anweisung (Lade-/Speicher/execute) war und was genau die Zuordnung von Berechtigungen für den Zugriff auf Erinnerung war es unmöglich zu unterscheiden.

Verwandte Themen