malloc () stürzt ab und sagt beschädigte doppelt verkettete Liste

8

Bearbeiten Die vollständige Quelle finden Sie hier:

Ссылка

Programm hier aufrufen:

Ссылка

Ich habe eine relativ einfache Speicherzuweisung, die fehlschlägt. Die Anwendung ist nicht besonders kompliziert, obwohl sie Speicherplatz an einigen Stellen reserviert. Es ist C, nicht C ++. Ich bin sicher, dass dies ein Problem ist, Speicher zuzuweisen , nicht Speicher freizugeben

Hier ist der Code:

%Vor%

Bei der Ausführung bekomme ich:

%Vor%
  • Der Code wird ohne Fehler kompiliert.
  • Wenn ich es "standalone" starte, stürzt es mit dem obigen Fehler ab. Ich sehe :2 , aber ich sehe nicht :3 , was mir sagt, dass es einen Fehler in malloc gibt. (Ich hoffe, ich liege falsch.)
  • Wenn ich die gleiche Binärdatei über valgrind laufe, funktioniert sie wie erwartet.
  • Es scheint kein Problem mit der Variablendeklaration o->data zu sein, das ist a %Code%. Wenn ich char* anstelle von char* A; A = deklariere, stürzt es immer noch ab.

Ich würde mich sehr über Ideen freuen, wie Sie Fehler beheben können / warum dies passiert.

Danke!

    
Sean Woods 03.08.2013, 16:44
quelle

2 Antworten

13

Also, ich glaube, ich habe es gefunden. Möglicherweise müssen wir dies unter "Sean muss grundlegende Valgrind Fähigkeiten zu lernen." Hier ist, wie ich es für zukünftige Beobachter gelöst habe.

  1. Okay, wir haben es mit einem wirklich merkwürdigen Fehler zu tun, der von einer erprobten und getesteten Bibliothek ausgelöst wurde Funktion, so muss es etwas speziell für meine Einrichtung sein. Der Algorithmus ist der gleiche, also müssen es die Daten sein .
  2. Die dynamische Speicherimplementierung weist eine zugrunde liegende Datenstruktur zum Verfolgen zugeordneter Daten auf Speicher, der zufällig eine doppelt verkettete Liste ist - also die Nachricht.
  3. Also muss es irgendwo eine Speicheroperation geben, die diese Datenstruktur in korrumpiert auf subtile Weise.
  4. Okay, welche Werkzeuge haben wir zur Verfügung? Valgrind wird hoch gelobt, lass es uns versuchen Das. Seltsam, es funktioniert in Valgrind. Hmm.
  5. Lies eigentlich, was Valgrind dir sagt. (Dies ist, wo ich meinen Teil nicht getan habe.) Es kennzeichnet Sie mit Fehlern wie "Ungültiger Schreibvorgang der Größe 1" zusammen mit einer Ablaufverfolgung der verschiedene Labels / Symbole, wo dies auftaucht. Suchen Sie nach möglichen Fehlern und passen Sie als notwendig.
  6. In diesem Fall zeigte es mich auf einen Aufruf von memcpy() in hashtable_put Funktion von hashtable.c . Der subtile Hinweis ist, dass ich das erste Argument übergeben habe zu memcpy mit dem address-of-Operator & , der die Korruption verursacht hat.
  7. Als ich das reparierte, beschwerte sich Valgrind nicht mehr.

Die Moral der Geschichte:

  • Ignorieren Sie Feedback von den Tools nicht. Keine Nachrichten sind [normalerweise] gute Nachrichten, also wenn Valgrind spuckt viele Informationen aus sie ist eine erhöhte Wahrscheinlichkeit eines Problems.
  • Dynamische Speicherzuordnungsfehler sind subtil ( dynamisch im wahrsten Sinne des Wortes) und kann von vielen Variablen beeinflusst werden. Valgrind bringt die Dinge in die Mitte Ihrer Programm und die Speicher-Bibliothek, so dass es weiß, was vor sich geht, so denke ich, dass diese betroffen sind die Operation des Programms irgendwie.

Das Commit, das das Problem bisher behoben hat:

Ссылка

    
Sean Woods 03.08.2013 18:09
quelle
-1

BEARBEITEN: Da wir fast nicht wissen, wie Ihre Struktur aussieht und welchen Datentyp o->data haben sollte, können wir nur spekulieren, was Sie tun wollen.

Bitte geben Sie die o struct Definition an, damit wir Ihnen helfen können.

    
DaMachk 03.08.2013 17:03
quelle

Tags und Links