2009-11-01 17 views
6

I utilizzando VS2008 e l'applicazione My MFC hanno iniziato a bloccarsi durante l'impostazione dei punti di interruzione o l'esecuzione del cursore. Ho un sacco di errori in questo modo: -Impossibile rintracciare la violazione di accesso 0xC00000FD

First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 

Lo stack di chiamate non è rimasto molto o si elenca solo il codice in NT.dll

> 00000000() 
    ntdll.dll!7c9032a8()  
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!7c90327a()  
    ntdll.dll!7c92aa0f()  
    ntdll.dll!7c90e48a()  
    ntdll.dll!7c9032a8()  

io non sono in grado di trovare il problema utilizzando punti di rottura o passo attraverso il mio codice. "Sembra" che l'applicazione funzioni normalmente se viene eseguita utilizzando F5 in VS.

Qual è il metodo migliore per rintracciare questo problema?

+0

Hai provato a abilitare tutte le eccezioni in VS? Ancora non lo prende? – Naveen

+0

Sì, ma dopo averlo fatto ottengo un'altra eccezione che ho risalito a destra dopo che è stato chiamato il domodal iniziale. La mia applicazione è basata su procedure guidate. Quando abilito tutte le eccezioni, ottengo il problema originale come pubblicato. – Paul

+0

Fare clic con il tasto destro sugli stackframes e caricare i simboli per ntdll. Non risolverà nulla, ma più informazioni non possono ferire. – sisve

risposta

5

Dove si trova lo stack traboccante dal titolo della domanda? Le violazioni di accesso indicano generalmente un dereferenziamento del puntatore non valido.

Usa la tua cronologia delle revisioni per trovare la prima versione in cui le cose cominciarono ad andare braccio, quindi analizzare criticamente tutta roba puntatore accade dentro e intorno al codice modificato in quella revisione.

+0

Typo dovrebbe essere violazione di accesso nel titolo. Potrei farlo e ci ho pensato, ma in questa fase l'app ha molti mesi di lavoro. Speravo che ci sarebbe stato un modo più rapido, ma se non fosse stato abbastanza giusto. – Paul

+0

Se ci sono molti mesi di lavoro, si sta utilizzando un sistema di controllo del codice sorgente, giusto? Altrimenti, inizia a farlo * adesso *. Sul serio. – Thomas

+0

Sì. Ho usato TortoiseSVN sin dall'inizio. – Paul

0

Visual Studio ha un'opzione da qualche parte per rompere sull'eccezione di prima scelta (non ricordo esattamente dove si trova, forse una voce di menu di eccezione nel sottomenu di debug?) Si desidera accenderlo e osservare le pile di chiamate. momento in cui si verificano

Esiste anche un'opzione per attivare Microsoft Symbol Server, che scaricherà automaticamente i simboli corrispondenti per qualsiasi DLL di sistema che si vede nello stack. (mi dispiace, non ricordo come sia esattamente la configurazione).

+0

È sotto Debug | Eccezioni | Eccezioni Win32. L'eccezione di cui sopra sembra stranamente familiare alla dereferenziazione del puntatore nullo. – MP24

2

Userò le mie abilità di debug psichico e ti dirò che stai sovrascrivendo un buffer che vive in pila - in particolare, stai scrivendo troppi zeri in un buffer che non è abbastanza grande per tenerlo.

Hai i classici sintomi di uno stack distrutto: il primo AV che hai colpito sta tentando di accedere a zero meno pochi byte, chiaramente un offset dal puntatore dello stack nei parametri o nelle variabili locali. (Non riesco mai a ricordare quali sono sopra il puntatore dello stack e quali sono sotto.) Quindi ci sono un sacco di linee che indicano che il puntatore dell'istruzione è stato impostato su zero, che spesso accade perché gli indirizzi di ritorno della funzione nei frame dello stack hanno stato sovrascritto con valori zero - perché sovrascrivi il buffer basato sullo stack e danneggiato tutte le altre cose importanti nello stack. Mentre il tuo programma tenta di tornare dalla funzione corrente, guarda nello stack per vedere da dove pensa di provenire, vede lo zero e salta proprio lì. Ops!

Dato che il tuo stack è stato eliminato dal cestino, potresti non trovare troppo utile la traccia dello stack; i tuoi telai dello stack sono probabilmente danneggiati da questo punto.

2

Ci sono alcuni "modelli" sul web che un certo uso per fare i loro programmi di Windows Invece di questo WndProc()

case WM_CLOSE: 
    PostQuitMessage(SUCCESS); 
    break; 
case WM_DESTROY: 
    DestroyWindow(hwnd); 
    break; 

otteniamo questo:

case WM_CLOSE: 
    DestroyWindow(hwnd); 
    break; 
case WM_DESTROY: 
    PostQuitMessage(SUCCESS); 
    break; 

Se SUCCESS è 0, DestroyWindow() ottiene un puntatore nullo che produce un'eccezione quando la finestra viene chiusa.

Problemi correlati