2010-05-05 12 views
5

Questo è pazzesco. Ha iniziato a succedere nel mio progetto principale, quindi ho creato un piccolo progetto campione nuovo di zecca per riprodurlo e abbastanza sicuro .. Non succede in un progetto di esempio che ho creato che è solo una app per console Win32.VS2008 C++ Violazione di accesso MFC SOLO quando si passa alla modalità di debug

Sto eseguendo su Win7x64, se questo è importante. VS2008 SP1.

Ecco qui. Creo una piccola app di dialogo con un pulsante. Inserire un punto di interruzione nella funzione di gestione per quel pulsante. La funzione di gestione dei pulsanti è simile al seguente:

void CTestProjectDlg::OnBnClickedButton1() 
{ 
    int i; 

    i = 2; // < breakpoint here 
    i = 3; 

} 

Fare clic sul pulsante, premere il punto di interruzione. F10 to step e boom: "Eccezione di prima volta a 0x0398f77b in TestProject.exe: 0xC0000005: violazione di accesso."

Mi dà la possibilità di interrompere o continuare. Se continuo, lo colpisce di nuovo, solo "First Chance". Sì, ho verificato tale eccezione nel debug-> Exceptions dlg.

Se si interrompe, lo stack di chiamate mostra solo la riga in cui si trova il punto di interruzione. Se I F10 di nuovo .. Ricevo di nuovo l'eccezione, solo ora il callstack mi mostra nella funzione _AfxDispatchCmdMsg() e il mio originale OnBnClickedButton1() non si trova più nel callstack.

Non importa dove ho inserito il punto di interruzione.

Se, invece di F10, continuo solo con F5, funziona normalmente.

Ora .. se creo una versione di rilascio ed eseguo in modalità di debug: ho raggiunto il punto di interruzione e tutti i puntatori, i valori delle variabili sembrano normali. F10, e questi si trasformano in spazzatura. Il puntatore è ora zero. L'm_csHello è ora

Tuttavia, in modalità di rilascio, non viene rilevata un'eccezione e tutto funziona correttamente. La stringa "Hello World viene visualizzata nella finestra di dialogo come dovrebbe."

Ho fatto una richiesta per vedere se alcune patch sono state installate sulla mia scatola dal reparto IT negli ultimi due giorni. .? accadendo 2 giorni fa

Cosa pensi sia VS2008 danneggiato

Grazie

Edit:?.. Informazioni aggiuntive Questo non succede se io costruisco/debug la piattaforma x64 Solo per Win32..
Ho anche dato un'occhiata a tutti gli hotfix/aggiornamenti di sicurezza per VS2008 sulla scatola. sono

Infine, ho messo il progetto su una macchina diversa, che non è stato aggiornato negli ultimi 2-3 settimane. Funziona trovare lì, e ha gli stessi aggiornamenti VS installati.

Ho anche modificato il codice che viene calpestato per lo scopo di questo post. .. Si tratta di un semplice compito intero, senza MFC coinvolto.

Al momento sono nel mezzo della reinstallazione di VS2008.

+0

Avete collegato il controllo (diciamo IDC_BUTTON1) come ON_BN_CLICKED (IDC2_BUTTON1, OnBnClcikedCutton1)? Potrebbe essere un problema. – Sunscreen

+0

Sì. È così che arriva al punto di interruzione, se capisco la tua domanda. – HotOil

+0

Nel codice, da qualche parte l'inizio è necessario collegare il controllo della vostra finestra di dialogo per la funzione rlated: BEGIN_MESSAGE_MAP (CTestProjectDlg, CDialog) ... ON_BN_CLICKED (IDC2_BUTTON1, OnBnClcikedCutton1) Puoi cercare il tuo codice cpp per "ON_BN_CLICKED"? È qui? – Sunscreen

risposta

1

Si dice che lo stesso progetto compila e gira perfettamente su una macchina diversa con la stessa versione di Visual Studio. Il codice sembra buono, quindi sì, sembra che VS 2008 sia danneggiato e debba essere reinstallato.

+0

Grazie per aver confermato il mio sospetto. Disinstallato tutto w/VS2008 nel nome. Quindi reinstallato. Problema andato. Ora reinstallando SP1. Vorrei sapere cosa lo ha causato. Non ho ancora avuto questo PC per 2 settimane. Temo che il team IT possa aver "sistemato" questo problema per me. Non so esattamente cosa evitare per evitare che accada di nuovo .. – HotOil

0

Se funziona in Release ma non esegue il debug, suppongo che tu abbia una variabile non inizializzata da qualche parte. In debug è automaticamente impostato su 0xcdcdcdcd (o una sua porzione parziale a seconda della dimensione variabile) che ti fa fallire in Release hai già un valore in memoria e forse quel valore gli impedisce di rompere ... Molto spesso un non inizializzato una variabile come questa viene usata come loop bound e in debug si scrive attraverso la memoria e si sovrascrive qualcosa di importante che può causare un errore LATER. Nel rilascio il valore sembra essere OK ma potrebbe non essere sempre il caso.

Per quanto riguarda il debug in rilascio, non preoccuparti che il valore sia nullo. Probabilmente non lo è, ma è molto difficile per il debugger dire esattamente dove sei in codice a causa del processo di ottimizzazione.

+0

Potrebbe essere il caso .. ma * I * non ha variabili !! Questa è una app di una sola finestra di dialogo generata da VS2008. L'unica cosa che ho aggiunto è il gestore di pulsanti. L'errore si verifica SOLO quando si passa sopra la riga successiva del codice. Senza farlo, non viene generata alcuna eccezione. – HotOil

0

La cosa intelligente da fare è (contro-intuitivamente) bloccare tutti i breakpoint e così via. Ricostruisci il tuo progetto (non una build incrementale). L'importante è iniziare da una lavagna pulita, catturare l'eccezione e ottenere uno stack di chiamate pulito e assicurarsi che la compilazione sia accurata dei file di origine. Dovresti anche disabilitare le intestazioni precompilate e così via.

1

Sto anche vivendo la stessa cosa, ancora sulla piattaforma di sviluppo Win7x64, VS2008 SP1. Il mio codice è C++, WTL, ATL, DirectShow e varie altre librerie.

Il registro di aggiornamento di Windows rivela che c'era un aggiornamento di Windows sulla mia macchina all'ora di pranzo. Il problema è iniziato solo dopo l'ora di pranzo, senza cambiamenti di progetto!

Accidenti a te e ai tuoi stupidi aggiornamenti automatici che rompono gli ambienti di sviluppo m $ !!! Vergogna a tutti voi!

6

Aveva lo stesso problema con VS2008 SP1, Win7x64, codice di debug in 32 bit. Il problema si annulla se spengo l'opzione

Strumenti -> Opzioni -> Debug -> Nativo -> Abilita debug RPC.

la seguente voce può essere correlato a questo: Debugging commands (step over/into) cause unhandled exceptions

+0

Ho appena ricevuto una nuova macchina, x64, e ho ricevuto un brutto bug da vecchio codice lordo da secoli fa, che avevo risolto un paio di bug un anno fa. Compilato, ho avuto delle eccezioni dall'aspetto spaventoso, ho pensato che fossero imparentati con il bug. Ci ho messo tutta la mattina per rendermene conto, no, è successo solo mentre stavo tentando di eseguire il debug, e solo se ho messo un punto di interruzione da qualche parte. La tua correzione ha funzionato perfettamente: la mia sanità mentale è stata ripristinata! (Ho ancora quel bug da correggere, ma sono contento che non sia stata una violazione di accesso in luoghi casuali che non avrebbe dovuto causare violazioni di accesso ...) – neminem

+1

Grazie per questa risposta, mi sono imbattuto in questo problema e cercato qui, questo lo aggiustava immediatamente (usando Visual Studio 2010). –

+0

Penso che questa sia la risposta; ora è stato risolto il problema per me su 5 macchine. Spiegherebbe perché anche la reinstallazione ha funzionato bene: questa opzione non è attiva per impostazione predefinita. – thomasmichaelwallace

Problemi correlati