2013-05-01 14 views
6

Ho un problema durante l'esecuzione di una testcase in modalità debug: viene visualizzata una finestra pop-up con il messaggio "Eccezione non gestita a 0x7c812fd3 in Test.exe: 0xE0000003: 0xe0000003.". Le interruzioni di codice in free.c:C++ Eccezione non gestita - come eseguire il debug

void __cdecl _free_base (void * pBlock) 
{ 
    int retval = 0; 

    if (pBlock == NULL) 
     return; 

    RTCCALLBACK(_RTC_Free_hook, (pBlock, 0)); 

    retval = HeapFree(_crtheap, 0, pBlock); 
    if (retval == 0) 
    { 
     errno = _get_errno_from_oserr(GetLastError()); 
    } 
} 

alla linea "retval = ..." con _crtheap = 0x00df0000 e pBlock = 0x967c93d3. Lo stack di chiamate si interrompe in "kernel32.dll! 7c812fd3()" e un'altra voce più in basso nello stack di chiamate: "> msvcr100d.dll! _free_base (void * pBlock = 0x967c93d3) Riga 50 + 0x13 byte".

Ho cercato su Google un bel po 'e il problema potrebbe derivare dalla liberazione della memoria. Nonostante questa descrizione vaga e disordinata, qualcuno può suggerire come localizzare il problema? e forse come risolverlo?

Quello che mi colpisce un po 'strano è che io non provo questo quando si esegue il test in release-mode ...

Cordiali saluti, Svend

+2

La ragione usuale per gli errori di solo modo di debug sono le variabili non inizializzate. Forse stai liberando un puntatore a cui non è mai stato assegnato un valore. – john

+4

Nella modalità di rilascio questi controlli non vengono eseguiti, quindi perché si ottiene la notifica solo in modalità di debug (il problema esiste ancora nel rilascio, si ha solo la fortuna che non sembra causare ulteriori bug). Vai alla traccia dello stack finché non raggiungi una funzione che hai scritto e prova a capire cosa c'è che non va (ad esempio, raddoppiare o liberare un indirizzo che non è stato effettivamente assegnato). – Cameron

+0

Puoi dare un po 'più di dettaglio? Che tipo di oggetto viene liberato? È un puntatore intelligente ad esempio –

risposta

-2

Hai provato a eseguire questi casi di test in Visual debugger in studio? Il debugger dovrebbe rilevare questa eccezione e verificare lo stack delle chiamate e individuare il problema.

+0

L'eccezione si verifica in '_free_base', lo sa già. Ma il debugger non sta recuperando il problema (cioè il danneggiamento dell'heap che si è verificato in precedenza) –

+0

Se è questo il caso, dovrebbe semplicemente usare il debugger e passare attraverso tutto il codice dei test e individuare la parte che genera un'eccezione. – Zuljin

+0

Wow. Questo tipo di consiglio ingenuo può venire solo da qualcuno che non ha mai sperimentato un errore di azione a distanza. Ti invidio. –

Problemi correlati