C ++ Heap-Korruption

8

Ich habe schon lange kein C ++ mehr gemacht, aber ich habe beschlossen, ein großes Projekt zu beenden, an dem ich gerade gearbeitet habe. Ich erhalte jetzt jedoch folgende Fehlermeldung ...

HEAP CORRUPTION DETECTED: nach normalem Block (# 1761) bei 0x17DEB940. CRT Erkennt, dass die Anwendung nach dem Ende des Heap-Puffers in den Speicher geschrieben hat.

Ich habe alle Funktionen durchschritten, von denen ich dachte, dass sie sie verursacht haben könnten, aber ich bin ratlos. Gibt es irgendeine Möglichkeit, die fortgeschritteneren Debugging-Funktionen zu verwenden, um dies aufzuspüren?

    
Don Wakefield 12.04.2011, 13:21
quelle

4 Antworten

4

Es klingt wie ein klassischer Speicherfehler. Die Plattform wäre hilfreiche Informationen. Ohne Ihren Code und seine Komplexität zu sehen, gibt es ein paar Möglichkeiten:

  1. Ich schätze, dass die Laufzeit Bibliothek würde Ihnen erlauben, Anrufe an die Heap-Validierungscode direkt aus dein Code. Ich würde vorschlagen, zu platzieren ruft den Heap-Validierungscode auf verschiedene Stellen in deinem Code, also du kann herausfinden, wo die Dinge hingehen falsch. Du wirst den Ort finden wo Der Haufen wird schlecht und du wirst es wissen dass es beim vorherigen Anruf in Ordnung war. Verkleinern Sie dieses Fenster, wenn Sie müssen und überprüfen Sie den Code wo das Problem auftritt.

  2. Wenn die gleichen Schritte genau den gleichen Ort im Speicher beschädigen, Sie sollten in der Lage sein, Ihre Debugger, um einen Haltepunkt (oder Watchpoint) auf dem Speicher wird geändert. Einige diese Änderungen können beabsichtigt sein, aber Sie sollten in der Lage sein, herauszufinden welcher ist der Täter.

Sie können eine Kombination der beiden verwenden, wenn Ihr Code besonders komplex ist oder die für die Reproduktion erforderlichen Schritte lang sind. Einen Teil des problematischen Codes eingrenzen und dann einen Haltepunkt auf den beschädigten Speicherort setzen / p>

David

    
david 12.04.2011, 13:39
quelle
2

Unter Linux würde ich valgrind als ein Tool empfehlen, das Ihnen genau sagen würde, was schief gelaufen ist. Sie können einige Windows-Alternativen dafür suchen hier .

    
Bill Lynch 12.04.2011 13:36
quelle
1

Versuche es mit Intruments zu fangen.

Klingt ein bisschen wie ein klassischer C-Fehler. Sie sind sicher, dass Sie nicht über ein c-Array (wie int [xyz]) in einer Weile oder für eine Schleife schreiben? Es verursacht keine Fehler, aber Sie bekommen seltsame Effekte in vielen Bereichen, die nichts mit dem Teil zu tun haben, wo der Fehler lebt. : p

    
Helge Becker 12.04.2011 13:32
quelle
1

Versuchen Sie, AppVerifier mit normalem Seitenheap zu verwenden. Wenn Sie dann einen Debugger an den Prozess anhängen und eine Heap-Beschädigung mit etwas Glück haben, wird es an dem Punkt unterbrochen, an dem der Speicherblock beschädigt wird (durch einen Block-Write-Overrun oder -Unterlauf). Mit ein wenig Aufwand können Sie auch einen Aufruf des Codes abrufen, der jeden Heap-Block zugewiesen hat, was auch dazu beitragen kann, den Fehler zu finden.

Das Verfolgen dieser Fehler kann jedoch schwierig sein. Detaillierte Informationen finden Sie im Buch Erweitertes Windows-Debugging , in dem ein ganzes Kapitel dem Thema gewidmet ist.

    
floyd73 12.04.2011 14:00
quelle