No estoy seguro de cómo ir sobre la depuración de este. Tengo un programa de C# que consiste enteramente de código administrado que se ejecuta en .NET 4.5. Después de correr por un tiempo, en algunos aparentemente aleatorio de tiempo, me sale un error "excepción no controlada del tipo 'System.AccessViolationException' se ha producido en mscorlib.dll". Desde que yo estoy corriendo desde Visual Studio (2012) I haga clic en "pausa" y me presentó con la siguiente pila de llamadas:
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
ntdll.dll!_NtRequestWaitReplyPort@12() + 0xc bytes
kernel32.dll!_ConsoleClientCallServer@16() + 0x4f bytes
kernel32.dll!_GetConsoleLangId@4() + 0x2b bytes
kernel32.dll!_SetTEBLangID@0() + 0xf bytes
KernelBase.dll!_GetModuleHandleForUnicodeString@4() + 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()
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_NtTestAlert@0() + 0xc bytes
ntdll.dll!_NtContinue@8() + 0xc bytes
ntdll.dll!_LdrInitializeThunk@8() + 0x1a bytes
Una cosa interesante que me doy cuenta es que no hay nada en la pila de llamadas es mi código.
¿Qué estrategia le aconsejaría que uso para encontrar la ruta de el problema? O has visto un problema similar a este y algún consejo?
Ya que la excepción no parece incluir mi código, no sé qué información incluir, que podrían ser útiles para responder a la pregunta, pero me pregunta si hay algo más que debería incluir.
Ya que el error puede ser IO relacionados (desde PerformIOCompletionCallback es en la parte superior de la pila), esta es una lista de las típicas IO tareas que esta aplicación realiza:
- TcpListener.AcceptTcpClientAsync
- NetworkStream.Escribir/BeginRead/EndRead
- SqlCommand.BeginExecuteReader/EndExecuteReader
- StreamWriter.WriteLine
Otras notas:
- Parece ser aproximadamente repetible - me sale el mismo error en el mismo lugar (PerformIOCompletionCallback), pero tienen que esperar una diferente longitud de tiempo para hacerlo (en el orden de minutos).
- Yo no creo que pueda fabricar un pequeño programa que de forma fiable pone de relieve el problema. Mi programa maneja muchos miles de similar operaciones de e / s antes de que llegue a este error.
Editar:
Basada en la propuesta por @Kevin que Mdnsnsp.dll es de Bonjour, he desinstalado Bonjour y lo intentó de nuevo. La excepción persiste, pero la pila de llamadas es mucho más limpio:
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Estoy suponiendo que el Bonjour installer instalado algunos son benignos gancho de DLL para el tráfico de la red, pero su desinstalación no se soluciona el problema.
Editar:
He temporalmente re-codificado todos mis unsafe
funciones de uso más lento "seguro" equivalentes a eliminar a que, como a un sospechoso. Ahora ninguno de los ensamblados de la aplicación se compila utilizando inseguro interruptor. El problema aún persiste. Para reiterar, ahora no tengo código inseguro, no en código nativo y no P/Invoke llamadas (código de usuario) en esta aplicación, pero todavía estoy experimentando la AccessViolationException
como se describió anteriormente.