2009-01-16 6 views
7

Questo è un bug abbastanza complicato, e ho provato a cercare in giro per trovare altre fonti di aiuto, ma per ragioni che non capisco, "Crash del programma in Vista" non è la query più utile.Debug di un arresto anomalo dopo l'uscita? (Dopo la restituzione del main)

Il problema che sto riscontrando è che il programma su cui sto lavorando - un software grafico di visualizzazione di dati multithread che utilizza OpenGL e l'API di Windows - si arresta in modo anomalo dopo il ritorno di WinMain(). Ho provato a passare attraverso la routine di spegnimento, nonché a guardare una traccia dello stack, e l'ultimo bit di codice che non è assembly è _crtExitProcess, dove si blocca nella chiamata ExitProcess (0) effettiva. Dopo di che, la traccia dello stack mostra kernel32.dll e quattro ntdll.dll, che è dove si blocca in realtà.

Questo errore si verifica solo su Vista e lo stesso codice esatto quando viene eseguito su XP viene chiuso normalmente. Non riesco davvero a pensare a qualcosa che possa aiutarmi a risolvere questo problema, e il debug di questo problema è qualcosa che non ho mai veramente imparato. Qualsiasi aiuto sarebbe apprezzato.

+0

Che cos'è esattamente l'eccezione? –

+0

0xC0000005 - Violazione di accesso. –

+0

Sei riuscito a eseguirlo sotto un debugger di memoria come se fosse stato purificato? Sembra un problema di memoria per me ... –

risposta

5

Ho fatto un po 'scavare intorno, e ho trovato un paio di post di tutto che suggeriscono che non sei l'unico che soffre di questo:

in particolare, il secondo è di interesse, dove Tom Chm menziona:

W Credo che abbiamo identificato la radice causa del nostro crash e l'aggiunta di un distruttore virtuale all'interfaccia sembra risolvere il nostro problema . Ma vorremmo conoscere la causa esatta dello schianto dello per verificare che non abbiamo solo spazzato il vero problema sotto il tappeto.

Il problema può riguardare un distruttore da qualche parte, o la sua mancanza. Se si dispone di un modo per collegare un debugger e passare attraverso il processo di spegnimento, potrebbe essere di aiuto.

Si potrebbe voler leggere l'intero thread e vedere se c'è qualcosa che si può imparare. Cioè, se non hai già trovato questi post nella tua ricerca, ovviamente.

+0

http://support.microsoft.com/kb/941833 Questo sembra molto pertinente, grazie! Non possiamo eseguire l'aggiornamento su questo computer perché è per un client, ma questo può essere qualcosa che possiamo dire loro di fare. Il bug sembra identico a quello che stiamo avendo. –

+0

Spero che tutto possa essere risolto in modo relativamente indolore - questo tipo di errore è il più difficile da capire. –

+0

come può il crash del programma solo perché manca un distruttore? non sarebbe solo perdita di memoria? –

3

Sembra un problema con un distruttore.

Verificare la presenza di oggetti danneggiati allo spegnimento. Questo sarà principalmente oggetti globali o statici. Guarda attentamente i loro distruttori per un caso di accesso a qualcosa che non è più valido. In un ambiente multi-thread, potrebbe essere una condizione di competizione, in cui un oggetto viene distrutto mentre un altro thread lo sta ancora utilizzando.

Provare a scrivere un registro man mano che gli oggetti vengono distrutti. per esempio.

SomeClass::~SomeClass() 
{ 
    WriteLog("Begin ~SomeClass()"); 
    // do whatever 
    WriteLog("End ~SomeClass()"); 
} 

WriteLog() dovrebbe aprire il file di registro, scrivere e chiudere il file per assicurarsi che il file viene svuotata. Usare un Mutex o una CriticalSection per evitare conflitti sarebbe una buona idea.

Guardare il registro dopo un incidente potrebbe darvi qualche indizio su cosa sta succedendo.

+0

Se questo è uno dei nostri distruttori, non apparirebbe nella traccia dello stack? Inoltre, quale sarebbe la differenza tra Vista e XP per questo? –

+0

I distruttori sono piuttosto specifici per C++. Saranno chiamati dal runtime C++. – MSalters

Problemi correlati