2010-11-02 24 views
91

Sto sperando che qualcuno mi può illuminare su cosa potrebbe causare questo errore:Tentativo di leggere o scrivere memoria protetta. Ciò è spesso un'indicazione che l'altra memoria è corrotta

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

non posso davvero scrivere codice, perché questo errore sembra avere gettato in qualsiasi area casuale dell'applicazione. L'applicazione verrà eseguita ovunque tra 12-48 ore prima di generare l'errore. A volte si fermerà in un punto apparentemente casuale e genererà l'errore sopra riportato, altre volte l'intera applicazione si interromperà e visualizzerò uno schermo con un errore che dice qualcosa sulla falsariga di "C'è stato un errore fatale in ... Questo potrebbe essere un errore bug nel CLR o ... "qualcosa su PInvoke o altre informazioni non pertinenti. Quando ciò accade, tutti i thread vengono terminati e non sono disponibili informazioni di debug.

In poche parole questo è ciò che fa la domanda:

sua un'applicazione multi-threaded server di scritto in interamente in C#. I client si connettono al server tramite socket. Il server esegue un "ambiente" virtuale per i clienti in cui possono interagire tra loro e con l'ambiente. Consuma un bel po 'di memoria, ma non vedo perdite. Normalmente consuma circa 1,5 GB. Non penso che perdi perché l'utilizzo della memoria rimane relativamente costante per tutto il tempo in cui l'applicazione è in esecuzione. Il suo codice costantemente in esecuzione per mantenere l'ambiente anche se i client non stanno facendo nulla. Non utilizza software di terze parti o altre API. Le uniche risorse esterne utilizzate da questa applicazione sono le connessioni socket e le connessioni al database SQL. Funziona su un server a 64 bit. Ho provato a debuggare questo in VS2008 & VS2010 utilizzando .net 2.0, 3.5 e 4.0 e su più server e il problema si verifica ancora alla fine.

Ho provato a disattivare le ottimizzazioni del compilatore e diverse correzioni rapide microsoft. Nulla sembra rendere questo problema andare via. Sarebbe gradito se qualcuno conoscesse qualche possibile causa, o un qualche tipo di modo per identificare che cosa causa il problema.

+0

per favore pubblica lo stack completo di chiamate ... –

+0

possibile duplicato di [Risoluzione dei problemi .NET "Errore Fatal Execution Engine"] (http://stackoverflow.com/questions/2823440/troubleshooting-net-fatal-execution-engine- errore) –

+0

Circa la metà delle volte non riesco a ottenere lo stack delle chiamate. Se lancia l'errore di esecuzione fatale non ci sono affatto informazioni di debug. Le volte che in realtà si ferma da qualche parte nel codice, nulla sembra anormale. Ho persino passato tutti i thread attivi e non ho visto nulla che potesse causare un conflitto. Suppongo che la corruzione della memoria sia avvenuta qualche tempo prima che l'errore venisse generato. –

risposta

18

Infine rintracciato con l'aiuto di WinDBG e SOS. La violazione di accesso veniva lanciata da qualche DLL sconosciuta. Si è scoperto un problema con il software chiamato "Nvidia Network Manager". Ho letto innumerevoli volte come questo problema possa essere causato da firewall o antivirus, nessuno dei quali sto usando, quindi ho respinto questa idea. Inoltre, ero convinto che non fosse ambientale perché si verifica su più di un server che utilizza hardware diverso. Risulta che tutte le macchine su cui ho provato erano in esecuzione "NVidia Network Manager". Credo che si installa con il resto dei driver della scheda madre.

Speriamo che questo aiuti qualcuno perché questo problema affligge la mia applicazione da molto tempo.

+81

Come è stato risolto il problema? – Coops

+2

come è stato risolto il problema? ho anche affrontato lo stesso .. –

+0

@CodeBlend, come hai risolto questo problema? – ABCmo

2

Questo problema è quasi invariabilmente semplice. Il codice è cattivo. Raramente sono gli strumenti, solo da un'analisi statistica. Ogni giorno milioni di persone utilizzano Visual Studio e forse alcuni usano il tuo codice - quale bit di codice sta ottenendo i test migliori? Garantisco che, se questo fosse un problema con VS, probabilmente lo avremmo già trovato.

L'affermazione significa che, quando si tenta di accedere alla memoria che non è la propria, di solito è perché lo si sta facendo con un puntatore danneggiato, proveniente da un'altra parte. Ecco perché sta indicando l'indicazione.

Con la corruzione della memoria, la cattura dell'errore si verifica raramente vicino alla causa principale dell'errore. E gli effetti sono esattamente ciò che descrivi, apparentemente casuali. Dovrai solo guardare i soliti colpevoli, cose come:

  • puntatori non inizializzati o altri valori.
  • scrittura di più su un buffer rispetto alle sue dimensioni.
  • risorse condivise da thread che non sono protetti da mutex.

Andando a ritroso da un problema come questo per trovare la causa principale è incredibilmente difficile dato che tanto possa essere accaduto tra la creazione del problema e l'individuazione del problema.

Io per lo trovo più facile avere uno sguardo a ciò è corrotto (per esempio, un puntatore specifico) e poi fare analisi statica manuale del codice per vedere quello che sarebbe potuto corrotto, controllando per i soliti colpevoli come mostrato sopra. Tuttavia, anche questo non colpirà lunghe catene di problemi.

Non conosco abbastanza bene VS per sapere ma si potrebbe anche voler esaminare la possibilità di utilizzare uno strumento di tracciamento della memoria (come valgrind per Linux) per vedere se può individuare eventuali problemi evidenti.

+3

È possibile ottenere un puntatore danneggiato anche dalla memoria danneggiata. Se ciò non avviene su un server con memoria ECC, provare un'utility di test della memoria con esecuzione prolungata per eliminare l'hardware come causa. – cdonner

+9

So che non è un problema hardware perché succede su più server. Grazie per aver indicato che c'è qualcosa di brutto nel codice, capitano ovvio. Non sto incolpando di studio visivo. Come affermato, l'applicazione funziona correttamente per un periodo di tempo casuale. Non è facile da riprodurre e ho cercato di identificare il problema per settimane. –

+4

@Someone Else: non credo che chiamare il nome possa aiutarti molto. –

3

Hai provato a disattivare DEP (Data Execution Prevention) per la tua applicazione?

+2

Non sono sicuro che sia una buona idea. Potrebbe ben ritardare l'incidente ma a costo di fare più danni. Penso che l'idea migliore, se stai andando in crash, è di bloccarti presto :-) – paxdiablo

+1

Disattivare DEP non è saggio, ma un utile esercizio diagnostico. – vcsjones

+0

No Non ho provato, ma a questo punto sono pronto a provare qualsiasi cosa ... –

3

Potrebbe essere hardware. Potrebbe essere qualcosa di complicato ... ma mi proverò a suggerire che da qualche parte il tuo codice di threading non protegge alcune raccolte (come un dizionario) con un lucchetto appropriato.

Che sistema operativo e pacchetto di servizio stai utilizzando?

+1

Esecuzione di XP 64 SP2. Questo è successo su più server però. Ho attraversato tutto così tante volte e non vedo nulla che non sia sicuro. Inoltre non otterrei un errore modificato della raccolta piuttosto che un viloation di accesso? –

2

Il codice verificabile non dovrebbe essere in grado di danneggiare la memoria, quindi c'è qualcosa di pericoloso in corso. Stai usando un codice non sicuro ovunque, ad esempio nell'elaborazione del buffer? Inoltre, le informazioni su PInvoke potrebbero non essere irrilevanti, poiché PInvoke implica una transizione verso il codice non gestito e il marshalling associato.

La mia migliore raccomandazione è quella di allegare a un'istanza arrestata e utilizzare WinDBG and SOS per scavare più in profondità in quello che succede al momento dello schianto. Questo non è per i deboli di cuore, ma a questo punto potrebbe essere necessario scovare strumenti più potenti per determinare cosa, esattamente, sta andando male.

+0

Indica PInvoke come possibile causa nel messaggio di errore. Non esiste un codice non sicuro. Proverò WinDBG. Grazie. –

5

Ho avuto questo problema di recente quando ho cambiato il server di sviluppo per un progetto. Stavo ricevendo questo errore sulla riga di codice in cui ho dichiarato una nuova variabile OracleConnection.

Dopo aver provato molte cose, compresa l'installazione di hotfix, ho provato a cambiare i riferimenti Oracle.DataAccess e System.Data.OracleClient nel progetto e ha funzionato!

Quando un progetto viene spostato su una nuova macchina, suggerisco di rinnovare tutti i riferimenti aggiunti in quel progetto.

3

Ho affrontato lo stesso problema. Il mio codice era una DLL .NET (estensione AutoCAD) in esecuzione in AutoCAD 2012. Sto anche utilizzando Oracle.DataAccess e il mio codice lanciava la stessa eccezione durante ExecuteNonQuery(). Ho fortunatamente risolto questo problema cambiando la versione .net dell'ODP che stavo usando (ovvero 2.x di Oracle.DataAccess)

+0

sto affrontando lo stesso problema - autocad .net dll - puoi approfondire quale fosse il problema e la correzione? – BKSpurgeon

5

Questo errore non dovrebbe accadere nel codice gestito.Questo potrebbe risolvere il problema:

Vai a Visual Studio Debugger per aggirare questa eccezione:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load" 

spero che sarà di aiuto.

+10

Non funziona affatto! – Nickon

+2

Mi dispiace che non abbia funzionato per te. Questo errore è stato sollevato per molte ragioni, ho pensato, la soluzione che ho postato potrebbe risolvere il problema per qualcun altro se il motivo è l'ottimizzazione JIT. – curiousBoy

29

Ho appena affrontato questo problema in VS 2013 .NET 4.5 con una DLL MapInfo. Risulta, il problema è stato che ho cambiato la piattaforma per costruire da x86 a qualsiasi CPU e che è stato sufficiente per far scattare questo errore. Cambiarlo di nuovo in x86 ha funzionato. Potrebbe aiutare qualcuno.

+0

come è stato modificato con x86. Sto solo facendo lo stesso problema con questa istruzione 'Blocco CSingleLock (& ​​m_csMember, TRUE);'. [Per maggiori dettagli, ecco il mio post] (http://stackoverflow.com/questions/22285044/error-additional-information-attempted-to-read-or-write-protected-memory-quest) – ABCmo

+0

In VS 2012/2013, vai su Proprietà progetto-> Costruisci e modifica "Target piattaforma" in base alle tue esigenze. Anche se penso che ci sia un altro posto in cui puoi cambiare questo, ma non riesco a trovarlo, penso che entrambi i modi * dovrebbero * ottenere lo stesso risultato. – Sergey

+0

In realtà sto usando VS 2013, ed è configurato come x86:/ – ABCmo

3

Ok, questo potrebbe essere abbastanza inutile e semplicemente aneddotica, ma ...

Questa eccezione è stata gettata in modo coerente con alcune librerie TWAIN32 stavamo usando nel mio progetto, ma sarebbe successo solo nella mia macchina.

Ho provato un sacco di soluzioni suggerite su Internet, senza alcun risultato ... Fino a quando non scollegato il mio cellulare (era collegato tramite USB).

E ha funzionato.

Risulta che le librerie Twain32 stavano cercando di elencare il mio telefono come dispositivo compatibile Twain e qualcosa che ha fatto in quel processo ha causato quell'eccezione.

vai a capire ...

0

La mia risposta molto dipende dal vostro scenario, ma abbiamo avuto un problema cercando di aggiornare un. Applicazione NET per un client che aveva> 10 anni in modo che potessero farlo funzionare su Windows 8.1. la risposta di @ alhazen è stata una specie di campo corretto per me. L'applicazione si basava su una DLL di terze parti che il cliente non voleva pagare per l'aggiornamento (Pegasus/Accusoft ImagXpress). Abbiamo ri-preso di mira la domanda di .NET 4.5, ma ogni volta che la seguente riga eseguita abbiamo ricevuto il messaggio AccessViolationException was unhandled:

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447); 

per risolvere il problema, abbiamo dovuto aggiungere il seguente evento post-generazione per il progetto:

call "$(DevEnvDir)..\tools\vsvars32.bat" 
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)" 

Questo specifica esplicitamente l'eseguibile come incompatibile con Data Execution Prevention. Per maggiori dettagli vedi here.

4

Mi sono imbattuto in e oggi ho trovato una soluzione a questa eccezione. Stava accadendo quando stavo cercando di eseguire il debug di un test unitario (NUnit) che chiamava un metodo virtuale su una classe astratta.

Il problema sembra essere con l'installazione di .NET 4.5.1.

Ho scaricato .NET 4.5.2 e installato (i miei progetti fanno ancora riferimento a .NET 4.5.1) e il problema è stato risolto.

Fonte della soluzione:

https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception

1

nel mio caso il file è stato aperto e quindi bloccato.

Stavo capendo quando ho provato a caricare un file Excel usando LinqToExcel che era stato aperto anche in Excel.

questo è tutto quello che deeded

var maps = from f in book.Worksheet<NavMapping>() 
       select f; 
    try { 
     foreach (var m in maps) 
      if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID)) 
       _mappings.Add(m.SSS_ID, m.CDS_ID); 
    } catch (AccessViolationException ex) { 
     _logger.Error("mapping file error. most likely this file is locked or open. " + ex); 
    } 
6

ho anche affrontato la questione con Visual Studio 2010. Più interessante, ho avuto diversi progetti nella mia soluzione (applicazione Console, un'applicazione WPF, Windows Form) ma era non riuscendo solo quando, stavo impostando il progetto che era di tipo "Applicazione Console" come progetto di avvio (anche per quelli che non avevano letteralmente codice o altri assembly riferiti a parte quelli predefiniti che vengono con il modello di progetto stesso).

Dopo il cambiamento, infine, mi ha aiutato a inchiodare il problema: Vai al progetto proprietà del progetto di applicazione di console -> Vai a Debug scheda -> Vai a Enable Debuggers sezione nel riquadro di destra -> Selezionare la casella Enable unmanaged code debugging di controllo, come mostrato nello snapshot sotto. La causa principale del perché è successo non è ancora nota a me. L'unica cosa che ho notato è che ci sono stati molti aggiornamenti di Windows che erano stati installati sulla mia macchina la notte precedente, costituiti principalmente da aggiornamenti dell'ufficio e aggiornamenti del sistema operativo (più di una dozzina di articoli della KB).

enter image description here

0

ho avuto anche questo problema. stavo facendo funzionare diverse soluzioni allo stesso tempo usando Visual Studio, quando chiudevo altre soluzioni ed eseguivo solo la soluzione di destinazione, funzionava bene senza quell'errore.

0

Ho ricevuto lo stesso errore in un progetto con cui stavo lavorando in VB.NET. Il controllo di "Abilita framework applicazione" nella pagina delle proprietà lo ha risolto per me.

6

Il problema potrebbe essere dovuto a DLL di piattaforme di generazione miste nel progetto. Io costruisci il tuo progetto su qualsiasi CPU ma hai alcune DLL nel progetto già costruito per la piattaforma x86. Questi causeranno arresti anomali casuali a causa della diversa mappatura della memoria dell'architettura a 32 bit e 64 bit. Se tutte le DLL sono costruite per una piattaforma, il problema può essere risolto.

Problemi correlati