Frage

Ich habe einige Code in MS VC ++ 6.0, die ich debuggen. Aus irgendeinem Grunde, an diesem bestimmten Punkt, wo ich einige dynamisch zugewiesenen Speicher löschen versuchen, es bricht und ich bekomme eine Pop-up-Nachricht Feld mit der Meldung „User Breakpoint- von Code auf bla bla genannt“ .. dann öffnet ich das Fenster Zerlegen und ich siehe

*memory address* int      3

Das Seltsame ist, gibt es nirgendwo in dem Code, den ich eine Montageanleitung wie dies nenne (ich glaube, asm 3 int ist ein Hardware-Befehl break für x86?) ..

, was dieses verursachen könnte?

EDIT: ANTWORT: Mein Code wurde „Geht das Ende off“ einen Arrays, sondern nur an den Stellen, die von Visual Studio debuggen mit 0xFDFDFDFD markiert, die einem NoMan'sLand Zaun genannt wird .. Ich denke, die auch als ein Off -Durch-one Fehler .. Dieses Array war in keinem Zusammenhang mit dem Punkt, an dem i den Speicher freigegeben wurde, wenn der Fehler wurde auftritt. Das machte es schwieriger zu erkennen ..: (

War es hilfreich?

Lösung

Sie sind wahrscheinlich in den Debug-Heap-Routinen schlagen Code, Heapbeschädigung gefunden zu haben.

Wie sieht der Call-Stack aussehen, wenn Sie die Int getroffen haben 3?

Edit: Basierend auf dem Stack-Trace in Ihren Kommentaren, die Routine _CrtIsValidHeapPointer() sagt, dass der Zeiger freigegeben wird schlecht. Hier ist der Code-Snippet von MSVC der Dbgheap.c Quelle:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData wäre der Wert des Zeigers Sie deleteing.

Andere Tipps

  

(ich glaube, asm int 3 ist eine Hardware-Pause   Befehl für x86?

Es ist. Es heißt "Hardware-Haltepunkt" . Wenn Sie den VS-Debugger mit dem Projekt Quellcode verwenden, es ist wie ein Breakpoint (aber im Code). Da VS2005, wenn Ihre Anwendung ohne Debugger gestartet wird, wird einfach die Anwendung abstürzen, wie wenn es eine nicht verwaltete Ausnahme gestartet.

In vielen Unternehmen gibt es ein einfaches Makro verwendet, dass der Haltepunkt im Code hinzuzufügen. Das kann ersetzen behauptet und Ausnahmen in einigen (Hart- und seltenen) Fällen:

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

Siehe auch:

So schlage ich vor, für einige Makro oder ein Objekt tun dies suchen, oder vielleicht Appen es in einem Modul (DLL / lib), die Sie nicht haben den Code?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top