2010-12-02 25 views
0

Es könnte ein wenig schwer sein, alles über diesen Fehler zu erklären, aber ich werde mein Bestes versuchen. Leider ist der Code so groß, dass es unpraktisch wäre, ihn einzubinden.Speicherfehler beim Aufruf von

Ich schreibe ein akademisches OS für die Hausaufgaben (Nachos, wenn Sie wissen müssen) und die neueste Sache, die ich tun musste, war die gegenseitige Ausgrenzung in einer Kernkarte zu implementieren. Dazu habe ich im emulierten Hauptspeicher pro Seite eine Lock- und eine Condition-Variable hinzugefügt. Nachdem ich das getan habe, starte ich meinen Code und bekomme einen Aufruf an die Exception (in einem komplett anderen Verzeichnis von core map) Handler ganz gut, aber beim zweiten Aufruf der Funktion bekomme ich und error beim folgenden Aufruf: r=new Lock("read"); und es liest dies wie:

*** glibc detected *** /home/some_other_directories/workspace/nachos3_repo/vm/nachos: malloc(): memory corruption (fast): 0x0805fe20 *** 

Nur um zu sehen, wie es sich verhält ich die Aufteilung dieses Schlosses geändert eine extern in meinem System Datei zu sein (es gibt eine Menge global externen dort) und danach habe ich einen Segmentation Fehler bekommen der Anruf fout.open("old.txt");, den ich durch den Stapel zurückverfolgte, um innerhalb eines Anrufs zu malloc in einem Anruf zu neuen zu sein.

Meine beste Vermutung ist, dass mein Haufen zu groß wird, aber ich bin mir nicht sicher, ob das der Fall ist oder wie man damit umgeht. Kann jemand dieses Problem beleuchten?

+0

Haben Sie Valgrind ausprobiert? –

+1

Sie haben ein Speicherüberschreibungsproblem. Irgendwo in Ihrem C-Code schreiben Sie über das Ende eines Puffers hinaus (oder anders) und löschen die zugrunde liegenden Datenstrukturen, die die Laufzeit verwendet. Valgrind oder C++ mit Überprüfung der Grenzen für die STL im Debug-Modus aktiviert. –

+0

Ich bin ein wenig neu und habe einige Schwierigkeiten, die gesamte Ausgabe von Valgrind zu verstehen, und habe nicht viel Zeit, um es zu lernen. Ich versuche immer noch, es durchzusehen. – user381261

Antwort

1

malloc ist nur das Opfer hier. In einem völlig anderen Teil des Codes haben Sie außerhalb der zugewiesenen Grenzen geschrieben und somit die Kettenverknüpfungen beschädigt, die vom Heap-Manager verwendet werden, um freie/zugeordnete Blöcke zu verfolgen. Beim Versuch, hier zu reservieren, jagt der Heap-Manager diese verknüpften Listen und landet in einem geschützten Bereich (höchstwahrscheinlich nicht zugewiesen). Sie sollten eine Überprüfung von Ihre Änderungen zuerst und sehen, ob Sie erkennen können, wo Sie den Speicher kritzeln.

+0

Es war ein schlechtes Löschen, jemand hat mir geholfen, Valgrind herauszufinden. – user381261

+1

Froh, es hat geklappt. Ihr Glück, es in weniger als einer Stunde zu finden ... –

Verwandte Themen