Domanda

Ho qualche codice in MS VC ++ 6.0 che io sono il debug. Per qualche ragione, a questo punto in cui si sto cercando di eliminare alcuni memoria allocata dinamicamente, si rompe ed ottengo un pop-up finestra di messaggio che dice "punto di interruzione utente chiamato da codice a bla bla" .. poi la finestra Disassembly si apre e io vedi

*memory address* int      3

La cosa strana è, non c'è posto nel codice che io chiamo un'istruzioni di montaggio come questo (credo asm int 3 è un comando break hardware per x86?) ..

che cosa potrebbe causare questo?

EDIT: RISPOSTA: Il mio codice era "camminando fuori alla fine" di un array, ma solo nei luoghi segnati da Visual Studio debug con 0xFDFDFDFD, che si chiama una recinzione NoMan'sLand .. Credo che la sua anche chiamato Off -da-one errore .. Questo array è indipendente dal punto dove ero liberare la memoria quando l'errore è stato corso. Che ha reso più difficili da individuare ..: (

È stato utile?

Soluzione

Probabilmente stai colpendo il codice nelle routine di debug di heap che hanno trovato il danneggiamento di heap.

Che cosa significa l'aspetto stack di chiamate come quando hai colpito l'Int 3?

Modifica: Sulla base della traccia dello stack nei vostri commenti, la routine di _CrtIsValidHeapPointer() sta dicendo che il puntatore essere stato liberato è male. Ecco il frammento di codice dalla fonte dbgheap.c di 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 sarebbe il valore del puntatore che stai deleteing.

Altri suggerimenti

  

(credo asm int 3 è una pausa di hardware   di comando per x86?

E '. Si chiama "Hardware punto di interruzione" . Se si sta utilizzando il debugger VS con il codice sorgente del progetto, è proprio come un punto di interruzione (ma nel codice). Dal VS2005, se l'applicazione viene avviata senza alcun debugger, l'applicazione semplicemente in crash, come se lanciato un'eccezione non gestita.

In molte società, v'è una semplice macro utilizzato per aggiungere che punto di interruzione nel codice. Che può sostituire afferma e eccezioni in alcuni casi (dure e rari):

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

See:

Quindi suggerisco alla ricerca di qualche oggetto o Macro fare questo, o forse è Appen in un modulo (dll / lib) che non si ha il codice di?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top