protegida memoria leer intento escribir catch accessviolationexception c# .net access-violation

c# - memoria - Violación de acceso en código que no es mío.



catch accessviolationexception (3)

Desde su PerformIOCompletionCallback que está causando el error, vería sus llamadas de E / S asíncronas.

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

El error parece estar ocurriendo porque el identificador que se registró ya no es válido. Como ocurre en el código administrado, la causa será de un objeto administrado y NO de un DLL nativo de terceros.

No estoy seguro de cómo hacer para depurar esto. Tengo un programa C # que consiste completamente en código administrado, ejecutándose en .NET 4.5. Después de ejecutarlo por un tiempo, en un momento aparentemente aleatorio, aparece un error "Se produjo una excepción no controlada de tipo ''System.AccessViolationException'' en mscorlib.dll". Como lo estoy ejecutando desde Visual Studio (2012), hago clic en "romper" y aparece 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 observo es que nada en la pila de llamadas es mi código.

¿Qué estrategia me aconsejarías usar para encontrar la ruta del problema? ¿O has visto un problema similar a este y tienes algún consejo?

Dado que la excepción no parece incluir mi código, no sé qué información incluir sería útil para responder la pregunta, pero pregúnteme si hay algo más que deba incluir.

Dado que el error puede estar relacionado con IO (ya que PerformIOCompletionCallback está en la parte superior de la pila), esta es una lista de tareas típicas de IO que realiza esta aplicación:

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

Otras notas:

  • Parece ser más o menos repetible. Recibo el mismo error en el mismo lugar (PerformIOCompletionCallback), pero tengo que esperar un tiempo diferente para obtenerlo (en el orden de minutos).
  • No creo que pueda fabricar un pequeño programa que resalte el problema de manera confiable. Mi programa maneja muchos miles de operaciones de E / S similares antes de que llegue a este error.

Editar:

De acuerdo con la sugerencia de @Kevin de que Mdnsnsp.dll es de Bonjour, desinstalé Bonjour y lo intenté de nuevo. La excepción persiste, pero la pila de llamadas es mucho más limpia:

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

Supongo que el instalador de Bonjour instaló un DLL de enlace benigno para el tráfico de red, pero desinstalarlo no solucionó el problema.

Editar:

He re-codificado temporalmente todas mis funciones unsafe usando equivalentes más "seguros" para eliminar eso como sospechoso. Ahora, ninguno de los ensamblajes en la aplicación se compila usando un interruptor no seguro. El problema aún persiste. Para reiterar, ahora no tengo ningún código no seguro, ningún código nativo ni llamadas P / Invoke (en el código de usuario) en esta aplicación, pero todavía estoy experimentando la AccessViolationException como se describe anteriormente.


No sé si puede ayudarlo, pero parece que enfrentamos un problema similar hace varios años. Como recuerdo, nuestra investigación señaló sobre dll en otro programa: descubrimos que las violaciones de acceso a la memoria pueden ser causadas por los antivirus (NOD32 en nuestro caso), los firewalls o los detectores / controladores de red.

Intente verificar el registro de aplicaciones (Panel de control -> Sistema y seguridad -> Herramientas administrativas -> Visor de eventos) para ver si hay errores causados ​​por las aplicaciones anteriores. Si el problema es con otro programa, intente deshabilitarlo / desinstalarlo y verifique nuevamente si el bloqueo sigue apareciendo en su programa.

UPD ¿Ha intentado reproducir este problema en el entorno de prueba limpio?


Podría usar debugdiag para ver qué está causando la excepción AccessViolationException en su máquina. Configure una regla de fallo para su proceso y examine los archivos de volcado y registro. Espero que obtenga más información sobre el tema de esa manera. Asegúrese también de que su máquina ejecute las actualizaciones de Windows más recientes. Bcos, tuve un problema similar que se resolvió en una actualización de seguridad para la versión CLR.