Domanda

Sono il debug di un software che si blocca alla fine con uno dei seguenti messaggi:

1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
   Program: D:\Soft\Test.exe
   File: dbgheap.c
   Line: 1017

   Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)

Questo software è molto vecchio ma cambiando ora non è un'opzione. E 'scritto in Visual C ++ 6.0. Noi stiamo indovinando che è una sorta di buffer overflow, quindi stiamo cercando di trovare il modo di rilevare in cui sta accadendo.

Ho trovato informazioni su PageHeap (che sembra essere in grado di dirmi quello che voglio) e GFlags , ma sembra che io non riesco a farlo funzionare.

Ho creato un programma di test:

char* test;
test = new char[5];
test[5] = 'a';
delete[] test;

che solleva un errore:

DAMAGE: after normal block (#55) at 0x1671920

Poi, ho provato allegando PageHeap ad esso eseguendo:

gflags.exe /p /enable MemoryTest.exe /full

e quindi eseguire nuovamente esso (sia attraverso l'interfaccia di Visual C ++ 6.0 e attraverso l'esploratore di Windows), che ha portato lo stesso errore.

Poi ho provato a compilare la versione di rilascio, e corse attraverso l'interfaccia di Visual C ++ 6.0 per ottenere l'errore:

User breakpoint called from code at 0x7c90120e

E dal Windows Explorer, ho appena ricevuto la finestra di dialogo di Windows mi chiede di inviare una segnalazione errori.

Che cosa mi manca?

È stato utile?

Soluzione

È possibile eseguire l'applicazione in modalità di rilascio legandosi a Windbg .

  • Attiva il gflags (Come si citato)
  • Avviare l'applicazione in versione modalità.
  • fissarlo al Windbg utilizzando l'opzione Attach to process in Windbg.
  • Configurare il percorso corretto per rilasciare PDBs.
  • Ricarica PPB utilizzando manualmente .reload /f in caso di automatica caricamento fallisce.
  • Eseguire il caso d'uso.

WinDbg sarebbe interrompere l'esecuzione quando si verifica un'eccezione. Per ogni eccezione prima occasione, analizzare le ragioni. Potrebbe essere uno dei più errori per incidente.

Altri suggerimenti

Prima di usare gflags / PageHeap vi suggerisco di controllare la presenza di un'eccezione di violazione di accesso. In primo luogo fissare il processo utilizzando Build-> Inizio Debug-> Attach to Process opzione. Una volta che è attaccata abilitare l'eccezione di violazione di accesso andando a Debug-> Eccezioni violazione seleziona Accesso e selezionare la casella di controllo di arresto sempre. Quindi verificare se il debugger cattura tutte le eccezioni di violazione di accesso.

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