2013-01-17 21 views
23

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.

+0

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. –

+3

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

+0

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

risposta

1

È possibile utilizzare debugdiag per vedere che cosa causa AccessViolationException sulla macchina. Configurare una regola di arresto anomalo per il processo ed esaminare i file di dump e di registro.Spero che riceverai più informazioni sull'argomento in questo modo. Assicurati inoltre che la tua macchina esegua gli ultimi aggiornamenti di Windows. Bcos Ho riscontrato un problema simile risolto in un aggiornamento di sicurezza per la versione CLR.

2

non so se può aiutarti ma sembra che abbiamo affrontato un problema simile diversi anni fa. Poiché ricordo che le nostre indagini puntavano su dll in altri programmi, abbiamo rilevato che le violazioni di accesso alla memoria possono essere causate da antivirus (NOD32 nel nostro caso), firewall o sniffer di rete/controllori del traffico.

Provare a controllare il registro delle applicazioni (Pannello di controllo -> Sistema e sicurezza -> Strumenti di amministrazione -> Visualizzatore eventi) per gli errori causati dalle applicazioni di cui sopra. Se il problema è con un altro programma, prova a disabilitarlo/disinstallarlo e controlla di nuovo se il crash continua a comparire nel tuo programma.

UPD Hai provato a riprodurre questo problema nell'ambiente di test pulito?

+0

Non ho il tempo di configurare un ambiente di test pulito. Ma ho sperimentato che sembra solo verificarsi quando il debugger è collegato. – Mike

3

Poiché il suo PerformIOCompletionCallback causa l'errore, guarderei le mie chiamate IO asincrone.

  • TcpListener.AcceptTcpClientAsync
  • NetworkStream.Write/BeginRead/EndRead
  • SqlCommand.BeginExecuteReader/EndExecuteReader

L'errore sembra accadere perché il manico che è stato registrato non è più valido. Poiché sta accadendo nel codice gestito, la causa sarà da un oggetto gestito e NON da una DLL nativa di terze parti.

+0

Cosa intendi con "maniglia"? Se ti riferisci ad un handle di oggetti Windows, allora non è qualcosa che il framework .net dovrebbe controllare per me? Non ho alcuna "DLL nativa di terze parti", quindi non ho mai sospettato che questo fosse il problema. – Mike

+0

Esempi di cosa significa shimp ... Qualsiasi flusso di lettura/scrittura della porta aperta che è stato chiuso/eliminato e quindi utilizzato può causare questo ... o eseguire troppe operazioni sulla porta contemporaneamente. Inoltre, tieni presente che l'uso di una richiamata asincrona ritarderà qualsiasi errore fino a quando EndXxxx non viene chiamato ... – andrew