2008-12-22 9 views
6

Ich habe etwas Code in MS VC++ 6.0, die ich debuggen bin. Aus irgendeinem Grund, an diesem bestimmten Punkt, wo ich versuche, etwas dynamisch zugewiesenen Speicher zu löschen, bricht es und ich bekomme eine Pop-up-Meldung mit der Meldung "User Breakpoint aus Code bei blah blah" aufgerufen .. dann erscheint das Disassembly-Fenster und ich sieheBenutzer Haltepunkt von nirgendwo

*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 könnte das verursachen?

BEARBEITEN: ANTWORT: Mein Code war "vom Ende gehen" eines Arrays, aber nur in den von Visual Studio Debuggen mit 0xFDFDFDFD, die eine NoMan'sLand Zaun genannt wird .. Ich denke, es ist auch eine angerufen Off-by-One-Fehler. Dieses Array hat nichts mit dem Punkt zu tun, an dem ich den Speicher freigab, als der Fehler auftrat. Das machte es schwieriger zu erkennen .. :(

+0

Nur neugierig - haben Sie das gefunden, indem Sie die Assembly-Anweisungen einzeln durchlaufen haben, um herauszufinden, was der Debug-Heap nicht mochte oder ob ein anderes Tool/eine andere Technik hilfreich war? –

+0

Ich schaute auf diese Seite http://www.highprogrammer.com/alan/windev/visualstudio.html, die besagt: dass 0xFDFDFDFD ein Speicherwert war, den der MSVC++ - Debugger verwendete, um eine Grenze in einem Array anzugeben, um Off-by-By zu erkennen ein Fehler .. Ich überprüfte meine Zeiger und Single trat durch die Iterationen in der .. – krebstar

+0

Quellcode und festgestellt, dass ich eine meiner Arrays nicht richtig gebunden hatte .. Also ich denke, es war nur ein Fall von mir, meine Zeiger richtig zu überprüfen :) – krebstar

Antwort

8

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

Was bedeutet der Call-Stack aussehen, wenn Sie die Int getroffen haben 3 ?

Edit: Basierend auf dem Stack-Trace in Ihren Kommentaren, die Routine _CrtIsValidHeapPointer() sagen, dass der Zeiger befreit schlecht Hier ist der Code-snippet aus Dbgheap.c Quelle des MSVC.

/* 
    * 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ürde sei das val der Zeiger, den Sie löschen.

+0

NTDLL! 7c90120e() NTDLL! 7c95d454() NTDLL! 7c96c5cf() NTDLL! 7c9603b0() KERNEL32! 7c85f8d7() – krebstar

+0

_CrtIsValidHeapPointer (const void * 0x04880068) -Leitung 1697 _free_dbg_lk (void * 0x04880068, int 1) Zeile 1044 + 9 Bytes _free_dbg (void * 0x04880068, int 1) Leitung 1001 + 13 Bytes Operator löschen (void * 0x04880068) Zeile 351 + 11 Bytes – krebstar

+0

So etwas ... – krebstar

3

(Ich denke, asm int 3 ist ein Hardware-Break Befehl für x86?

Es ist. Es "Hardware-Haltepunkt" genannt wird. Wenn Sie den VS-Debugger verwenden mit Der Projektquellcode ist genau wie ein Haltepunkt (aber im Code). Wenn Ihre Anwendung ohne Debugger gestartet wird, stürzt die Anwendung ab 2005 ab, als ob sie eine nicht verwaltete Ausnahme gestartet hätte komp ny, es gibt ein einfaches Makro, um diesen Haltepunkt im Code hinzuzufügen. Das kann ersetzen behauptet und Ausnahmen in einigen (Hart- und seltenen) Fällen:

#define BREAKPOINT __asm { int 3; } 

BREAKPOINT; 

See:

so schlage ich vor der Suche nach etwas Makro oder Objekt tun dies, oder vielleicht App in einem Modul (dll/lib), dass Sie nicht den Code haben?

+0

Ja, es gibt einige dll/lib, die im Programm geöffnet ist, und ich habe keinen Quellcode dafür. Aber ich glaube nicht, dass dies der Grund ist .. Michael Burr scheint eher .. Danke trotzdem :) – krebstar