Non sono sicuro di come eseguire il debug di questo. Ho un programma C# composto interamente da codice gestito, eseguito in .NET 4.5. Dopo averlo eseguito per un po ', in un momento apparentemente casuale, ricevo un errore "Un'eccezione non gestita di tipo' System.AccessViolationException 'si è verificata in mscorlib.dll". Dal momento che sono in esecuzione da Visual Studio (2012) clicco "break" e sono presentato con il seguente stack di chiamate:Violazione di accesso nel codice che non è mio
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
[email protected]() + 0xc bytes
[email protected]() + 0x4f bytes
[email protected]() + 0x2b bytes
[email protected]() + 0xf bytes
[email protected]() + 0x22 bytes
mdnsNSP.dll!7177aa48()
[Frames below may be incorrect and/or missing, no symbols loaded for mdnsNSP.dll]
mdnsNSP.dll!71775b06()
mdnsNSP.dll!71774ded()
mdnsNSP.dll!71774e8c()
bcryptprimitives.dll!746d1159()
bcryptprimitives.dll!746d1137()
[email protected]() + 0x14 bytes
[email protected]() + 0xc bytes
[email protected]() + 0xc bytes
[email protected]() + 0x1a bytes
Una cosa interessante che ho notato è che nulla nello stack di chiamate è il mio codice.
Quale strategia consiglieresti di utilizzare per trovare il percorso del problema? O hai visto un problema simile a questo e hai qualche consiglio?
Poiché l'eccezione non sembra includere il mio codice, non so quali informazioni includere che sarebbero utili nel rispondere alla domanda, ma chiedetemi se c'è qualcos'altro che dovrei includere.
Poiché l'errore può essere correlato IO (poiché PerformIOCompletionCallback è in cima alla pila), questo è un elenco delle attività tipiche IO quali l'applicazione esegue:
- TcpListener.AcceptTcpClientAsync
- NetworkStream. scrivere/BeginRead/EndRead
- SqlCommand.BeginExecuteReader/EndExecuteReader
- StreamWriter.WriteLine
Altre note:
- sembra essere grosso modo ripetibile - ottengo lo stesso errore nello stesso luogo (PerformIOCompletionCallback), ma devono aspettare una lunghezza diversa di tempo per farlo (nell'ordine di minuti) .
- Non penso di poter produrre un piccolo programma che evidenzia in modo affidabile il problema. Il mio programma gestisce molte migliaia di operazioni di I/O simili prima di raggiungere questo errore.
Edit:
Sulla base del suggerimento di @ Kevin che Mdnsnsp.dll è da Bonjour, ho disinstallato Bonjour e ha cercato di nuovo. L'eccezione persiste, ma lo stack di chiamate è molto più pulito:
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
[email protected]@12() + 0x12 bytes
[email protected]() + 0x27 bytes
[email protected]() + 0x1b bytes
Sto assumendo l'installatore Bonjour installato qualche DLL gancio benigna per il traffico di rete, ma disinstallazione non ha risolto il problema.
Edit:
ho temporaneamente ri-codificato tutti i miei unsafe
funzioni utilizzando lenti liquide "sicuri" per eliminare che come un sospetto. Ora nessuno degli assembly nell'applicazione è compilato utilizzando un interruttore non sicuro. Il problema persiste ancora. Per reiterare, ora non ho alcun codice non sicuro, nessun codice nativo e nessuna chiamata P/Invoke (nel codice utente) in questa applicazione, ma sto ancora vivendo il AccessViolationException
come descritto sopra.
Ti capita di avere l'opzione/3GB abilitata nel file boot.ini? Ricordo di aver ricevuto strani errori come questo su un sistema su cui ho lavorato. Sono giunto alla conclusione che il processo stava esaurendo le risorse che gestivano l'I/O a causa della ridotta memoria disponibile. –
Stai usando un codice 'non sicuro' o P/Invoke? | Tale errore si adatterebbe con il GC che sposta un po 'di buffer di cui ha ancora bisogno il codice nativo. – CodesInChaos
L'eccezione potrebbe essere generata dal codice non gestito che il codice gestito sta chiamando. [Abilita debugging codice non gestito] (http://msdn.microsoft.com/en-us/library/vstudio/tdw0c6sf%28v=vs.100%29.aspx) nella soluzione e quindi prova a eseguire il debug del programma. – keyboardP