22 votos

Infracción de acceso en código que no es lo mio

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.

3voto

shimpossible Puntos 101

Desde su PerformIOCompletionCallback que está causando el error mire IO asincrónica llamadas.

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

El error parece estar sucediendo porque el mango que fue registrado ya no es válido. Puesto que está sucediendo en código administrado que la causa va a ser de un objeto administrado y no de un 3er partido DLL nativa.

2voto

Mihail Puntos 1559

no sé si se puede ayudar, pero parece que hemos tenido un problema similar hace varios años. Como recuerdo de nuestra investigación señaló que en dll en otro programa - se encontró que el acceso a la memoria de las violaciones puede ser causada por los antivirus (NOD32 en nuestro caso), firewalls o rastreadores de red/controladores de tráfico.

Trate de revisar las solicitudes de registro (Panel de Control -> Sistema y Seguridad -> Herramientas Administrativas -> Visor de Sucesos) por los errores causados por aplicaciones anteriores. Si el problema es con otro programa que pruebe a deshabilitar/desinstale y vuelva a comprobar si el accidente todavía aparece en su programa.

La UPD Ha intentado reproducir este problema en la limpieza del entorno de prueba?

1voto

Ian Puntos 52

Podría usar debugdiag para ver lo que está causando la AccessViolationException en su máquina. Configurar una regla de bloqueo para su proceso y examinar los archivos de registro y descarga. Espero que de esa manera obtendrá más información sobre el tema. También asegúrese que la máquina ejecute las actualizaciones más recientes de windows ya que tuve un problema similar que fue solucionado en una actualización de seguridad para la versión CLR.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X